目次
はじめに
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 関連記事]
- Amazon Cognito ユーザープールの使い方
- Amazon Cognito IDプールの使い方
- Amazon S3へファイルをアップロードする方法
- Amazon S3からファイルをダウンロードする方法
- 【Amazon Cognito】JavaScriptでログイン処理を実装する方法