政务云OSS为了安全考虑,BUCKET一股脑全部要求私有。这样直接导致了一些公开的资源被迫做鉴权处理了。然后分析业务,其实多此一举。
我理解的私有OSS只是对一些敏感的资源做存储,然后针对用户权限做开放处理,比如只有用于权限的用户,才能获取OSS的AccessKey, AccessSecret,生成图片签名,
预览下载资源文件。也就是说,业务上分2个BUCKET, 公开的传共有读OOS, 敏感的传私有OSS, 而不是以安全为理由,全部私有化。
得知这个消息,心中几万只cnm, 然而事情还是的做。应为已经有了历史文件,想到的办法就是通过nginx匹配路径做方向代理处理。
方案1: NGINX匹配上路径后,转发到后端的服务,有后端的服务生成代签名的URL, 并返回302做重定向。
方案2: NGINX匹配上路径后,转发到后端的服务,有后端的服务生成代签名的URL, 并获取内容,直接返回前端资源文件流。
方案3: NGINX匹配上路径后, 通过NGINX的LUA脚本实现签名生成,添加头,并方向代理到私有OSS地址。
综合考虑开发成本,选用第三种方案,对历史文件,新有的业务没有任何影响。方案1,2需要多出一个服务来。
代码如下简单搞定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| location ~* ^/assets { if ($request_method = 'OPTIONS') { return 204 ; } set_by_lua_block $gmt_time { local time = os.time() - 8 * 3600 return os.date("%a, %d %b %Y %X GMT", time) } set_by_lua_block $signature { local accessKeyId = "KEYID" local accessKeySecret = "SECRET" local bucket = "BUCKET" local data = string.format("%s\n\n\n%s\n/%s%s", ngx.req.get_method(), ngx.var.gmt_time, bucket, ngx.var.uri) local signature = ngx.encode_base64(ngx.hmac_sha1(accessKeySecret, data)) return string.format("OSS %s:%s", accessKeyId, signature) } proxy_set_header Date $gmt_time; proxy_set_header Authorization $signature; proxy_pass http://private-oss.internat.net; }
|
PS: 已经很长一段时间没有输出了,佛系更 :)