|
package s3 |
|
|
|
import ( |
|
"crypto/hmac" |
|
"crypto/sha1" |
|
"encoding/hex" |
|
"encoding/json" |
|
"io" |
|
"net/http" |
|
"strings" |
|
) |
|
|
|
type TmpTokenResponse struct { |
|
Code int `json:"code"` |
|
Msg string `json:"msg"` |
|
Data TmpTokenResponseData `json:"data,omitempty"` |
|
} |
|
type TmpTokenResponseData struct { |
|
Credentials Credentials `json:"Credentials"` |
|
ExpiredAt int `json:"ExpiredAt"` |
|
} |
|
type Credentials struct { |
|
AccessKeyId string `json:"accessKeyId,omitempty"` |
|
SecretAccessKey string `json:"secretAccessKey,omitempty"` |
|
SessionToken string `json:"sessionToken,omitempty"` |
|
} |
|
|
|
func getCredentials(AccessKey, SecretKey string) (rst Credentials, err error) { |
|
apiPath := "/auth/tmp_token.json" |
|
reqBody, err := json.Marshal(map[string]interface{}{"channel": "OSS_FULL", "scopes": []string{"*"}}) |
|
if err != nil { |
|
return rst, err |
|
} |
|
|
|
signStr := apiPath + "\n" + string(reqBody) |
|
hmacObj := hmac.New(sha1.New, []byte(SecretKey)) |
|
hmacObj.Write([]byte(signStr)) |
|
sign := hex.EncodeToString(hmacObj.Sum(nil)) |
|
Authorization := "TOKEN " + AccessKey + ":" + sign |
|
|
|
req, err := http.NewRequest("POST", "https://api.dogecloud.com"+apiPath, strings.NewReader(string(reqBody))) |
|
if err != nil { |
|
return rst, err |
|
} |
|
req.Header.Add("Content-Type", "application/json") |
|
req.Header.Add("Authorization", Authorization) |
|
client := http.Client{} |
|
resp, err := client.Do(req) |
|
if err != nil { |
|
return rst, err |
|
} |
|
defer resp.Body.Close() |
|
ret, err := io.ReadAll(resp.Body) |
|
if err != nil { |
|
return rst, err |
|
} |
|
var tmpTokenResp TmpTokenResponse |
|
err = json.Unmarshal(ret, &tmpTokenResp) |
|
if err != nil { |
|
return rst, err |
|
} |
|
return tmpTokenResp.Data.Credentials, nil |
|
} |
|
|