3

フェデレーション認証を使用してサーバーレス アプリケーション (ReactJS、API Gateway、AWS Lambda、DynamoDB) を作成しようとしています。以下は、私が想定している種類のアーキテクチャです (簡潔にするために STS を追加していません。また、フローを完全に理解しているとは思いません)。

認証シーケンス

ラムダ関数をトリガーする API Gateway エンドポイントを作成しました。最初に Google でユーザーを認証したいのですが、成功した場合は API エンドポイントを使用できるはずです。

最初のステップは、標準の Outh2 を使用して Google でユーザーを認証することです。目的のために、認証されていないエンドポイント /signin/google と /callback/google を 2 つ作成しました。コールバック ラムダ関数で Google から認証の成功応答を取得したら、id_token (とりわけ) を使用できます。

現時点では、API の認証に使用できる 2 つのアプローチがあります。

  1. API エンドポイントに使用できるカスタム オーソライザーを構築します。コードは次のとおりです ( https://github.com/prabhatsharma/api-gateway-custom-authorizer/ )。これは非常に簡単です。Google が提供する同じ id_token を使用して、API エンドポイントを認証できます。カスタムオーソライザーは id_token が適切であることを検証し、エンドポイントへのアクセスを許可します。また、この検証が毎回必要にならないように結果をキャッシュします。(これは、この方法で google の id_token を再利用する良いアプローチですか?) これでオーソライザーを使用できます ( https://github.com/prabhatsharma/lambda-custom-auth )

  2. 認証に AWS cognito を使用できます。このために、フェデレーション ID プールを作成し、Google アプリ クライアント ID を cognito コンソールに設定しました。私の /callback/google ラムダ関数では、AWS SDK を使用して identityId、sessionToken、および accessKeyId を取得しています。(ソースコードhttps://github.com/prabhatsharma/lambda-cognito-auth )

    // Add the Google access token to the Cognito credentials login map.
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: config.COGNITO_IDENTITY_POOL_ID,   //dauth
        Logins: {
            'accounts.google.com': JSON.parse(body).id_token
        }
    });
    

これで、資格情報を使用して、次のコードを使用してトークンを取得できます

    // Obtain AWS credentials
    AWS.config.credentials.get(function () {
        // Access AWS resources here.
        // Credentials will be available when this function is called.
        var identityId = AWS.config.credentials.identityId;

        var cognitoidentity = new AWS.CognitoIdentity();

        var params = {
            IdentityId: identityId, /* required */
            Logins: {
                'accounts.google.com': JSON.parse(body).id_token
            }
        };

        cognitoidentity.getOpenIdToken(params, function (err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else {
                console.log(data);           // successful response
                res.headers = {
                    location: config.APPLICAION_URL + '/auth/google?' + querystring.stringify(data)
                }
                callback(null, res);   //redirect to front end application
            }
        });

これで、identityId と Token をフロントエンドの reactJS アプリケーションに渡すことができます。

これは、概念を理解するのにほとんど助けが必要ないところです。ブラウザで AWS SDK を使用して AWS リソースにアクセスできるようになりました。でもちょっと待って!!!Gateway 経由で標準の RESTful API を作成した目的は、特定のライブラリに依存せずに標準の JavaScript を使用することではないでしょうか? AWS SDK を直接使用することは、android/ios/unity アプリのより適切なユースケースのように見えます。私のチームの開発者が、この状況でも使用するフロント エンドの標準の JavaScript ライブラリを使用できるようにしたいと考えています。また、エクスポートされた API SDK を API エンドポイントに使用したくなく、フロントエンド アプリを AWS SDK の仕様から完全に切り離したいと考えています。すべてのリクエストに v4 署名を手動で署名するのは冗長な作業です。Cognito を使用して、標準のトークン ベースの API エンドポイント アクセスを使用することはできませんか?

この種の認証のベスト プラクティスは何ですか? 私は正しい方向に考えていますか?

免責事項 - リポジトリ内のコードはまだ使用しないでください。これは進行中の作業であり、まだ製品化の準備ができていません。

4

1 に答える 1

0

oauth2 トークンで Custom Authorizer 関数を使用できます。または、対応する IAM ロールで Cognito を使用して、AWS リソースへのユーザー アクセスを管理することもできます。

フロー図で説明している 2 番目のアプローチでは、すべてのリクエストの前に認証ラムダを必要とせず、フロントエンド (IoT など) から他の AWS リソースへのアクセスを制御できます。

secretKey、accessKey、sessionToken、およびリージョンを取得したら、APIG へのすべてのリクエストに署名するだけです。これを行うために AWS SDK は必要ありません。

エクスポートされた API を使用したくない場合は、自分でリクエストに署名する必要があります。に実装されているsigV4Client.jsので、コピーするのはかなり簡単です。いずれにしても必要な依存関係はほとんどないので、エクスポートされた API を使用してみませんか? あなたはすでに React を使っていますが、これは非常に大きなものです。

于 2016-10-30T14:30:09.280 に答える