web-dev-qa-db-ja.com

AWSCognito-無効な更新トークン

Amazon Cognito サービスを Amazon-cognito-identity-js ライブラリで使用していますが、ユーザーのトークン、つまりidトークンの更新で問題が発生しています。

認証されていない initiateAuth リクエストを作成してユーザートークンを更新しようとすると、「無効な更新トークン」エラーメッセージとともに400httpステータスが返されます。

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)
    })

}

余談ですが、refreshSession()を使用してみましたが、getToken()はrefreshSession()の関数ではないことがわかります。

cognitoUser.refreshSession(reToken, (err, authResult) => {
    if (err) throw err;
    console.log(authResult)
});
9
Crayons

私は答えを見つけました。

結局のところ、これは実際には無効な更新トークンではありませんでした。少なくともオブジェクト自体の意味では。

デバイス追跡を有効にしている場合は、ユーザーデバイスキーを渡す必要があります)AuthParameters(私はしていませんでした)。

デバイス追跡の説明を ここにあります と読みましたが、ユースケースに当てはまらないようだったので、単にオフにしました([ユーザープール]> [デバイス])。

上記のコードはその後機能しました。

17
Crayons