【问题标题】:Unable to get CognitoIdentityId from Java Lambda Function无法从 Java Lambda 函数获取 CognitoIdentityId
【发布时间】:2016-06-09 04:40:38
【问题描述】:

我目前有一个 API Gateway 设置来绑定使用 Java 编写的 Lambda 函数。我正在使用 javascript SDK 调用 API Gateway 端点,它们正确地中继到 Lambda 函数。但是,当我尝试通过以下方式访问 Cognito 身份 ID 时:

context.getIdentity()

我收到以下回复:

lambdainternal.api.LambdaCognitoIdentity@xxxxxx

如果我跑了

context.getIdentity().getIdentityId()

它只是在记录器中返回一个空字符串。不确定我需要做什么来获取发出请求的用户的身份 ID 以传递到上下文。

我正在通过以下方式生成 Javascript AWS Api 客户端:

var apiClient = apigClientFactory.newClient({
                    accessKey: credentials.accessKeyId,
                    secretKey: credentials.secretAccessKey,
                    sessionToken: credentials.sessionToken,
                    region: 'us-east-1'
                });

使用 IAM 策略保护 lambda 函数,并且用户能够访问 lambda 函数,因此身份验证正常工作。只是出于某种原因没有提供 IdentityId。

【问题讨论】:

    标签: javascript aws-lambda aws-api-gateway aws-java-sdk


    【解决方案1】:

    为了让 Lambda 在其自己的上下文变量中访问 Cognito 身份,您需要在集成响应选项卡上启用复选框“Invoke with caller credentials”。

    或者,您也可以使用 API Gateway 的映射模板并将 $context.identity.cognitoIdentityId 的值传递给您的 Lambda 函数。映射模板看起来像这样:

    {
      "cognito-identity" : "$context.identity.cognitoIdentityId"
    }
    

    还请查看 API Gateway 的论坛讨论之一以了解更多详细信息/背景信息 (How to pass cognito identity id to backend through API Gateway)。

    【讨论】:

    • 这是正确的。我认为问题在于我使用的是 API Gateway 的映射模板,而根本没有传递它。因为我根本没有通过它,所以我是否启用了“使用调用者凭据调用”并不重要。我解决了这个问题,忘记发布我的解决方案。感谢您的提醒,这绝对是正确的解决方案。
    【解决方案2】:

    尝试使用event.requestContext.authorizer.claims。您可以访问cognito:usernameemail 和其他在生成令牌时塞入令牌的内容。您甚至可以使用 Cognito 的预令牌生成触发器对此进行自定义。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2017-01-16
      • 2020-12-12
      • 1970-01-01
      • 2018-12-08
      • 2018-08-12
      • 2023-03-03
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多