如何在AWS API Gateway中免除某些资源的自定义授权?

时间:2017-10-08 09:07:12

标签: amazon-web-services aws-api-gateway

我已在API网关中为代理资源配置了自定义授权,但我的要求是免除少量API授权,但我不想在API网关中配置新API,因为我正在尝试通过API设计代理API网关。

例如,API /server/ver1.0/rest/{proxy+},这是我在API网关中配置的REST API,它通过自定义授权程序然后如果成功则调用后端http服务。

但我想免除API - /server/ver1.0/rest/acc/reg授权。

3 个答案:

答案 0 :(得分:2)

最后,我已经按照我在问题中描述的方式解决了这个问题,

由于AWS无法以任何编程方式省略特定条件,因此我们留下以下选项:

  1. 创建单独的API - 这样,AWS就会优先考虑 比通用的API更具体的API,即API  /server/ver1.0/rest/acc/reg会优先考虑 /server/ver1.0/rest/{proxy+} 2)

  2. 修改自定义授权程序lambda     函数检查每个URL模式,但这使lambda     定制auth很复杂,维护性较差。

  3. 我采用了第一个选项,因为它更清洁,更易于维护,而且我不想用各种URL模式污染我的lambda自定义授权器

答案 1 :(得分:1)

假设自定义授权程序是lambda函数,暗示您的API网关是与Lambda的代理集成 - 您可以在lambda函数中执行此操作。

取决于您请求的资源,例如: / acc / reg - 您可以在lambda函数中检测到这一点并绕过身份验证。 对于所有其他资源,您可以通过自定义授权过程。

您可以定义变量来存储您的安全与不安全资源,并根据请求匹配

var insecureApis = '/hello,/acc/reg';
var secureApis = '/account/me';

var path = event.path;

if(secureApis.includes(path)){
    //perform custom auth and proxy request
} else {
   // just proxy
}

答案 2 :(得分:0)

由于我们不会将请求代理到后端API,而是将Lambda用于所有API调用,因此不确定是否可以直接回答OP,但是我们仍然只需要授权部分API。这是我们的方法:

我们有一个与SAM一起部署的API,在此项目中,我们对大多数api使用了自定义授权程序。

MonitorApi:
    Type: AWS::Serverless::Api
    Properties:
      Cors:
        AllowMethods: "'OPTIONS,POST,GET,PATCH,DELETE'"
        AllowHeaders: "'*'"
        AllowOrigin: "'*'"
      StageName: !Ref AppStage
      GatewayResponses:
        DEFAULT_4xx:
          ResponseParameters:
            Headers:
              Access-Control-Expose-Headers: "'*'"
              Access-Control-Allow-Headers: "'*'"
              Access-Control-Allow-Origin: "'*'"
      Auth:
        DefaultAuthorizer: LambdaTokenAuthorizer # This authorizer is used on the API
        AddDefaultAuthorizerToCorsPreflight: false
        Authorizers:
          LambdaTokenAuthorizer:
            FunctionArn: !GetAtt AuthorizeFunction.Arn
            Identity:
              Header: Authorization
              ReauthorizeEvery: 300

对于某些需要公开使用的资源,我们在功能级别上对此进行了覆盖,如下所示:

  SystempingFunction: # Systemping service in API
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: monitor/
      Handler: systemping.handler
      Runtime: nodejs12.x
      Timeout: 20
      Events:
        SystempingEvent:
          Type: Api
          Properties:
            Auth:
              Authorizer: NONE # Turn off Authorization for this function
            Path: /systemping
            Method: get
            RestApiId: !Ref MonitorApi