0

我正在构建无服务器应用程序,并且希望限制只有 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",
},

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

我应该改变哪一部分?

4

3 回答 3

2

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

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

这有点长,但值得阅读整本书,至少两遍。

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

要仅允许来自一个 IP 的任何类型的请求,您可以检查 lambda 代码中的originorreferrer标头,但标头可能会被欺骗。 使用具有适当 ACL(访问控制列表)的 WAF(Web 应用程序防火墙)可能是一种更强大的解决方案。

于 2018-06-15T00:24:34.733 回答
1

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

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

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

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

于 2018-06-29T17:06:11.960 回答
1

在 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",
},
于 2018-12-30T15:33:27.710 回答