尽管允许策略,AWS API Gateway Lambda 授权方仍返回 403 错误

问题描述 投票:0回答:1

我将 Lambda 授权方与 AWS API Gateway 结合使用,但遇到 403 错误,即使我的 Lambda 授权方返回允许策略也是如此。

我检查了 Lambda 授权方函数,以确保它正确处理传入请求、解码 JWT 令牌并生成适当的策略文档。具体来说,我检查了该函数是否返回所需资源的允许效果,并且资源 ARN 是否与请求的方法和路径匹配。

export const handler = async function (event: any, callback: Callback, context: Context): Promise<APIGatewayAuthorizerResult> {
  try {
    logger.info('Event: ', event);
    const permissions = await getUserIdFromEvent(event);
    console.log('Permissions: ', permissions);

    if (isAuthorized(event, permissions)) {
      return {
        principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
        policyDocument: {
          Version: '2012-10-17',
          Statement: [
            {
              Action: 'execute-api:Invoke',
              Effect: 'Allow',
              Resource: event.methodArn,
            },
          ],
        }
      } as AuthResponse;
    } else {
      return {
        principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
        policyDocument: {
          Version: '2012-10-17',
          Statement: [
            {
              Action: 'execute-api:Invoke',
              Effect: 'Allow',
              Resource: event.methodArn,
            },
          ],
        }
      } as AuthResponse;
    }
  } catch (error) {
    console.error(error);
    return {
      principalId: '73947882-6071-70a1-f3ea-4b043e61740f',
      policyDocument: {
        Version: '2012-10-17',
        Statement: [
          {
            Action: 'execute-api:Invoke',
            Effect: 'Allow',
            Resource: event.methodArn,
          },
        ],
      }
    } as AuthResponse;
  }
};

我检查了 Lambda 授权方函数,以确保它正确处理传入请求、解码 JWT 令牌并生成适当的策略文档。具体来说,我检查了该函数是否返回所需资源的允许效果,并且资源 ARN 是否与请求的方法和路径匹配。

typescript amazon-web-services aws-lambda
1个回答
0
投票

总的来说,lambda 代码看起来相当不错,我在下面分享了一些建议(请参阅“Lambda 代码”)。

我无法判断API网关和Lambda之间的连接是否正确(要求在评论中分享这一点)。但我会指出如何做到这一点。

在 API Gateway 上,转到端点定义(在

Resources
下),您应该看到
Method request
。在其设置下,
Authorization
应该有一个链接到您的 lambda 的令牌授权者。

要设置令牌授权者,请在 API 菜单中选择

Authorizers
,创建一个新的
Lambda
类型(更多详细信息请参见 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-使用-lambda-authorizer.html)。

一旦您分享更多信息,我们也许能够帮助您查明问题和相应的解决方案。

Lambda代码

principalId
应该是用户的子,所以通常是解码后的JWT的
sub

我看到您有

event.methodArn
作为声明的资源。您可以在那里使用
*
来帮助测试(然后,一旦您让它工作,您就可以迭代地关闭对所请求方法的访问)。

注意:我假设您共享的代码仅用于测试目的(允许所有请求通过),但您的 lambda 代码应在用户不应进行身份验证的情况下返回“拒绝”。我会有一个“如果用户可以通过身份验证,则允许他们”,然后在最后(在 try/catch 之外)返回一个“catch-all”返回“Deny”。

额外提示

为了帮助调试正在处理的请求,您可以启用 API Gateway 的执行日志 (https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html)。

超级有用,它指示了请求处理的每一步:

  • API GW收到的请求
  • 是否需要API密钥(以及使用计划配额中是否有剩余请求)
  • 转发到授权 lambda 的请求
  • auth lambda 的响应
  • 发送到服务器的请求(如果端点是代理端点)
  • 服务器的响应
  • 发送给客户端的响应

在 API 网关上:

  • 选择API
  • 选择舞台
  • 在“日志和跟踪”下,单击“编辑”
  • 选择所需的设置级别以及要记录的内容

注意:不建议在生产环境中启用此功能 - 请参阅 ps://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-logging.html。

© www.soinside.com 2019 - 2024. All rights reserved.