如何在AWS Lambda中获取Cognito Identity ID

时间:2015-04-28 19:38:40

标签: amazon-web-services amazon-cognito aws-lambda

如何获取调用AWS Lambda函数的用户的身份ID(由AWS Cognito登录)?我是否必须使用Lambda函数上的SDK来获取身份ID?

7 个答案:

答案 0 :(得分:10)

在AWS javascript SDK里面使用lambda函数 context.identity.cognitoIdentityId 这对我有用

答案 1 :(得分:8)

如果您通过API网关,您可以将cognito id(以及用户arn和其他有用信息)传递给Lambda。这解决了我的问题。

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html

答案 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授权人的更多信息

基本上,您需要使用AWS_IAM保护您的APIG,并且您必须通过Cognito联合身份进行身份验证,该身份将返回sessionToken example using user pools。这就是使AWS IAM凭证成为临时凭证的原因。 现在,您拥有了对APIG进行身份验证所需的一切。

要对此进行测试,请下载桌面版postman,然后输入您的API URI(从舞台区域抓取),然后在授权下填写Sig4签名所需的5个字段。你会看到' event.identity' lambda函数中的对象加载了user对象等属性。

如果您想使用API​​G自动生成的SDK,它会内置一个带有accessKeysecrettoken的工厂,并为您签名。与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.0com.amazonaws:aws-lambda-java-events:2.2.7。之后,我得到了如下的用户名。

val claims = requestContext.authorizer["claims"] as Map<String, String>
println(claims["cognito:username"])
println(claims["email"])