node.js - Lambda 自定义授权,如何返回自定义消息?
问题描述
我正在为我的服务使用无服务器框架、node.js 和 typescript。我有一个自定义授权器,我从外部服务获取一些数据,并根据该服务的响应,我想在我的 lambda 中返回这样的错误代码。
问题是每次来自授权方的响应是(无论我如何返回错误以及它通过什么错误和状态码):
{
"statusCode": 403,
"error": "Forbidden",
"message": "No principalId set on the Response"
}
这是自定义授权者的细节,没有其他东西可以返回,还是可以以某种方式修改响应?
无服务器.yml
...
functions:
users:
handler: lambdas/users/handler.main
events:
- http:
path: /users
method: GET
private: true
authorizer:
name: customAuthorizer
resultTtlInSeconds: 0
customAuthorizer:
handler: lambdas/custom-authorizer/handler.handler
environment:
APP_NAME: ${env:APP_NAME}
...
这是我的处理程序的简单代码
处理程序.ts
export async function handler(event: APIGatewayTokenAuthorizerEvent, context: Context): Promise<any> {
context.callbackWaitsForEmptyEventLoop = false;
try {
if (!event.authorizationToken) {
throw new HttpError("Unauthorized", 401);
}
const hasAccess = await fetchingPolicyFromExternalService(event.authorizationToken);
if (!hasAccess) {
throw new HttpError("Forbidden", 403);
}
const policyDocument = generatePolicy(event, "Allow"); //generate policy for Allow user to invoke api
return policyDocument;
} catch (error) {
if (error instanceof HttpError) {
return {
statusCode: error.status,
body: error.message,
};
}
return {
statusCode: 500,
body: "UnknownError",
};
}
}
解决方案
关于私人:真
然后,连接到此 Rest API 的客户端将需要在其请求的 x-api-key 标头中设置任何这些 API 密钥值。这仅对私有属性设置为 true 的函数是必需的。
https://www.serverless.com/framework/docs/providers/aws/events/apigateway/
不确定您如何发送请求,但请考虑这部分。可能是您缺少标题信息,这就是为什么它总是这样回答(即不是您的授权人,但您的功能受到保护)。因此,此响应可能来自您的功能,而不是授权人。
推荐阅读
- node.js - Firebase Cloud Functions 发送通知奇怪的输出
- python - 这里设置了什么样的变量?
- spring - 将 SQL 文本数组映射到 Spring 数据 JPA 中的 Java 字符串列表
- vagrant - vagrant unsync 文件夹不适用于自定义目录
- json - 如何将 struct 转换为 json 没有用于 restAPI 的密钥
- microsoft-graph-api - 更新日历邮箱的 Microsoft Graph 订阅时出现“未找到”错误
- ios - 如何在swift 3中做UIView Intrective Animation?
- spring-boot - 如何通过命令行参数覆盖 application.properties 以指定数据源属性
- javascript - 如何使用 lodash 从以下输入中获取此类输出
- c++ - std::getline 在代码中使用了两次,跳到第二个 getline