gitee.com/h79/goutils@v1.22.10/common/file/alyoss/token.go (about) 1 package alyoss 2 3 import ( 4 "crypto/hmac" 5 "crypto/sha1" 6 "encoding/base64" 7 "encoding/json" 8 "gitee.com/h79/goutils/common/file/config" 9 "hash" 10 "io" 11 "time" 12 ) 13 14 func getGmtIso8601(expireEnd int64) string { 15 var tokenExpire = time.Unix(expireEnd, 0).Format("2006-01-02T15:04:05Z") 16 return tokenExpire 17 } 18 19 type ConfigStruct struct { 20 Expiration string `json:"expiration"` 21 Conditions [][]string `json:"conditions"` 22 } 23 24 type PolicyToken struct { 25 AccessKeyId string `json:"accessId"` 26 Host string `json:"host"` 27 Expire int64 `json:"expire"` 28 Signature string `json:"signature"` 29 Policy string `json:"policy"` 30 Directory string `json:"dir"` 31 Callback string `json:"callback"` 32 } 33 34 type CallbackParam struct { 35 CallbackUrl string `json:"callbackUrl"` 36 CallbackBody string `json:"callbackBody"` 37 CallbackBodyType string `json:"callbackBodyType"` 38 } 39 40 const DefaultCallbackBody = "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}" 41 const DefaultCallbackBodyType = "application/x-www-form-urlencoded" 42 43 func GetCallbackParam(callback string) CallbackParam { 44 return CallbackParam{ 45 CallbackUrl: callback, 46 CallbackBody: DefaultCallbackBody, 47 CallbackBodyType: DefaultCallbackBodyType, 48 } 49 } 50 51 // GetPolicyToken 产生一个临时的上传token 52 func (of *OssFile) GetPolicyToken(objBucket config.Bucket, callbackParam CallbackParam, uploadDir string) (PolicyToken, error) { 53 54 if len(uploadDir) == 0 { 55 uploadDir = objBucket.DefaultUploadDir 56 } 57 58 if len(callbackParam.CallbackUrl) <= 0 { 59 callbackParam.CallbackUrl = of.config.TokenCallbackUrl 60 } 61 62 now := time.Now().Unix() 63 expireEnd := now + of.config.Expires 64 var tokenExpire = getGmtIso8601(expireEnd) 65 66 // create post policy json 67 var objConf ConfigStruct 68 var condition []string 69 condition = append(condition, "starts-with") 70 condition = append(condition, "$key") 71 condition = append(condition, uploadDir) 72 objConf.Conditions = append(objConf.Conditions, condition) 73 objConf.Expiration = tokenExpire 74 75 // calculate signature 76 bytes, err := json.Marshal(objConf) 77 if err != nil { 78 return PolicyToken{}, err 79 } 80 deByte := base64.StdEncoding.EncodeToString(bytes) 81 h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(of.config.SecretKey)) 82 _, err = io.WriteString(h, deByte) 83 if err != nil { 84 return PolicyToken{}, err 85 } 86 signed := base64.StdEncoding.EncodeToString(h.Sum(nil)) 87 88 callbackStr, err := json.Marshal(callbackParam) 89 if err != nil { 90 return PolicyToken{}, err 91 } 92 callbackBase64 := base64.StdEncoding.EncodeToString(callbackStr) 93 94 return PolicyToken{ 95 AccessKeyId: of.config.AccessKey, 96 Host: objBucket.Host, 97 Expire: expireEnd, 98 Signature: signed, 99 Directory: uploadDir, 100 Policy: deByte, 101 Callback: callbackBase64, 102 }, nil 103 }