【问题标题】:Serverless aws Cors setting无服务器 aws Cors 设置
【发布时间】:2018-11-24 02:25:41
【问题描述】:

我正在构建无服务器应用程序,并且想限制只有 1 个 url 可以访问服务器。

我在 serverless.yml 上尝试了两种方法

login:
    handler: login.login
    events:
      - http:
          path: login
          method: post
          cors:
            origins:
              - 'https://admin.test.com'
            headers:
              - Content-Type
              - X-Amz-Date
              - Authorization
              - X-Api-Key
              - X-Amz-Security-Token
              - X-Amz-User-Agent
              - Startlower
              - Text
              - Access-Control-Allow-Headers
              - Access-Control-Allow-Origin

  login:
    handler: login.login
    events:
      - http:
          path: login
          method: post
          cors: true

关于登录功能,

headers: {
    "Access-Control-Allow-Credentials": true,
    "Access-Control-Allow-Origin" : "https://admin.test.com",
    "Content-Type": "application/json",
},

但它对公众开放。任何有 serverless url 的人都可以访问,并查看 json 输出。

我应该改变哪一部分?

【问题讨论】:

    标签: aws-lambda serverless-framework serverless aws-serverless


    【解决方案1】:

    Access-Control-Allow-Origin 标头与(许多类型的)跨域 AJAX 请求相关。它不是通用的访问控制机制。

    通过 AJAX(有点过时的术语?),我本质上是指通过 javascript 从浏览器发出的请求。

    This is kind of long,但值得阅读整本书,至少要读两遍。

    所以这个头可以防止跨域AJAX请求,因为所有的浏览器都尊重它。它对“常规”请求没有任何作用(即将 URL 粘贴到您的浏览器或 Postman)。

    要只允许来自一个 IP 的任何类型的请求,您可以检查 lambda 代码中的 originreferrer 标头,但标头可能会被欺骗。 Using a WAF (Web Application Firewall) with a proper ACL (Access Control List) 可能是一个更强大的解决方案。

    【讨论】:

      【解决方案2】:

      在 Serverless 官方文档中,APIGateway 配置只接受origin: 'value'。我认为您可以使用“正确”设置和组合响应标头重试:

      login:
          handler: login.login
          events:
            - http:
                path: login
                method: post
                cors:
                  origin: 'https://admin.test.com'
                  headers:
                    - Content-Type
                    - X-Amz-Date
                    - Authorization
                    - X-Api-Key
                    - X-Amz-Security-Token
                    - X-Amz-User-Agent
                    - Startlower
                    - Text
                    - Access-Control-Allow-Headers
                    - Access-Control-Allow-Origin
      

      在登录功能中(和你的功能一样)

      headers: {
          "Access-Control-Allow-Credentials": true,
          "Access-Control-Allow-Origin" : "https://admin.test.com",
          "Content-Type": "application/json",
      },
      

      【讨论】:

        【解决方案3】:

        CORS 不会阻止您的函数被全世界访问,它只是意味着如果域不匹配,信誉良好的浏览器将拒绝接受异步调用服务。

        您可能想要做的是创建一个custom authorizer,这可以设置为授权您登录的管理员。

        functions:
          customauth:
            handler: customauth/index.handler
        
          admin-thing:
            handler: admin/dosomething.handler
            events:
              - http:
                  path: admin/dosomething
                  method: post
                  authorizer:   
                    name: customauth
                    resultTtlInSeconds: 0
                    identitySource: method.request.header.Authorization
                    identityValidationExpression: ^Bearer [-0-9a-zA-z\.]*$          
                  cors:
                    origins:
                      - 'https://admin.test.com'
                    headers:
                      - Content-Type
                      - X-Amz-Date
                      - Authorization
                      - X-Api-Key
                      - X-Amz-Security-Token
                    allowCredentials: true
        

        您也可以使用引荐来源标头来执行此操作,但不那么安全。

        【讨论】:

          猜你喜欢
          • 2021-12-24
          • 2020-03-17
          • 2018-03-19
          • 1970-01-01
          • 2019-12-15
          • 2017-06-07
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多