目次
はじめに
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でログイン処理を実装する方法
