-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathgo_oauth1.go
62 lines (54 loc) · 2.16 KB
/
go_oauth1.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
package go_oauth1
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"math/rand"
"net/url"
"strconv"
"strings"
"time"
)
type OAuth1 struct {
ConsumerKey string
ConsumerSecret string
AccessToken string
AccessSecret string
}
// Params being any key-value url query parameter pairs
func (auth OAuth1) BuildOAuth1Header(method, path string, params map[string]string) string {
vals := url.Values{}
vals.Add("oauth_nonce", generateNonce())
vals.Add("oauth_consumer_key", auth.ConsumerKey)
vals.Add("oauth_signature_method", "HMAC-SHA1")
vals.Add("oauth_timestamp", strconv.Itoa(int(time.Now().Unix())))
vals.Add("oauth_token", auth.AccessToken)
vals.Add("oauth_version", "1.0")
for k, v := range params {
vals.Add(k, v)
}
// net/url package QueryEscape escapes " " into "+", this replaces it with the percentage encoding of " "
parameterString := strings.Replace(vals.Encode(), "+", "%20", -1)
// Calculating Signature Base String and Signing Key
signatureBase := strings.ToUpper(method) + "&" + url.QueryEscape(strings.Split(path, "?")[0]) + "&" + url.QueryEscape(parameterString)
signingKey := url.QueryEscape(auth.ConsumerSecret) + "&" + url.QueryEscape(auth.AccessSecret)
signature := calculateSignature(signatureBase, signingKey)
return "OAuth oauth_consumer_key=\"" + url.QueryEscape(vals.Get("oauth_consumer_key")) + "\", oauth_nonce=\"" + url.QueryEscape(vals.Get("oauth_nonce")) +
"\", oauth_signature=\"" + url.QueryEscape(signature) + "\", oauth_signature_method=\"" + url.QueryEscape(vals.Get("oauth_signature_method")) +
"\", oauth_timestamp=\"" + url.QueryEscape(vals.Get("oauth_timestamp")) + "\", oauth_token=\"" + url.QueryEscape(vals.Get("oauth_token")) +
"\", oauth_version=\"" + url.QueryEscape(vals.Get("oauth_version")) + "\""
}
func calculateSignature(base, key string) string {
hash := hmac.New(sha1.New, []byte(key))
hash.Write([]byte(base))
signature := hash.Sum(nil)
return base64.StdEncoding.EncodeToString(signature)
}
func generateNonce() string {
const allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, 48)
for i := range b {
b[i] = allowed[rand.Intn(len(allowed))]
}
return string(b)
}