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

搭建服务端

场景:需要在移动端平台通过 API 上传、查看 COS 上的内容,调用API时需要密钥验证,因此先在本地搭建测试一下功能是否完好。
理由:如果将固定密钥配置到代码内,有泄漏风险。使用临时密钥+子用户可以更好的处理权限控制问题,因为COS有着丰富的权限控制功能。
流程图:

官网的仓库:

1
2
3
4
5
https:
//gi
thub.com
/tencentyun/
qcloud-cos-sts-sdk

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

1
2
3
4
5
6
7
8
9
10
11
12
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
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
secretId: 
'xxxxxxxxxxx'
,
//
固定密钥
secretKey:
'xxxxxxxxxxxxxx'
,
//
固定密钥
bucket:
'xxx=100000000000'
,
//
桶名称
region:
'ap-xxxxxxx'
,
//
所属地域
allowPrefix :
'xxx/xx'
//
设置路径前缀,生产建议避免直接用*
//
将文件下方的这几行注释掉,否则控制台会报错(因为
个send)
//
app.all(
'*'
,
function
(req, res,
next
) {
//
res.writeHead(
);
//
res.send({code:
, codeDesc:
'PageNotFound'
, message:
'404 page not found'
});
//
});
app.listen(xxxx);
//
端口,建议自定义

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

1
2
3
4
5
6
7
8
node sts-server.js  
//
控制台输出 app is listening at http:
//
.0
.
.1
:xxxx

然后 IP + PORT访问。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"expiredTime"
:
,
"expiration"
:
"2023-07-12T09:31:38Z"
,
"credentials"
:
{
"sessionToken"
:
"xxxxxxxxxxxxxxxxx"
,
"tmpSecretId"
:
"xxx"
,
"tmpSecretKey"
:
"xxx"
}
,
"requestId"
:
"963895d4-dd71-4f6b-94e9-4ea4df50c6df"
,
"startTime"
:
}

从COS签名工具获取签名串

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

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

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

1
2
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.top/2023/07/12/NodeJS 方式搭建腾讯云 STS 临时密钥服务端/
作者
小周
发布于
2023年7月12日
许可协议