如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?

Posted

技术标签:

【中文标题】如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?【英文标题】:How to deploy an API Gateway custom authorizer without identity sources using serverless? 【发布时间】:2020-08-03 04:43:53 【问题描述】:

我正在尝试使用无服务器框架在 API Gateway 中创建自定义 lambda 授权器。

我的服务的客户端可以发送“授权”或“X-Custom”标头(但不能同时发送)。所以我需要的是一个没有身份来源的自定义授权者。

serverless YAML 截图如下:

functions:
  create:
    handler: posts.create
    events:
      - http:
          path: posts/create
          method: post
          authorizer:
            arn: xxx:xxx:Lambda-Name
            resultTtlInSeconds: 0
            type: request
          integration: lambda
          cors: true
          request:
            template:
              application/json: '"method": "$context.httpMethod","body" : $input.json("$"),"headers": #foreach($param in $input.params().header.keySet())"$param": "$util.escapejavascript($input.params().header.get($param))" #if($foreach.hasNext),#end#end,"queryParams": #foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end,"pathParameters": #foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end'

我正在使用以下请求模板,以便我的 lambda 获取标头并执行验证:

"method": "$context.httpMethod","body" : $input.json("$"),"headers": #foreach($param in $input.params().header.keySet())"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end#end,"queryParams": #foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end,"pathParameters": #foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end

问题在于,当我运行无服务器部署命令时,授权方是使用“授权”身份资源创建的。

我的代码基于以下资源:

Serverless endpoints with custom authorizers。 Cloudformation AWS API Gateway Authorizer。 Cloudformation AWS API Gateway Authorizer V2。

这让我想到了两个问题:

    serverless 框架是什么配置版本 用于部署我的授权人? 如何指定自定义授权方 没有资源?

【问题讨论】:

【参考方案1】:

我的猜测是 serverless 框架符合第一个版本, 因为当我尝试将值设置为空列表时它会抱怨。 使用空字符串为我解决了这个问题。

identitySource: ''

【讨论】:

【参考方案2】:

这对我有用。

  identitySource: '',
  resultTtlInSeconds: 0 // You have to set this to 0. 

希望这可以减轻人们我刚刚经历的痛苦! :P

【讨论】:

以上是关于如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS 设置无 ui 的外部 API 身份验证?

使用 Web API 的无浏览器身份验证

如何将无服务器代码部署到 AWS API Gateway 中的阶段

来自外部源的 Django 用户和身份验证

具有多个身份验证源的JWT令牌

如何设计一个高性能网关