web-dev-qa-db-ja.com

Cognitoから返されたコードを使用してAWS認証情報を取得するにはどうすればよいですか?

現在、AWS Cognitoを理解するのに苦労しているので、誰かが助けてくれるかもしれません。説明されているように、ユーザープールにCognitoのホストされたUIを提供するようにドメインを設定しました herehttps://<my-domain>.auth.us-east-1.amazoncognito.com/login?response_type=code&client_id=<MY_POOL_CLIENT_ID>&redirect_uri=https://localhost:8080にアクセスすると、ユーザーがGoogleでアプリにログインできるログインページが表示されます。その部分はうまく機能しています。

ユーザーがログインすると、そのページから返されるコードをどう処理するか混乱しました。そのため、Googleにリダイレクトされ、アプリケーションに情報の表示を許可すると、次のコードでURLの1つにリダイレクトされます。クエリパラメータ。現在、ローカルホストにリダイレクトしているので、リダイレクトURLは次のようになります。

https://localhost:8080/?code=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX

このコードは正確には何ですか?また、それを使用してユーザーのAWSリソースにアクセスするにはどうすればよいですか?

15
arjabbar

「認証コード付与」はドキュメントで見つけることができます: http://docs.aws.Amazon.com/cognito/latest/developerguide/cognito-user-pools-app-idp-settings.html =

3
Summer Guo

認証コードoath2フローによって返されたコードリクエストパラメーターからAWS認証情報(id_token、access_tokenおよびrefresh_token)をフェッチするには、 https:// docsに従って、CognitoユーザープールWebドメイン/oauth2/tokenエンドポイントを使用する必要があります.aws.Amazon.com/cognito/latest/developerguide/token-endpoint.html 手順。

HTTP基本認証のユーザーとパスワードの説明に注意してください。これはCognitoアプリclient_idclient_secretである必要があります。そうしないと、invalid_clientエラーが発生します。

トークンがURLに浮かぶのを回避するため、コードフローはサーバー側で使用されることになっています。そのクライアント側を実行することを計画している場合は、response_type=tokenを使用する必要があります。これは、この結果がログインリダイレクトで直接得られるためです。

7

これは、質問されてから10か月後に役立つかどうかはわかりませんが、他の人にとっては役立つかもしれません。

利用した response_type=token(Oauthフロー= implicit grant&scope = openid)&プロバイダーをCognitoとして。デフォルトのログインページを使用してログインすると、id_tokenaccess_token。これを使用して、ユーザーの一時的なIDを取得できますid_token。また、認証されたユーザーと認証されていないユーザーに割り当てられ、認証に使用しているユーザープールにリンクされた役割を備えた、フェデレーションIDプールをセットアップする必要があります。それができたら(JavaScriptを使用していると仮定して)、 CognitoユーザーIDプールjavascriptの例 の例に従うことができます。同じから派生した私のサンプルコード-

function getAccessToken(idToken, identityPoolId, userPool) {
        let provider = "cognito-idp.us-east-2.amazonaws.com/" + userPool;
        let login = {};

        login[provider] = idToken;

        // Add the User's Id Token to the Cognito credentials login map.
        let credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: identityPoolId,
            Logins: login
        });

        //call refresh method in order to authenticate user and get new temp credentials
        credentials.get((error) => {
            if (error) {
                console.error(error);

                let response = {
                    statusCode: 500,
                    body: JSON.stringify(error)
                };

                return response;

            } else {
                console.log('Successfully logged!');
                console.log('AKI:'+ credentials.accessKeyId);
                console.log('AKS:'+ credentials.secretAccessKey);
                console.log('token:' + credentials.sessionToken);

                let response = {
                    statusCode: 200,
                    body: JSON.stringify({
                        'AKI': credentials.accessKeyId,
                        'AKS': credentials.secretAccessKey,
                        'token': credentials.sessionToken
                    })
                };

                return response;
            }
        });
    }

お役に立てれば。

4
ASR