ウェブサイトにAWSを使用しています。 1時間後、トークンの有効期限が切れ、ユーザーはほとんど何もできなくなります。
今のところ、次のように資格情報を更新しようとしています。
_ function getTokens(session) {
return {
accessToken: session.getAccessToken().getJwtToken(),
idToken: session.getIdToken().getJwtToken(),
refreshToken: session.getRefreshToken().getToken()
};
};
function getCognitoIdentityCredentials(tokens) {
const loginInfo = {};
loginInfo[`cognito-idp.eu-central-1.amazonaws.com/eu-central-1_XXX`] = tokens.idToken;
const params = {
IdentityPoolId: AWSConfiguration.IdPoolId
Logins: loginInfo
};
return new AWS.CognitoIdentityCredentials(params);
};
if(AWS.config.credentials.needsRefresh()) {
clearInterval(messwerte_updaten);
cognitoUser.refreshSession(cognitoUser.signInUserSession.refreshToken, (err, session) => {
if (err) {
console.log(err);
}
else {
var tokens = getTokens(session);
AWS.config.credentials = getCognitoIdentityCredentials(tokens);
AWS.config.credentials.get(function (err) {
if (err) {
console.log(err);
}
else {
callLambda();
}
});
}
});
}
_
1時間後、ログイントークンは問題なく更新されますが、2時間後には、ログイントークンを更新できなくなります。
また、AWS.config.credentials.get()
、AWS.config.credentials.getCredentials()
、およびAWS.config.credentials.refresh()
を使用してみましたがどちらも機能しません。
私が受け取っているエラーメッセージは次のとおりです。
構成に資格情報がありません
ログイントークンが無効です。トークンの有効期限が切れました:1446742058> = 1446727732
ほぼ2週間後、私はついにそれを解決しました。
新しいIDトークンを受け取るには、更新トークンが必要です。更新されたトークンを取得したら、AWS.config.credentialsオブジェクトを新しいIDトークンで更新します。
これを設定する方法の例を次に示します。スムーズに実行されます。
refresh_token = session.getRefreshToken(); // you'll get session from calling cognitoUser.getSession()
if (AWS.config.credentials.needsRefresh()) {
cognitoUser.refreshSession(refresh_token, (err, session) => {
if(err) {
console.log(err);
}
else {
AWS.config.credentials.params.Logins['cognito-idp.<YOUR-REGION>.amazonaws.com/<YOUR_USER_POOL_ID>'] = session.getIdToken().getJwtToken();
AWS.config.credentials.refresh((err)=> {
if(err) {
console.log(err);
}
else{
console.log("TOKEN SUCCESSFULLY UPDATED");
}
});
}
});
}
通常、追加のロジックでhttpリクエストをインターセプトすることで解決されます。
function authenticationExpiryInterceptor() {
// check if token expired, if yes refresh
}
function authenticationHeadersInterceptor() {
// include headers, or no
}}
次に、HttpServiceレイヤーを使用します
return HttpService.get(url, params, opts) {
return authenticationExpiryInterceptor(...)
.then((...) => authenticationHeadersInterceptor(...))
.then((...) => makeRequest(...))
}
プロキシでも解決できます http://2ality.com/2015/10/intercepting-method-calls.html
AWSに関連して: https://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html
あなたが興味を持っている:
これが私がこれをどのように実装したかです:
まず、ユーザーにサービスの承認を与え、権限を付与する必要があります。
サンプルリクエスト:
これが私がこれをどのように実装したかです:
まず、ユーザーにサービスの承認を与え、権限を付与する必要があります。
サンプルリクエスト:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id={your client_id}
code=AUTHORIZATION_CODE&
redirect_uri={your rediect uri}
これは次のようなJsonを返します:
HTTP/1.1 200 OKコンテンツタイプ:application/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je","id_token":"dmcxd329ujdmkemkd349r", "token_type":"Bearer", "expires_in":3600}
スコープに応じてアクセストークンを取得する必要があります:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=client_credentials&
scope={resourceServerIdentifier1}/{scope1} {resourceServerIdentifier2}/{scope2}
Jsonは次のようになります。
HTTP/1.1 200 OKコンテンツタイプ:application/json
{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}
現在、このaccess_tokenは3600秒間のみ有効です。その後、これを交換して新しいアクセストークンを取得する必要があります。これをする、
更新トークンから新しいアクセストークンを取得するには:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token >
Content-Type='application/x-www-form-urlencoded'
Authorization=Basic aSdxd892iujendek328uedj
grant_type=refresh_token&
client_id={client_id}
refresh_token=REFRESH_TOKEN
応答:
HTTP/1.1 200 OKコンテンツタイプ:application/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}
あなたは正しい絵を手に入れます。
詳細が必要な場合 ここに移動 。
AWSAmplifyライブラリを使用してアクセストークンを更新する方法は次のとおりです。
import Amplify, { Auth } from "aws-amplify";
Amplify.configure({
Auth: {
userPoolId: <USER_POOL_ID>,
userPoolWebClientId: <USER_POOL_WEB_CLIENT_ID>
}
});
try {
const currentUser = await Auth.currentAuthenticatedUser();
const currentSession = currentUser.signInUserSession;
currentUser.refreshSession(currentSession.refreshToken, (err, session) => {
// do something with the new session
});
} catch (e) {
// whatever
}
};
詳細については、こちらをご覧ください: https://github.com/aws-amplify/amplify-js/issues/256 。