AWS Cognito - 无效的刷新令牌

Cra*_*ons 7 javascript amazon-web-services amazon-cognito

我正在使用Amazon Cognito服务和amazon-cognito-identity-js库,并且在刷新用户令牌时遇到问题,即id令牌.

当尝试通过发出未经身份验证的initiateAuth请求来刷新用户令牌时,我会收到400 http状态作为响应,以及"无效刷新令牌"错误消息.

POST https://cognito-idp.us-east-1.amazonaws.com/ 400(错误请求)

未捕获的错误:无效的刷新令牌.

为什么它认为我传递了无效的刷新令牌?

// the refresh token
var reToken;

// pool config
var poolData = {
    UserPoolId : 'us-east-1_XXXXXXXXX',
    ClientId : 'XXXXXXXXXXXXXXXXXXXXXXXXXX'
};

// connect to user pool and 
// find the current user
var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
var cognitoUser = userPool.getCurrentUser();

// if we found a user
if (cognitoUser != null)
{
    // get active user session
    cognitoUser.getSession(function(err, session)
    {
        // catch errors
        if (err) {
            alert(err);
            return;
        }

        // get the refresh token
        reToken = session.refreshToken.token;
    });
}

// get current epoch time
var curDate = new Date();
var currentEpoch = Math.round(curDate.getTime() / 1000);

// get the epoch when the token
// was last issued
var issuedEpoch = store.get('issued');

// set the refresh parameters
var refreshParams = {
    ClientId: 'XXXXXXXXXXXXXXXXXXXXXXXXXX',
    AuthFlow: 'REFRESH_TOKEN_AUTH',
    AuthParameters: { 'REFRESH_TOKEN': reToken }
};

// note: 30 minutes = 1800 seconds
// if a token was last issued over 30 minutes ago
if ( (currentEpoch - issuedEpoch) >= 1800 )
{
    // refresh the users token with a new token
    userPool.client.makeUnauthenticatedRequest('initiateAuth', refreshParams, (err, newToken) => {
        // catch errors
        if (err) {
            alert(err);
            return;
        }

        // do stuff with the returned token
        console.log(newToken)
    })

}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我尝试使用refreshSession(),但它告诉我getToken()不是refreshSession()的函数.

cognitoUser.refreshSession(reToken, (err, authResult) => {
    if (err) throw err;
    console.log(authResult)
});
Run Code Online (Sandbox Code Playgroud)

Cra*_*ons 18

我找到了答案.

事实证明,它实际上并不是一个无效的刷新令牌; 至少在物体本身的意义上.

如果您启用了设备跟踪,则必须在AuthParameters中传递用户设备密钥(我没有这样做).

我阅读了设备跟踪的说明,如此处所示,它似乎不适用于我的用例,所以我只是将其关闭(用户池>设备).

上面的代码在那之后工作了.

  • 谢谢蜡笔!奇迹般有效。令人惊讶的是 AWS 如何发送这样的误导性错误 (8认同)