1

フェデレート認証を使用してサーバーレスのアプリケーション(ReactJS、APIゲートウェイ、AWS Lambda、DynamoDB)を作成しようとしています。以下は(簡潔にするためにSTSを追加していない。また、私は、私は完全に流れを理解しているとは思いませドン。)私が想定していますarchitectireの一種である:AWS APIゲートウェイ認証(Cognito Vsカスタム・オートローダ)

Authentication sequence

私はラムダ関数をトリガーするAPIゲートウェイエンドポイントを作成しました。私はまずGoogleでユーザーを認証したいが、成功したらAPIエンドポイントを使用できるはずです。

最初のステップは、標準Outh2を使用してGoogleでユーザーを認証することです。私は2つの認証されていないエンドポイント/ signin/googleおよび/ callback/googleを作成しました。コールバックラムダ関数でgoogleからの認証応答が成功すると、私はid_token(他の中でも)を使用できます。

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

  1. APIエンドポイントで使用できるカスタムオーソライザを作成します。コードは(https://github.com/prabhatsharma/api-gateway-custom-authorizer/)です。これはかなり簡単です。私は、APIエンドポイントを認証するためにGoogleが提供する同じid_tokenを使用できます。カスタム権限付与者は、id_tokenが良好であることを検証し、エンドポイントへのアクセスを許可します。また、結果をキャッシュして、この検証が毎回必要ないようにします。 (これはGoogleのid_tokenをこのように再利用するのに適していますか?)これで権限を使うことができますか?

  2. 認証にAWSコグニートを使用できます。このため、私は連合アイデンティティプールを作成し、グーグルアプリクライアントIDをCognitoコンソールに設定しました。 my/callback/google lambda関数では、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 
        } 
    }); 
    

は今、私は今、私のフロントエンドreactJSアプリケーションにidentityIdとトークンを渡すことができ、トークンは、次のコード

// 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 
      } 
     }); 

使用して取得する資格情報を使用することができます。

これは私が概念を理解するのに必要な部分です。これで、ブラウザでAWS SDKを使用してAWSリソースにアクセスできるようになりました。しかし、ホールド!ゲートウェイ経由で標準のRESTful APIを作成する目的は、特定のライブラリに依存せずに標準のjavascriptを使用することでしたか? AWS SDKを直接使用すると、Android/ios/unityアプリの使用例がより適切になります。私のチームの開発者は、この状況で使うフロントエンドの標準のJavaScriptライブラリを使用できるようにしたいと考えています。また、APIエンドポイントにエクスポートされたAPI SDKを使用したくないため、AWS SDKの詳細についてフロントエンドアプリケーションをきれいに保ちたいと思っています。手動でv4シグネチャですべての要求に署名することは冗長な作業です。 Cognitoを使用して標準的なトークンベースのAPIエンドポイントアクセスを持つことはできませんか?

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

免責事項 - レポのコードはまだ使用しないでください。進行中であり、まだ生産準備中ではありません。

答えて

0

oauth2トークンでカスタムオーサライザ機能を使用するか、対応するIAMロールでCognitoを使用して、AWSリソースへのユーザーアクセスを管理できます。

フローピクチャで説明した2番目のアプローチでは、すべてのリクエストの前に認証ラムダが必要なく、フロントエンドから他のAWSリソースへのアクセスを制御できるようになりました(つまりIoTなど)。

secretKey、accessKey、sessionToken、およびregionを取得したら、APIGへのすべてのリクエストにのみ署名する必要があります。これを行うにはAWS SDKは必要ありません。

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

+0

「フローの図で説明する2番目のアプローチは、すべての要求の前に認証ラムダを必要としません」ということは、カスタムオーソライザのアプローチではすべての要求に対して認証ラムダを実行する必要はないと思いますそのラムダを最初のAPI呼び出しに対してのみ実行します。正しい? – chen

+0

あなたの権利では、ApiGは設定された期間 – nachoab

関連する問題