如何获取调用AWS Lambda函数的用户的身份ID(由AWS Cognito登录)?我是否必须使用Lambda函数上的SDK来获取身份ID?
答案 0 :(得分:10)
在AWS javascript SDK里面使用lambda函数 context.identity.cognitoIdentityId 这对我有用
答案 1 :(得分:8)
如果您通过API网关,您可以将cognito id(以及用户arn和其他有用信息)传递给Lambda。这解决了我的问题。
答案 2 :(得分:4)
Per the docs,看起来有关身份提供者的信息只能通过Mobile SDK进行调用。
要解决此问题,一个选项是将身份ID作为事件的一部分手动传递给函数。假设您正在执行AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
之类的操作,那么您应该能够通过AWS.config.credentials.identityId
获取ID(刷新凭据后)。
编辑:身份验证的更好选择是让Cognito / IAM处理它,并假设如果用户可以成功调用Lambda函数,则意味着允许它们。在这种情况下,要管理每个用户的验证,请查看whitelisting。
答案 3 :(得分:3)
如果其他人偶然发现这一点,我认为这会对你有所帮助。
请注意,这仅适用于您使用Cognito用户池授权程序的情况。如果您想将AWS_IAM与Cognito Identitys一起使用,请查看我的github示例https://github.com/VictorioBerra/js-cognito-auth-example(请阅读下面的EDIT区域)
如果您有"使用Lambda代理集成"检查然后您将无法访问请求模板映射。但是你可以在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,并且您必须通过Cognito联合身份进行身份验证,该身份将返回sessionToken example using user pools。这就是使AWS IAM凭证成为临时凭证的原因。 现在,您拥有了对APIG进行身份验证所需的一切。
要对此进行测试,请下载桌面版postman,然后输入您的API URI(从舞台区域抓取),然后在授权下填写Sig4签名所需的5个字段。你会看到' event.identity' lambda函数中的对象加载了user
对象等属性。
如果您想使用APIG自动生成的SDK,它会内置一个带有accessKey
,secret
和token
的工厂,并为您签名。与aws-sdk相同。您可以使用这三个项目初始化凭据,它将使用这些临时信誉自动为您签署所有请求。如果您想通过window.fetch,request,curl(在此处插入http客户端)直接手动点击您的API,您可以calculate your own Sig4(请注意它可能有点复杂或use a modern library to do it for you。
同样为了记录,在进行我的研究时,我注意到如果你不想使用AWS_IAM作为APIG授权者,并且你想使用" Cognito Identity Pool Authorizer"如果您只是将JWT gained from a successful Cognito popl auth作为授权标头传递给APIG,那么在APIG下拉列表中这是一个奇特的新选项,您仍然可以获得lambda事件中用户的大量信息。在JWT内部有许多属性,您可以在池设置中自定义。
IMO专业意见我认为使用AWS_IAM临时信誉授权者是首选。这样,您可以在Cognito Identities(Facebook,Twitter,池等)中使用任意数量的不同IdP。
答案 4 :(得分:0)
我的观察结果如下。
如果您使用签名请求调用API网关,您实际提供了可以通过(JS SDK)提取的accesskey,secret和sessionToken:
AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
AWS.config.credentials.get(..)
并假设您的lambda是通过LAMBDA_PROXY和Authorizer AWS_IAM从API-Gateway调用的。您只能使用以下命令访问lambda中的用户资料:
exports.create = function (event, context) {
secdata = event.requestContext.identity.cognitoAuthenticationProvider;
}
然后,除了其他内容之外,您将获得cognito UserPool用户的“子”。因此,如果您真的想了解有关用户的更多信息,您似乎需要通过SDK调用再次询问AWS。
答案 5 :(得分:0)
对于Python Lambda,可通过Javascript AWS开发工具包/ Cognito / Amplify调用...
https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
context.identity.cognito_identity_id
它应该看起来像这样:
{aws region}:{ GUID }
假设您使用的是身份池,这将返回Cognito联合身份,该身份可用于细粒度的访问控制。这比依赖包含身份标识的Javascript有效负载更为安全。
Cognito身份池身份验证角色将需要具有Lambda:InvokeFunction策略,否则用户将无法首先调用该功能。
编辑:当直接调用Lambda函数而不是通过API网关时,此方法有效。
Edit2:允许Cognito用户调用lambda,因为它是在IAM Cognito Auth角色中明确设置的。
答案 6 :(得分:0)
我正在使用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"])