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  }