
Cognitoの更新トークンによるID再取得の仕様がよく分からないんだよね。。
こんな悩みを解決します。
- 本記事の内容
- Cognitoトークンの種類について
- 更新トークンを用いたIDトークン再取得処理について
- 本記事の執筆者
プロフィール


- 元エンジニア(歴7年)、資格保有数約20個(IT系以外も含む)
- 物販月利50万円⇒脱サラ
- 物販、システム開発、アフィリエイト、プログラミング、投資をやっています。
- 物販は彼女と楽しみながらやっています!
今回は、Cognitoの更新トークンによるIDトークン再取得処理について解説します。



すぐ読み終わるので、是非最後まで読んでみてください!
よく読まれている記事はこちら!
目次
Cognitoのトークンの種類
Cognitoのトークンは3種類あります。
- IDトークン
- アクセストークン
- 更新トークン
IDトークンの有効期限は「1時間」ですが、更新トークンによってIDトークンは再取得されるため、更新トークンが切れない限り、IDトークンは切れないということになります。
Cognitoの更新トークンはマネージメントコンソールから設定を変更できます。デフォルトは「30日」です。
更新トークンを用いたIDトークン再取得処理
下記は、更新トークンを用いたIDトークン再取得処理のソースコードになります。
/**
* This is used to get a session, either from the session object
* or from the local storage, or by using a refresh token
*
* @param {nodeCallback<CognitoUserSession>} callback Called on success or error.
* @returns {void}
*/
getSession(callback) {
if (this.username == null) {
return callback(new Error('Username is null. Cannot retrieve a new session'), null);
}
if (this.signInUserSession != null && this.signInUserSession.isValid()) {
return callback(null, this.signInUserSession);
}
const keyPrefix = `CognitoIdentityServiceProvider.${this.pool.getClientId()}.${this.username}`;
const idTokenKey = `${keyPrefix}.idToken`;
const accessTokenKey = `${keyPrefix}.accessToken`;
const refreshTokenKey = `${keyPrefix}.refreshToken`;
const clockDriftKey = `${keyPrefix}.clockDrift`;
if (this.storage.getItem(idTokenKey)) {
const idToken = new CognitoIdToken({
IdToken: this.storage.getItem(idTokenKey),
});
const accessToken = new CognitoAccessToken({
AccessToken: this.storage.getItem(accessTokenKey),
});
const refreshToken = new CognitoRefreshToken({
RefreshToken: this.storage.getItem(refreshTokenKey),
});
const clockDrift = parseInt(this.storage.getItem(clockDriftKey), 0) || 0;
const sessionData = {
IdToken: idToken,
AccessToken: accessToken,
RefreshToken: refreshToken,
ClockDrift: clockDrift,
};
const cachedSession = new CognitoUserSession(sessionData);
if (cachedSession.isValid()) {
this.signInUserSession = cachedSession;
return callback(null, this.signInUserSession);
}
if (!refreshToken.getToken()) {
return callback(new Error('Cannot retrieve a new session. Please authenticate.'), null);
}
this.refreshSession(refreshToken, callback);
} else {
callback(new Error('Local storage is missing an ID Token, Please authenticate'), null);
}
return undefined;
}
ライブラリの「CognitoUser.js」というファイルに「refreshSession」という関数を呼び出している箇所があります。
/**
* This uses the refreshToken to retrieve a new session
* @param {CognitoRefreshToken} refreshToken A previous session's refresh token.
* @param {nodeCallback<CognitoUserSession>} callback Called on success or error.
* @returns {void}
*/
refreshSession(refreshToken, callback) {
const authParameters = {};
authParameters.REFRESH_TOKEN = refreshToken.getToken();
const keyPrefix = `CognitoIdentityServiceProvider.${this.pool.getClientId()}`;
const lastUserKey = `${keyPrefix}.LastAuthUser`;
if (this.storage.getItem(lastUserKey)) {
this.username = this.storage.getItem(lastUserKey);
const deviceKeyKey = `${keyPrefix}.${this.username}.deviceKey`;
this.deviceKey = this.storage.getItem(deviceKeyKey);
authParameters.DEVICE_KEY = this.deviceKey;
}
const jsonReq = {
ClientId: this.pool.getClientId(),
AuthFlow: 'REFRESH_TOKEN_AUTH',
AuthParameters: authParameters,
};
if (this.getUserContextData()) {
jsonReq.UserContextData = this.getUserContextData();
}
this.client.request('InitiateAuth', jsonReq, (err, authResult) => {
if (err) {
if (err.code === 'NotAuthorizedException') {
this.clearCachedUser();
}
return callback(err, null);
}
if (authResult) {
const authenticationResult = authResult.AuthenticationResult;
if (!Object.prototype.hasOwnProperty.call(authenticationResult, 'RefreshToken')) {
authenticationResult.RefreshToken = refreshToken.getToken();
}
this.signInUserSession = this.getCognitoUserSession(authenticationResult);
this.cacheTokens();
return callback(null, this.signInUserSession);
}
return undefined;
});
}
「refreshSession」の内容です。
この処理で、「更新トークンを用いたIDトークン再取得処理」を行っています。
まとめ
今回は、Cognitoの更新トークンによるIDトークン再取得処理について解説しました。
実際のライブラリを見ると処理の詳細が掴めるのでスッキリしますね。
ではまた!
- 関連記事
あわせて読みたい




Cognitoのセッションタイムアウト!トークンを整理してみた!
Cognitoのセッションタイムアウトについて詳しく知りたいんだけど教えてもらえないかな? こんな疑問にお答えします。 本記事の内容 Cognitoのセッションタイムアウトに…
あわせて読みたい




【まとめ】Cognitoから返却されるエラー集!
Cognitoから返却されるエラーの一覧が見たいんだけど、情報がどこにもないんだよね。。 こんな悩みを解決します。 本記事の内容 Cognitoから返却されるエラー集 本記事…
あわせて読みたい




Cognitoのアカウントロック!ロックアウトされない?!
Cognitoのアカウントロックの仕様が分からないんだよね。。 こんな悩みを解決します。 本記事の内容 Cognitoのアカウントロックの仕様について 本記事の執筆者 今回は、…
あわせて読みたい




【Cognito】トークンのペイロードをデコードする方法!
Cognitoのトークンのペイロードをデコードする方法が分からないんだよね。。 こんな悩みを解決します。 本記事の内容 Cognitoのトークンのペイロードをデコードする方法…
あわせて読みたい




【Cognito】更新トークンが切れた際のレスポンス!
Cognitoの更新トークンが切れた場合って、レスポンスはどうなるのかな? こんな疑問にお答えします。 本記事の内容 Cognitoの更新トークンが切れた場合のレスポンス 本…
- 自由な生き方がしたいなら!
自由な生き方をするためには、稼ぐスキルを身に付けなければなりません。
当サイト「リバトレ」では稼ぐスキルに関する情報を日々発信しているので、興味のあるものから見て頂ければ嬉しいです。
稼ぐスキルを身に付けよう!!
コメント