1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
token.go 2.77 KB
一键复制 编辑 原始数据 按行查看 历史
huqiuyun 提交于 2022-07-29 01:58 . 支持 阿里云临时上传 token
package alyoss
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"gitee.com/h79/goutils/common/filemgr/config"
"hash"
"io"
"time"
)
func getGmtIso8601(expireEnd int64) string {
var tokenExpire = time.Unix(expireEnd, 0).Format("2006-01-02T15:04:05Z")
return tokenExpire
}
type ConfigStruct struct {
Expiration string `json:"expiration"`
Conditions [][]string `json:"conditions"`
}
type PolicyToken struct {
AccessKeyId string `json:"accessId"`
Host string `json:"host"`
Expire int64 `json:"expire"`
Signature string `json:"signature"`
Policy string `json:"policy"`
Directory string `json:"dir"`
Callback string `json:"callback"`
}
type CallbackParam struct {
CallbackUrl string `json:"callbackUrl"`
CallbackBody string `json:"callbackBody"`
CallbackBodyType string `json:"callbackBodyType"`
}
const DefaultCallbackBody = "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}"
const DefaultCallbackBodyType = "application/x-www-form-urlencoded"
func GetCallbackParam(callback string) CallbackParam {
return CallbackParam{
CallbackUrl: callback,
CallbackBody: DefaultCallbackBody,
CallbackBodyType: DefaultCallbackBodyType,
}
}
// GetPolicyToken 产生一个临时的上传token
func (of *OssFile) GetPolicyToken(objBucketInfo config.BucketInfo, callbackParam CallbackParam, uploadDir string) (PolicyToken, error) {
if len(uploadDir) == 0 {
uploadDir = objBucketInfo.DefaultUploadDir
}
if len(callbackParam.CallbackUrl) <= 0 {
callbackParam.CallbackUrl = of.config.TokenCallbackUrl
}
now := time.Now().Unix()
expireEnd := now + of.config.Expires
var tokenExpire = getGmtIso8601(expireEnd)
// create post policy json
var objConf ConfigStruct
var condition []string
condition = append(condition, "starts-with")
condition = append(condition, "$key")
condition = append(condition, uploadDir)
objConf.Conditions = append(objConf.Conditions, condition)
objConf.Expiration = tokenExpire
// calculate signature
bytes, err := json.Marshal(objConf)
if err != nil {
return PolicyToken{}, err
}
deByte := base64.StdEncoding.EncodeToString(bytes)
h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(of.config.SecretKey))
_, err = io.WriteString(h, deByte)
if err != nil {
return PolicyToken{}, err
}
signed := base64.StdEncoding.EncodeToString(h.Sum(nil))
callbackStr, err := json.Marshal(callbackParam)
if err != nil {
return PolicyToken{}, err
}
callbackBase64 := base64.StdEncoding.EncodeToString(callbackStr)
return PolicyToken{
AccessKeyId: of.config.AccessKey,
Host: objBucketInfo.Host,
Expire: expireEnd,
Signature: signed,
Directory: uploadDir,
Policy: deByte,
Callback: callbackBase64,
}, nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.5.6

搜索帮助

A270a887 8829481 3d7a4017 8829481