我正在构建无服务器应用程序,并且只想限制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输出。
我应该改变哪一部分?
答案 0 :(得分:2)
Access-Control-Allow-Origin
标头涉及(多种类型)跨源AJAX请求。它不是一般的访问控制机制。
通过AJAX(一种过时的术语?),我本质上是指通过javascript从浏览器发出的请求。
This is kind of long,但值得阅读整篇文章,至少两次。
因此,此标头可以阻止跨源AJAX请求,因为所有浏览器都尊重它。它对"常规"没有任何作用。请求(即将URL粘贴到您的浏览器或邮递员中)。
要仅允许来自一个IP的任何类型的请求,可以检查lambda代码中的origin
或referrer
标头,但标头可能会被欺骗。 Using a WAF (Web Application Firewall) with a proper ACL (Access Control List)可能是一个更强大的解决方案。
答案 1 :(得分:1)
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
您可能也可以使用引荐来源标头来做到这一点,尽管不够安全。
答案 2 :(得分:0)
在无服务器官方文档中,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",
},