java - 在无服务器 Java 函数中获取 AWS Cognito 用户 ID
问题描述
我正在关注https://serverless-stack.com/教程,该教程使用无服务器框架创建一个 API,将对象插入 DynamoDB 表并将它们与经过身份验证的 AWS Cognito 用户相关联。我正在尝试将 Node.js 代码转换为 Java,但在获取 Cognito 身份时遇到了问题,如本页所示
userId: event.requestContext.identity.cognitoIdentityId,
我希望以下 Java 代码行是等效的:
final CognitoIdentity identity = context.getIdentity();
final String userId = identity.getIdentityId();
但是userId
是空的。
我正在使用该aws-api-gateway-cli-test
实用程序使用 Cognito 用户的凭据调用我的 API,如本页所示。身份验证通过,但userId
处理程序中为空。
这是我的功能:
package com.mealplanner.function;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.CognitoIdentity;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mealplanner.dal.MealRepository;
import com.mealplanner.domain.Meal;
import com.serverless.ApiGatewayResponse;
public class CreateMealHandler implements RequestHandler<Map<String, Object>, ApiGatewayResponse> {
@Override
public ApiGatewayResponse handleRequest(final Map<String, Object> request, final Context context) {
try {
final CognitoIdentity identity = context.getIdentity();
final String userId = identity.getIdentityId();
final JsonNode body = new ObjectMapper().readTree((String) request.get("body"));
final MealRepository repository = new MealRepository();
final Meal meal = new Meal();
meal.setUserId(userId);
meal.setDescription(body.get("description").asText());
repository.save(meal);
return ApiGatewayResponse.builder()
.setStatusCode(200)
.setObjectBody(meal)
.build();
} catch (final Exception e) {
final String errorText = String.format("Error saving meal with request [%s]", request);
LOGGER.error(errorText, e);
return ApiGatewayResponse.builder()
.setStatusCode(500)
.setObjectBody(errorText)
.build();
}
}
}
这是 serverless.yml 中的函数定义:
createMeal:
handler: com.mealplanner.function.CreateMealHandler
events:
- http:
path: /meals
method: post
cors: true
authorizer: aws_iam
我是否遗漏了一些配置,或者我没有正确翻译 Node.js 代码?
如果我错过了任何相关信息,可以在这里找到完整的代码:https ://github.com/stuartleylandcole/meal-planner/tree/add-users 。我将用任何缺失的内容更新这个问题,以确保所有相关信息都是独立的。
解决方案
事实证明我没有正确翻译 Node.js 代码。要访问CognitoIdentityId
我必须requestContext
从request
对象中获取,然后获取identity
对象,如下所示:
public ApiGatewayResponse handleRequest(final Map<String, Object> request, final Context context) {
final Map<String, Object> requestContext = (Map<String, Object>) request.get("requestContext");
final Map<String, Object> identity = (Map<String, Object>) requestContext.get("identity");
final String userId = (String) identity.get("cognitoIdentityId");
// etc
}
推荐阅读
- sharepoint-online - 如何更改列表项的内容类型
- c++ - C/C++ 中 assert(false) 的更好替代方案
- ajax - 如何修复 laravel 404 NotFoundHttpException 错误?
- javascript - 是否有 lodash 或其他函数来搜索对象数组的数组以查找匹配的键/值?
- node.js - 更改 Node.js 新 Error 对象的前三行?
- android - 向 Google Play 商店中的现有应用提交更新:“运行 bundletool build-apks 时发生错误”
- javascript - 有没有一种方法可以使用 javascript mslink.sh 创建 lnk 文件
- javascript - 如何显示文档选择器对话框 - Alfresco 6
- android - 类 DescriptorExtractor 在适用于 Android 的 opencv 4.1.0 中不可用
- azure - 需要在电子邮件通知中发送发布测试结果图表