フェデレーション認証を使用してサーバーレス アプリケーション (ReactJS、API Gateway、AWS Lambda、DynamoDB) を作成しようとしています。以下は、私が想定している種類のアーキテクチャです (簡潔にするために STS を追加していません。また、フローを完全に理解しているとは思いません)。
ラムダ関数をトリガーする API Gateway エンドポイントを作成しました。最初に Google でユーザーを認証したいのですが、成功した場合は API エンドポイントを使用できるはずです。
最初のステップは、標準の Outh2 を使用して Google でユーザーを認証することです。目的のために、認証されていないエンドポイント /signin/google と /callback/google を 2 つ作成しました。コールバック ラムダ関数で Google から認証の成功応答を取得したら、id_token (とりわけ) を使用できます。
現時点では、API の認証に使用できる 2 つのアプローチがあります。
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 )
認証に 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 エンドポイント アクセスを使用することはできませんか?
この種の認証のベスト プラクティスは何ですか? 私は正しい方向に考えていますか?
免責事項 - リポジトリ内のコードはまだ使用しないでください。これは進行中の作業であり、まだ製品化の準備ができていません。