AWS Lambda関数を呼び出した(AWS Cognitoによってログインした)ユーザーのID IDを取得するにはどうすればよいですか? ID IDを取得するには、Lambda関数でSDKを使用する必要がありますか?
the docs によると、IDプロバイダーに関する情報はMobile SDKを介した呼び出しでのみ利用できるようです。
これを回避するための1つのオプションは、イベントの一部としてID IDを手動で関数に渡すことです。 AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
のようなことをしているとすると、AWS.config.credentials.identityId
を介してIDを取得できるはずです(資格情報が更新された後)。
[〜#〜] edit [〜#〜]:ID検証のためのより良いオプションは、Cognito/IAMにそれを処理させて、ユーザーはLambda関数を正常に呼び出すことができます。つまり、許可されています。この場合、ユーザーごとの検証を管理するには、 ホワイトリスト をご覧ください。
ラムダ関数内のAWS JavaScript SDKでは、context.identity.cognitoIdentityIdを使用するだけです
API Gatewayを経由する場合は、コグニトID(およびユーザーarnとその他の有用な情報)をLambdaに渡すことができます。これで問題は解決しました。
他の誰かがこれにつまずいた場合、これはあなたを大いに助けると思います。
これは、Cognitoユーザープール認証を使用している場合にのみ適用されます。 AWS_IAMをCognito Identityで使用する場合は、私のgithubの例 https://github.com/VictorioBerra/js-cognito-auth-example を確認してください(以下の編集エリアまでお読みください)
[Lambdaプロキシ統合を使用する]がオンになっている場合、リクエストテンプレートマッピングにアクセスできません。しかし、ラムダ関数のトークン内のクレームに到達できます。
exports.handler = (event, context, callback) => {
//create a response
const response = {
statusCode: 200,
body: JSON.stringify({
"user email": event.requestContext.authorizer.claims.email,
}),
};
callback(null, response);
};
基本的には、AWS_IAMでAPIGを保護する必要があります。また、sessionToken ユーザープールを使用した例 を返すCognitoフェデレーションIDを介して認証する必要があります。これにより、AWS IAM認証情報が一時的になります。 これで、APIGへの認証に必要なものがすべて揃いました。
これをテストするには、デスクトップバージョンの postman をダウンロードし、API URIでtoss(ステージ領域からこれを取得)し、[Authorization]でSig4署名に必要な5つのフィールドに入力します。ラムダ関数の 'event.identity'オブジェクトに、user
オブジェクトなどのプロパティが読み込まれます。
APIG自動生成SDKを使用する場合は、accessKey
、secret
、およびtoken
を取り、すべてに署名するファクトリーが組み込まれています。 aws-sdkと同じです。これらの3つの項目で資格情報を初期化すると、一時的な資格情報ですべての要求に自動的に署名されます。 window.fetch、request、curl、(ここにhttpクライアントを挿入)を使用して手動でAPIを直撃したい場合は 独自のSig4を計算する (少し複雑になる場合があることに注意してください あなたのためにそれを行うために最新のライブラリを使用してください 。
また、参考までに、私の調査を行っているときに、AWS_IAMをAPIGオーソライザーとして使用したくない場合、およびAPIGのドロップダウンのファンシーな新しいオプションである「Cognito Identity Pool Authorizer」を使用したい場合でも、 成功したCognito popl authから取得したJWT をAuthorizationヘッダーとしてAPIGに渡すだけの場合、ラムダイベントでのユーザーに関する大量の情報。そのJWTの内部には、プール設定でカスタマイズできる多くの属性があります。
IMO専門家の意見AWS_IAM temp creds Authorizerを使用することを推奨します。このようにして、Cognito ID(Facebook、Twitter、プールなど)で必要なだけ多くの異なるIdPを使用できます。
Python Lambdaの場合、Javascript AWS SDK/Cognito/Amplifyを介して呼び出されます...
https://docs.aws.Amazon.com/lambda/latest/dg/python-context-object.html
context.identity.cognito_identity_id
次のようになります。
{aws region}:{ GUID }
IDプールを使用していると仮定すると、これにより、Cognito Federated Identityが返されます。これは、きめの細かいアクセス制御に使用できます。これは、IDを含むJavascriptペイロードに依存するよりも安全です。
Cognito IDプール認証ロールにはLambda:InvokeFunctionポリシーが必要です。そうしないと、ユーザーは最初に関数を呼び出すことができません。
編集:これは、API Gateway経由ではなく、直接Lambda関数を呼び出すときに機能します。
Edit2:IAM Cognito Authロールで明示的に設定されているため、Cognitoユーザーはラムダを呼び出すことができます。
私はKotlinを使用していて、Lambdaハンドラーは
override fun handleRequest(event: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent
しかし、event.requestContext
にはauthorizer
がありませんでした。解決策は、build.gradleの依存関係をcom.amazonaws:aws-lambda-Java-events:2.1.0
からcom.amazonaws:aws-lambda-Java-events:2.2.7
にアップグレードすることでした。その後、以下のようにユーザー名を取得しました。
val claims = requestContext.authorizer["claims"] as Map<String, String>
println(claims["cognito:username"])
println(claims["email"])
私の観察は次のとおりです。
(JS SDK)を介して抽出できるアクセスキー、シークレット、およびセッショントークンを実際に提供する署名付きリクエストでAPI Gatewayを呼び出す場合:
AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
AWS.config.credentials.get(..)
そして、ラムダがLAMBDA_PROXYとオーソライザーAWS_IAMを介してAPI-Gatewayから呼び出されると仮定します。あなたはラムダでユーザーのものにのみアクセスできます:
exports.create = function (event, context) {
secdata = event.requestContext.identity.cognitoAuthenticationProvider;
}
次に、他のものとは別に、コグニトUserPoolユーザーの「サブ」を取得します。したがって、本当にユーザーについてもっと知りたい場合は、SDK呼び出しを介してAWSに再度問い合わせる必要があるようです。