当前位置: 首页 > 知识库问答 >
问题:

仅使用Lambda授权程序在代理的API网关请求上添加报头

斜烈
2023-03-14

目前,我考虑了一个基于用户是否经过正确身份验证的AWS ApiGateway+Lambda的服务器HTML架构。我正在尝试实现这个认知和一个自定义的Lambda授权器。我希望Lambda始终返回HTML,并根据传递的cookie,为登录/注销状态生成HTML。在我看来,理想的做法是有一个单独的授权者来执行令牌验证,并将一个头传递给HTML生成lambda。

如何才能做到这一点呢?

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: A Lambda function for rendering HTML pages with authentication
Resources:
  WebAppGenerator:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: app.handler
      Runtime: nodejs12.x
      CodeUri: .
      Description: A Lambda that generates HTML pages dynamically
      MemorySize: 128
      Timeout: 20
      Events:
        ProxyRoute:
          Type: Api
          Properties:
            RestApiId: !Ref WebAppApi
            Path: /{proxy+}
            Method: GET
  WebAppApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Auth:
        DefaultAuthorizer: WebTokenAuthorizer
        Authorizers:
          WebTokenAuthorizer:
            FunctionArn: !GetAtt WebAppTokenAuthorizer.Arn
  WebAppTokenAuthorizer:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: authorizer.handler
      Runtime: nodejs12.x

function generatePolicy(principalId: string, isAuthorized: boolean, resource): APIGatewayAuthorizerResult {
    const result: APIGatewayAuthorizerResult = {
        principalId,
        policyDocument: {
            Version: '2012-10-17',
            Statement: []
        }
    };

    if (resource) {
        result.policyDocument.Statement[0] = {
            Action: 'execute-api:Invoke',
            Effect: 'Allow',
            Resource: resource
        };
    }

    result.context = {
        isAuthorized
    };

    return result
}

共有1个答案

车胤运
2023-03-14

对于自定义授权器,我不确定您提到的功能是否可以直接实现。

您能否检查是否可以按照本指南定义内容类型为text/html的映射模板?(确保Lambda集成不是代理集成)

然而,有两个替代方法将工作,如果它是一个选项,对您。

  • 使用AWS Cloudfront和API Gateway的infront并配置错误响应以显示基于错误状态代码的HTML。
  • 使用Lambda层授权并决定响应。
 类似资料:
  • 但是看起来在我的lambda响应和API网关之间发生了一些奇怪的事情, 变量在内部的某个地方被压缩得更低, 而我仍然得到了相同的解析错误, 它会接受其他格式的响应吗?字符串也不起作用。 我还应该尝试什么?我的策略格式错误吗? 我从这些站点获得了两种不同的策略格式- 1。http://docs.aws.amazon.com/apigateway/latest/developerguide/use-c

  • 我的WEB API托管在Docker中。我的Angular客户机将发送一个JWT令牌来访问这些API中的任何一个。我想利用AWS API网关特性在调用请求的API客户端之前添加一个授权检查。从文档中,我看到我们可以利用Lambda授权器的概念来实现这一点。但我又想了一下为什么要使用Lambda Authorizer,因为我可以想出一个可以验证用户的DOT NET CORE API。 我的Lambd

  • 我创建了一些Lambda函数,并使用SAM进行了部署。部署是成功的,但当试图到达endpoint时,我总是获得 即使我使用头发送正确的承载令牌。然后,如果我去Authorizer并运行测试,它会很好地通过并在CloudWatch中生成日志,但是当我从前端应用程序或REST客户端应用程序运行到endpoint的请求时,我会得到未经授权的消息,并且检查CloudWatch,就不会执行Authorize

  • 我遵循的方法是,我为每组用户创建一个单独的Cognito用户池。 当用户登录时,他将通过适当的用户池进行身份验证。 为了调用后续的API,我计划使用Lambda Authorizer。 我遇到了下面的链接,以验证ID令牌。 https://github.com/awslabs/aws-support-tools/blob/master/cognito/decode-verify-jwt/decod