-
Notifications
You must be signed in to change notification settings - Fork 27
/
sign.go
81 lines (74 loc) · 2 KB
/
sign.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package oss
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"github.com/deadblue/elevengo/internal/util"
"strings"
)
type RequestMetadata struct {
// Request verb
Verb string
// Request header
Header map[string]string
// OSS bucket name
Bucket string
// OSS object name
Object string
// OSS Parameters
Params map[string]string
}
// CalculateAuthorization calculates authorization for OSS request
func CalculateAuthorization(metadata *RequestMetadata, keyId string, keySecret string) string {
// Create signer
signer := hmac.New(sha1.New, []byte(keySecret))
wx := util.UpgradeWriter(signer)
// Common parameters
contentMd5 := metadata.Header[HeaderContentMd5]
contentType := metadata.Header[HeaderContentType]
date := metadata.Header[HeaderDate]
wx.MustWriteString(metadata.Verb, "\n", contentMd5, "\n", contentType, "\n", date, "\n")
// Canonicalized OSS Headers
headers := make([]*Pair, 0, len(metadata.Header))
for name, value := range metadata.Header {
name = strings.ToLower(name)
if strings.HasPrefix(name, headerPrefixOss) {
headers = append(headers, &Pair{
First: name,
Last: value,
})
}
}
sortPairs(headers)
for _, header := range headers {
wx.MustWriteString(header.First, ":", header.Last, "\n")
}
// Canonicalized Resource
wx.MustWriteString("/", metadata.Bucket, "/", metadata.Object)
// Sub resources
if metadata.Params != nil && len(metadata.Params) > 0 {
params := make([]*Pair, 0, len(metadata.Params))
for name, value := range metadata.Params {
if _, ok := signingKeyMap[name]; ok {
params = append(params, &Pair{
First: name,
Last: value,
})
}
}
sortPairs(params)
for index, param := range params {
if index == 0 {
wx.MustWriteString("?", param.First)
} else {
wx.MustWriteString("&", param.First)
}
if param.Last != "" {
wx.MustWriteString("=", param.Last)
}
}
}
signature := base64.StdEncoding.EncodeToString(signer.Sum(nil))
return fmt.Sprintf("OSS %s:%s", keyId, signature)
}