我有一个简单的网络应用程序(我不是真正的开发人员),它是基于 this 教程的。我所做的一切都是用纯 JavaScript(无 React 等)编写的,并部署到 git 存储库,并在用户浏览器上运行 .js 文件。
一切都已配置并完美运行,但现在我正在尝试扩展功能。我面临的问题是,用户可以在单个页面上花费超过 60 分钟(一些使用访问令牌验证的 Websocket 和 API 交互),并且访问令牌将过期。我相信通过正常的 SDK 操作不会刷新,因为它们始终保持在同一页面上。
鉴于此,我正在尝试找到一种解决方案来检查令牌是否需要刷新,并在接近过期时间时刷新它。我尝试从here实现用例32,但似乎无法让它工作。该代码片段引用了
AWS.config.credentials.needsRefresh()
,但 AWS-sdk .js 文件未包含在我开始的原始存储库中。我尝试下载最新的 v2 AWS-sdk .js 文件,并在 AWS-cognito-sdk .js 中识别类似的 needRefresh 函数,但无济于事。
奇怪的是,当我尝试检查needsRefresh时,它会抛出以下错误
console.log('config' in AWS) --> True
console.log('credentials' in AWS.config) --> True
console.log('needsRefresh' in AWS.config.credentials) --> Uncaught TypeError: Cannot use 'in' operator to search for 'needsRefresh' in null
是否还有另一种方法:1)使用与上述用例类似的方法检查令牌是否需要刷新,或者 2)手动检查 JwtToken 以查看是否需要刷新令牌?
我也遇到了同样的问题。我所做的是—— 当我需要使用 ID 令牌或访问令牌时,请检查“exp”声明。 “exp”是 Unix 刻度,如 1711857130,它是自 1970 年 1 月 1 日以来经过的秒数。它指定令牌何时过期。
我只是检查当前时间是否在exp之前20秒,如果是,我使用缓存的令牌;如果没有,我使用刷新令牌来获取新令牌。
我用 C# 编码,我相信你可以用 javascript 做同样的事情。
protected IEnumerable<System.Security.Claims.Claim> ParseToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
if (securityToken == null)
throw new Exception("invalid token");
return securityToken.Claims;
}
var claims = ParseToken(tokens.id_token);
var claimsDic = claims.ToDictionary(c => c.Type, c => c.Value);
...
authToken.ExpUnixTicks = Convert.ToInt32(claimsDic.GetStringOrDefault("exp", ""))
//check if the token is expiring
if(authToken.ExpUnixTicks >= DateTimeOffset.Now.ToUnixTimeSeconds() + 20)
...