OSS在private权限下的无参数访问(Nginx反向代理实现)

您所在的位置:网站首页 怎么反向匹配文件 OSS在private权限下的无参数访问(Nginx反向代理实现)

OSS在private权限下的无参数访问(Nginx反向代理实现)

2024-06-08 10:44| 来源: 网络整理| 查看: 265

本文主要介绍内容

oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险。如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用。本文会介绍如何利用nginx反向代理实现private权限下无参数访问oss资源。

运行环境说明

本文实现环境是:Centos7 系统 + nginx: 1.14.1

前期准备工作 nginx安装njs模块(使用yum安装,也可源码编译安装)

yum install nginx-module-njs

创建脚本文件

本文是将脚本放置与nginx/njs/目录下,文件名为oss-sign.js,你也可以放置到任何你喜欢的地方,只要以下提到的配置目录正确即可。

文件内容详见 代码文件

修改nginx相关配置文件

修改nginx/nginx.conf文件,修改内容如下,非修改内容省略

#--start-- 引入njs模块 load_module modules/ngx_http_js_module.so; #--end-- http { #--start-- # 以上内容省略,这段代码需放置与include之前, http代码段之中 # js_include指令后接脚本文件路径 js_include njs/oss-sign.js; # 定义签名字符串和GMT时间字符串 js_set $ossDate getGMTtime; js_set $ossAuth ossSign; #--end-- include /etc/nginx/conf.d/*.conf; } 虚拟服务主机方式

在conf.d/目录下创建oss.conf文件,内容如下

server { server_name oss.xxxxx.com; # oss域名,替换成你自己的域名 server_name_in_redirect off; # 多域名防干扰,详细说明可自行查阅 location / { # 反向代理oss地址,需替换成你的oss内网或外网地址 proxy_pass http://xxx.oss-cn-xxx-internal.aliyuncs.com; # 设置反向代理时请求header, 也是本方案核心内容 # $ossDate, $ossAuth 变量名需和nginx.conf文件内变量名一致 proxy_set_header Date $ossDate; proxy_set_header Authorization $ossAuth; } } 其他方式

具体内容视情况而定,但主要是反向代理时添加的header字段,和上面类似

重启nginx

service nginx restart

其他系统可视具体文档

结束

接下来就是见证奇迹的时刻!在浏览器里输入你的域名 + oss资源路径,然后按回车,如果不出意外,图片就能正常显示了。

_

脚本具体代码

oss-sign.js

/* 创建待签名字符串 此方法为简化版,仅处理不带url参数的oss资源地址,其他情况可结合oss文档 + ali-oss sdk 文件内signUtil模块内的buildCanonicalString方法做修改 */ function buildCanonicalString (method, resourcePath, date) { var signContent = [method.toUpperCase(), '', '', date, resourcePath] return signContent.join('\n') } /* 计算签名字符串 */ function computeSignature (accessKeySecret, canonicalString) { var signature = require('crypto').createHmac('sha1', accessKeySecret) return signature.update(canonicalString.toUTF8()).digest('base64') } /* 生成完整认证字符串 */ function authorization (accessKeyId, accessKeySecret, canonicalString) { return 'OSS ' + accessKeyId + ':' + computeSignature(accessKeySecret, canonicalString) } /* oss签名配置数据,换成你自己的PAM账号的AK和bucket */ var ossAccess = { accessKeyId: 'XXXXX', accessKeySecret: 'XXXX', bucket: 'XXX' } var GMTdate = '' /* 返回oss header date字符串 */ function getGMTtime (r) { /* 函数运行在http环境,如果有多个server最好加上判断条件来避免不必要的消耗 */ if (r.headersIn.host !== 'oss.xxxx.com') return '' /* nginx 环境下 toUTCString 函数和标准有差异, 此处做转换处理,后续njs版本升级后可能需要修改 */ var dateWords = new Date().toUTCString().split(' ') dateWords[0] += ',' dateWords[1] = [dateWords[2], dateWords[2] = dateWords[1]][0] GMTdate = dateWords.join(' ') return GMTdate } /* 返回oss header authorization字符串 */ function ossSign (r) { if (r.headersIn.host !== 'oss.xxxx.com') return '' var method = r.method var canonicalString = buildCanonicalString(method, '/' + ossAccess.bucket + r.uri, GMTdate) return authorization(ossAccess.accessKeyId, ossAccess.accessKeySecret, canonicalString) }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3