web-dev-qa-db-ja.com

期限切れのトークンを復元する方法[AWSCognito]?

ウェブサイトに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

11
David

ほぼ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");
        }
      });
    }
  });
}
4
David

通常、追加のロジックで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

あなたが興味を持っている:

  • getPromise()
  • refreshPromise()
5
kxyz

これが私がこれをどのように実装したかです:

まず、ユーザーにサービスの承認を与え、権限を付与する必要があります。

サンプルリクエスト:

これが私がこれをどのように実装したかです:

まず、ユーザーにサービスの承認を与え、権限を付与する必要があります。

サンプルリクエスト:

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}

あなたは正しい絵を手に入れます。

詳細が必要な場合 ここに移動

2

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

0
Ruslan Kazakov