无服务器 aws Cors 设置
Serverless aws Cors setting
我正在构建无服务器应用程序,希望限制只有 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",
},
但它对 public 开放。任何拥有无服务器 url 的人都可以访问,并查看 json 输出。
我应该更改哪一部分?
Access-Control-Allow-Origin
header 涉及(许多类型的)cross-origin AJAX 请求。它不是通用的访问控制机制。
AJAX(有点过时的术语?),我本质上是指通过 javascript 来自浏览器的请求。
This is kind of long,但整本书值得一读,至少两遍。
所以这个header可以阻止cross-originAJAX请求,因为所有浏览器都尊重它。它对 "regular" 请求没有任何作用(即将 URL 粘贴到您的浏览器或 Postman)。
要仅允许来自一个 IP 的任何类型的请求,您可以检查您的 lambda 代码中的 origin
或 referrer
header , 但 headers 可以被欺骗。 Using a WAF (Web Application Firewall) with a proper ACL (Access Control List) 可能是更可靠的解决方案。
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
您也可以使用推荐人 headers 执行此操作,但不那么安全。
在 Serverless 官方文档中,APIGateway 配置只接受 origin: 'value'
。我认为您可以使用 "correct" 设置和组合响应 header:
重试
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",
},
我正在构建无服务器应用程序,希望限制只有 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",
},
但它对 public 开放。任何拥有无服务器 url 的人都可以访问,并查看 json 输出。
我应该更改哪一部分?
Access-Control-Allow-Origin
header 涉及(许多类型的)cross-origin AJAX 请求。它不是通用的访问控制机制。
AJAX(有点过时的术语?),我本质上是指通过 javascript 来自浏览器的请求。
This is kind of long,但整本书值得一读,至少两遍。
所以这个header可以阻止cross-originAJAX请求,因为所有浏览器都尊重它。它对 "regular" 请求没有任何作用(即将 URL 粘贴到您的浏览器或 Postman)。
要仅允许来自一个 IP 的任何类型的请求,您可以检查您的 lambda 代码中的 origin
或 referrer
header , 但 headers 可以被欺骗。 Using a WAF (Web Application Firewall) with a proper ACL (Access Control List) 可能是更可靠的解决方案。
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
您也可以使用推荐人 headers 执行此操作,但不那么安全。
在 Serverless 官方文档中,APIGateway 配置只接受 origin: 'value'
。我认为您可以使用 "correct" 设置和组合响应 header:
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",
},