package aliyun import ( "crypto/hmac" "crypto/sha1" "encoding/base64" "encoding/json" "hospital-open-api/config" "strings" "time" ) // GetOssSignResponse 获取oss签名返回值 type GetOssSignResponse struct { AccessId string `json:"access_id"` // 主键id Host string `json:"host"` Policy string `json:"policy"` Signature string `json:"signature"` Expire int64 `json:"expire"` Callback string `json:"callback"` Dir string `json:"dir"` } // GetOssSign 获取oss签名 func GetOssSign(dir string) (*GetOssSignResponse, error) { // Endpoint := config.C.Oss.OssEndpoint // accessKey := config.C.Oss.OssAccessKey // accessSecret := config.C.Oss.OssAccessKeySecret // client, err := oss.New(Endpoint, accessKey, accessSecret) // if err != nil { // return nil, err // } // // bucket, err := client.Bucket(viper.GetString("aliyun.Bucket")) // if err != nil { // return "", err // } now := time.Now() expire := 30 // 设置该policy超时时间是30s,即这个policy过了这个有效时间,将不能访问。 end := now.Add(time.Second * time.Duration(expire)) expiration := strings.Replace(end.Format("2006-01-02T15:04:05.000Z"), "+00:00", ".000Z", 1) start := []interface{}{"starts-with", "$key", dir} conditions := [][]interface{}{start} arr := map[string]interface{}{ "expiration": expiration, "conditions": conditions, } policy, _ := json.Marshal(arr) base64Policy := base64.StdEncoding.EncodeToString(policy) stringToSign := base64Policy h := hmac.New(sha1.New, []byte(config.C.Oss.OssAccessKeySecret)) h.Write([]byte(stringToSign)) signature := base64.StdEncoding.EncodeToString(h.Sum(nil)) response := &GetOssSignResponse{ AccessId: config.C.Oss.OssAccessKey, Host: config.C.Oss.OssCustomDomainName, Policy: base64Policy, Signature: signature, Expire: end.Unix(), Callback: "", Dir: dir, } return response, nil }