如何在TOS中配置 CORS 并使用 curl 命令确认 CORS 规则?

存储基础存储服务技术服务知识库
问题描述

想设置允许跨域访问TOS存储桶中的资源,但收到跨域错误消息,如何测试是否配置成功?

问题分析

可以使用 TOS 控制台或 API 将跨源资源共享 (CORS) 规则应用于存储桶。要测试存储桶上的 CORS 规则是否成功,可以使用 curl 命令进行测试。

解决方案

当 TOS 收到跨域请求或 OPTIONS 请求时,会读取存储桶对应的 CORS 规则,进行相应的权限检查并返回相应的 Header,保证跨域传输数据的安全性。

1、如果您向未配置 CORS 规则的TOS存储桶发出跨源请求,则不会返回 CORS 标头。

如下:

──(root)-[~]
└─# curl -i https://wanyix-xxxx.tos-cn-beijing.volces.com/test.py  -H "Origin: example.com"
HTTP/1.1 200 OK
Content-Type: multipart/form-data; boundary=aaaeee59bfb0d3f0d16fc12cf8c42891
Content-Length: 181
Connection: keep-alive
Accept-Ranges: bytes
Date: Mon, 06 Jun 2022 09:41:05 GMT
ETag: "bcca0e55a87efb059e0a6315ba755915"
Last-Modified: Tue, 07 Sep 2021 10:25:41 GMT
x-tos-id-2: 839b0b6932b7e5f26607a462151b67a4-ac17cf0d
x-tos-request-id: 839b0b6932b7e5f26607a462151b67a4-ac17cf0d
x-tos-server-time: 9
x-tos-storage-class: STANDARD
x-tos-version-id: null
Strict-Transport-Security: max-age=15724800; includeSubDomains

从上面可以看出,并未返回跨域相关的标头,如果向存储桶发出了类似的跨域请求,则不会成功显示此内容,浏览器会将其拦截。要允许您的内容显示,请在您的TOS存储桶上配置 CORS策略。正确配置 CORS 策略可确保返回适当的标头。

2、使用 TOS 控制台配置 CORS 规则。

进入到 TOS 控制台,选择要配置的桶,选择权限管理-跨域访问设置-创建规则进行配置。 具体配置如下: 图片

3、测试 CORS 规则。

使用 curl 测试 CORS 规则,如下:

┌──(root)-[~]
└─# curl -i https://wanyix-xxxx.tos-cn-beijing.volces.com/test.py  -H "Origin: example.com"
HTTP/1.1 200 OK
Content-Type: multipart/form-data; boundary=aaaeee59bfb0d3f0d16fc12cf8c42891
Content-Length: 181
Connection: keep-alive
Accept-Ranges: bytes
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Allow-Origin: example.com
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
Date: Mon, 06 Jun 2022 09:54:48 GMT
ETag: "bcca0e55a87efb059e0a6315ba755915"
Last-Modified: Tue, 07 Sep 2021 10:25:41 GMT
x-tos-id-2: a916459c7cc0fe7bd392e7b9007b5d35-ac1f910c
x-tos-request-id: a916459c7cc0fe7bd392e7b9007b5d35-ac1f910c
x-tos-server-time: 9
x-tos-storage-class: STANDARD
x-tos-version-id: null
Strict-Transport-Security: max-age=15724800; includeSubDomains

如果 CORS 规则配置正确,会收到200 OK 响应,并且返回了相应的标头。 访问 CORS 规则没有指定的方法,测试结果如下:

┌──(root)-[~]
└─# curl -i https://wanyix-xxxx.tos-cn-beijing.volces.com/test.py  -H "Origin: example.com" -H "Access-Control-Request-Method: POST"     --request OPTIONS
HTTP/1.1 403 Forbidden
Content-Type: application/json
Content-Length: 360
Connection: keep-alive
Date: Mon, 06 Jun 2022 10:05:36 GMT
x-tos-id-2: 1ea7a57fb4782bd9c2a7aa9cb7e5bc8f-ac107d0f
x-tos-request-id: 1ea7a57fb4782bd9c2a7aa9cb7e5bc8f-ac107d0f
x-tos-server-time: 1
Strict-Transport-Security: max-age=15724800; includeSubDomains

{"Code":"AccessDenied","RequestId":"1ea7a57fb4782bd9c2a7aa9cb7e5bc8f-ac107d0f","HostId":"NoJnJzrtsZlqRoTdWuqLPGdBVDJLRvpG","Message":"CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Requet-Headers are not whitelisted by the resource's CORS spec"}           

上述结果可以看到,CORS 规则中只允许了GET跟 HEAD 方法,并没有允许 POST 方法,所以使用 POST 方法访问时被拒绝。 然后修改CORS规则,添加 POST 方法,再进行测试,如下:

┌──(rootkali)-[~]
└─# curl -i https://wanyix-xxxx.tos-cn-beijing.volces.com/test.py  -H "Origin: example.com" -H "Access-Control-Request-Method: POST" --request OPTIONS
HTTP/1.1 200 OK
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, HEAD, POST
Access-Control-Allow-Origin: example.com
Access-Control-Expose-Headers: *
Access-Control-Max-Age: 3600
Date: Mon, 06 Jun 2022 10:12:41 GMT
x-tos-id-2: 30380a94a306da02929eed8ae72f6b0b-ac162510
x-tos-request-id: 30380a94a306da02929eed8ae72f6b0b-ac162510
x-tos-server-time: 1
Strict-Transport-Security: max-age=15724800; includeSubDomains

如果您有其他问题,欢迎您联系火山引擎技术支持服务

55
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论