平常在使用阿里云 oss 客户端时,阿里云会给你一个key 和 secret,登录后就可以直接上传了。但是如果用户在网页端,想上传文件到阿里云 oss 上,是不能直接放 key 和 secret 在网页上的,因为一旦别人拿了你的用户名和密码,就可以为所欲为了
但是可以在后端给前端生成一个 token,这样可以让用户在不使用 key 和 secret 的情况下,也可以上传数据到你的服务器上
代码如下:
这里是用 express 写的
const express = require('express')
const crypto = require("crypto")
const app = express()
const config = {
dirPath: 'xxx/', // 存放到哪个目录下
bucket: '你的 Bucket 的名称',
region: 'oss-cn-hangzhou',// 我的是 hangzhou
accessKeyId: '你的 key',
accessKeySecret: '你的密码',
expAfter: 300000, // 签名失效时间,毫秒
maxSize: 1048576000 // 文件最大的 size
}
app.get('/osstoken', (req, res) => {
const host = `https://${config.bucket}.${config.region}.aliyuncs.com`
const expireTime = new Date().getTime() + config.expAfter
const expiration = new Date(expireTime).toISOString()
const policyString = JSON.stringify({
expiration,
conditions: [
['content-length-range', 0, config.maxSize],
['starts-with', '$key', config.dirPath]
]
})
const policy = Buffer.from(policyString).toString('base64')
const signature = crypto.createHmac('sha1', config.accessKeySecret).update(policy).digest("base64")
res.json({
signature,
policy,
host,
'OSSAccessKeyId': config.accessKeyId,
'key': expireTime,
'success_action_status': 201,
'dirPath': config.dirPath,
})
})
这里的 signature 就是前端需要的签名
下次有空写一下前端是怎么用这些数据的