NodeJS 方式搭建腾讯云 STS 临时密钥服务端

搭建服务端

场景:需要在移动端平台通过 API 上传、查看 COS 上的内容,调用API时需要密钥验证,因此先在本地搭建测试一下功能是否完好。

理由:如果将固定密钥配置到代码内,有泄漏风险。使用临时密钥+子用户可以更好的处理权限控制问题,因为COS有着丰富的权限控制功能。

流程图:

官网的仓库:

1
https://github.com/tencentyun/qcloud-cos-sts-sdk

拉取代码到本地(我的是CVM)后,可以查看NodeJS目录中的demo使用的是Express框架,因此这里全局安装一下Express及其所需的包,先更新下npm

1
2
3
4
cd qcloud-cos-sts-sdk/nodejs/demo/
npm install -g npm@latest
npm install express-generator -g # 全局安装express
npm install body-parser request express # 安装所需要的包模块

修改sts-server.js的参数,主要是下面几点。建议开一个子用户专门给COS使用,不要用主账号的ID 和Key

1
2
3
4
5
6
7
8
9
10
11
 secretId: 'xxxxxxxxxxx', // 固定密钥
secretKey: 'xxxxxxxxxxxxxx', // 固定密钥
bucket: 'xxx=100000000000', // 桶名称
region: 'ap-xxxxxxx', //所属地域
allowPrefix : 'xxx/xx' // 设置路径前缀,生产建议避免直接用*
// 将文件下方的这几行注释掉,否则控制台会报错(因为2个send)
//app.all('*', function (req, res, next) {
// res.writeHead(404);
// res.send({code: 404, codeDesc: 'PageNotFound', message: '404 page not found'});
//});
app.listen(xxxx); // 端口,建议自定义

调整完了就OK 了,sts-server-scope.js不用管它,启动服务,如果是云服务器记得在安全组策略开对应的端口。

1
node sts-server.js  //控制台输出 app is listening at http://127.0.0.1:xxxx

然后 IP + PORT访问。

1
http://xx.xx.xx.xx:xxxx/sts

接着就会在页面返回一个对象,内容大概是这样的格式。若需的部分就是sessionTokentmpSecretIdtmpSecretKey这三个。

1
2
3
4
5
{"expiredTime":1689154298,"expiration":"2023-07-12T09:31:38Z","credentials":{"sessionToken":"xxxxxxxxxxxxxxxxx",
"tmpSecretId":"xxx",
"tmpSecretKey":"xxx"
},
"requestId":"963895d4-dd71-4f6b-94e9-4ea4df50c6df","startTime":1689152498}

从COS签名工具获取签名串

在测试期间,在COS签名工具-计算签名处 来获取签名串。工具链接:https://cos5.cloud.tencent.com/static/cos-sign/

1
2
3
4
5
6
签名类型:默认
签名有效时间:每次生成前点击【获取】更新即可
SecretId:将临时签名返回的 tmpSecretId 填入
SecretKey:将临时签名返回的 tmpSecretKey 填入
HttpMethod:默认PUT
HttpURI:路径需要带上sts-server.js中allowPrefix字段设置的目录(如果设置了的话)

点击【生成签名】,右侧结果反馈里会生成一串内容

1
q-sign-algorithm……

验证临时密钥有效性

将COS签名工具生成的签名串传入HTTP请求头中的Authorization字段,将临时密钥返回的sessionToken传入请求头的x-cos-security-token字段,即可发起请求验证。

可以看到200的返回码,验证通过。

路径问题:

如果sts-server.jsallowPrefix字段设置的是clouds/Daily/*

那么在测试时,COS签名工具里HttpURI字段需要带上这些,例如:/clouds/Daily/2.jpg

然后在发起put请求时,也需要在末尾带上该部分

验证失败:
可根据错误提示,查看官方文档:https://cloud.tencent.com/document/product/436/54303#message-.E4.B8.BA-.E2.80.9Caccess-denied..E2.80.9D

本文参考官方文档搭建:https://cloud.tencent.com/developer/article/1675803

临时密钥生成及使用官方文档:https://cloud.tencent.com/document/product/436/14048


NodeJS 方式搭建腾讯云 STS 临时密钥服务端
https://zhouyinglin.cn/post/f1f207d2.html
作者
小周
发布于
2023年7月12日
更新于
2023年7月12日
许可协议