使用 javascript v2 在浏览器中刷新 AWS Cognito 访问令牌工作流程

问题描述 投票:0回答:1

我有一个简单的网络应用程序(我不是真正的开发人员),它是基于 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 以查看是否需要刷新令牌?

javascript amazon-web-services amazon-cognito aws-amplify
1个回答
0
投票

我也遇到了同样的问题。我所做的是—— 当我需要使用 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)
...
© www.soinside.com 2019 - 2024. All rights reserved.