JavaScript

【Cognito】getSessionでトークン情報を再取得する方法

2020年8月17日

はじめに

JavaScript用のSDKでAmazon Cognitoのユーザープールを使いログイン処理を実装し、ログインに成功すると「アクセストークン」や「IDトークン」などが取得できます。

ただ、この「アクセストークン」や「IDトークン」には有効期限(デフォルトの設定は1時間と短い)があり、有効期限が切れるとトークン情報は無効になってしまいます。

そこで、更新トークン(refreshToken)を使い、トークン情報を再取得することができます。※JavaScript用のSDKでは「getSession」を使うことで、トークン情報を再取得することができます。

スポンサーリンク

【JavaScript SDK】getSessionでトークン情報を再取得する方法

ログイン時の処理(authenticateUser)

以下はログイン時の処理の例です。

function login() {
    var poolData = {
            UserPoolId : 'ユーザープールID',
            ClientId : 'クライアントID'
    };

    var username = "画面で入力されたユーザー名";
    var password = "画面で入力されたパスワード";

    var authenticationData = {
        Username : username,
        Password : password,
    };
    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username : username,
        Pool : userPool
    };

    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            alert("ログイン成功");

            // アクセストークン
            sessionStorage.setItem('accessToken', result.accessToken.jwtToken);
            // アクセストークの有効期限
            sessionStorage.setItem('accessToken.payload.exp', result.accessToken.payload.exp);
            // IDトークン
            sessionStorage.setItem('idToken', result.accessToken.payload.exp);
            // 更新トークン
            sessionStorage.setItem('refreshToken', result.refreshToken.token);
            // ユーザー名
            sessionStorage.setItem('username', result.accessToken.payload.username);

            // ログイン時の処理を書く...

        },

        onFailure: function(err) {
            alert("ログイン失敗");

            // ログイン失敗時の処理を書く...
        },
    });
}

トークン情報の再取得(getSession)

以下は「getSession」を使い、トークン情報を再取得する例です。

「getCurrentUser」で使用中のユーザープールが取得できるので、使用中のユーザープールを取得後、「getSession」を使いトークン情報を再取得しています。

function checkUpdateToken() {
    var poolData = {
            UserPoolId : 'ユーザープールID',
            ClientId : 'クライアントID'
    };

    // ログイン時に保管していたアクセストークンの有効期限
    var exp = sessionStorage.getItem('accessToken.payload.exp') * 1000;
    var now = new Date().getTime();

    // アクセストークの有効期限が切れていた場合
    if (now > exp) {
        var userPool = AmazonCognitoIdentity.CognitoUserPool(poolData);
        var cognitoUser = userPool.getCurrentUser();

        if (cognitoUser) {
            cognitoUser.getSession(function (err, session) {
                if (session.isValid()) {
                    // アクセストークン
                    sessionStorage.setItem('accessToken', session.accessToken.jwtToken);
                    // アクセストークの有効期限
                    sessionStorage.setItem('accessToken.payload.exp', session.accessToken.payload.exp);
                    // IDトークン
                    sessionStorage.setItem('idToken', session.accessToken.payload.exp);
                    // 更新トークン
                    sessionStorage.setItem('refreshToken', session.refreshToken.token);
                    // ユーザー名
                    sessionStorage.setItem('username', session.accessToken.payload.username);
                }
            });
        }
    }
 }

本来であれば、更新トークン(refreshToken)を使用して、トークン情報を取得する必要がありますが、JavaScript SDKでは「getSession」を呼び出すことで新しいトークン情報を取得してくれます。(トークン情報が無効な場合、更新トークン(refreshToken)を使用してトークン情報を再取得してくれる)

 

「getSession」ではなく、更新トークン(refreshToken)を使用する場合は「refreshSession」でトークン情報を再取得することもできます。

function checkUpdateTokenRefresh() {
    var poolData = {
            UserPoolId : 'ユーザープールID',
            ClientId : 'クライアントID'
    };

    // ログイン時に保管していたアクセストークンの有効期限
    var exp = sessionStorage.getItem('accessToken.payload.exp') * 1000;
    var now = new Date().getTime();

    // アクセストークの有効期限が切れていた場合
    if (now > exp) {
        ar username = sessionStorage.getItem('username');
        var token = sessionStorage.getItem('refreshToken');

        // ユーザープールの生成
        var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
        var userData = { Username : username, Pool : userPool };
        var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

        // 更新トークンの設定
        var refreshToken = new AmazonCognitoIdentity.CognitoRefreshToken({RefreshToken: token});

        // トークン情報更新
        cognitoUser.refreshSession(new RefreshToken(), function (err, session){
            if (session.isValid()) {
                // アクセストークン
                sessionStorage.setItem('accessToken', session.accessToken.jwtToken);
                // アクセストークの有効期限
                sessionStorage.setItem('accessToken.payload.exp', session.accessToken.payload.exp);
                // IDトークン
                sessionStorage.setItem('idToken', session.accessToken.payload.exp);
                // 更新トークン
                sessionStorage.setItem('refreshToken', session.refreshToken.token);
                // ユーザー名
                sessionStorage.setItem('username', session.accessToken.payload.username);
            }
        });
    }
}

終わりに

本記事では、「getSession」でトークン情報を再取得する方法を紹介しました。

次回はJavaScript SDKでパスワードを変更する方法を紹介します。

[AWS 関連記事]

helpful