首页 > 解决方案 > 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",
    };
  }
}

标签: node.jsaws-lambdaserverless-frameworklambda-authorizer

解决方案


关于私人:真

然后,连接到此 Rest API 的客户端将需要在其请求的 x-api-key 标头中设置任何这些 API 密钥值。这仅对私有属性设置为 true 的函数是必需的。

https://www.serverless.com/framework/docs/providers/aws/events/apigateway/

不确定您如何发送请求,但请考虑这部分。可能是您缺少标题信息,这就是为什么它总是这样回答(即不是您的授权人,但您的功能受到保护)。因此,此响应可能来自您的功能,而不是授权人。


推荐阅读