|
|
|
package auth
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/hmac"
|
|
|
|
"crypto/sha256"
|
|
|
|
"encoding/base64"
|
|
|
|
b64 "encoding/base64"
|
|
|
|
"encoding/hex"
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Auther struct {
|
|
|
|
AccessID string
|
|
|
|
SecretKey string
|
|
|
|
}
|
|
|
|
|
|
|
|
var UseSignAuthored = true
|
|
|
|
|
|
|
|
func (a *Auther) Auth(req *http.Request, useSignAuthored bool, auth Auther, reqBody string) {
|
|
|
|
|
|
|
|
if useSignAuthored {
|
|
|
|
now := time.Now()
|
|
|
|
timeStamp := now.Unix()
|
|
|
|
req.Header.Add("AccessId", auth.AccessID)
|
|
|
|
req.Header.Add("TimeStamp", strconv.Itoa(int(timeStamp)))
|
|
|
|
sign := GenSign(uint64(timeStamp), auth.AccessID, auth.SecretKey, reqBody)
|
|
|
|
req.Header.Add("Sign", sign)
|
|
|
|
} else {
|
|
|
|
author := makeAuthHeader(a.AccessID, a.SecretKey)
|
|
|
|
//log.Printf("author string:%v", author)
|
|
|
|
req.Header.Add("Authorization", author)
|
|
|
|
}
|
|
|
|
//req.Header.Add("Content-Type", "application/json")
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeAuthHeader(appID, secretKey string) string {
|
|
|
|
base64Str := base64.StdEncoding.EncodeToString(
|
|
|
|
[]byte(
|
|
|
|
fmt.Sprintf("%s:%s", appID, secretKey),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
return fmt.Sprintf("Basic %s", base64Str)
|
|
|
|
}
|
|
|
|
|
|
|
|
func GenSign(timeStamp uint64, accessId string, secretKey, requestBody string) string {
|
|
|
|
signBody := strconv.Itoa(int(timeStamp)) + accessId + requestBody
|
|
|
|
// Create a new HMAC by defining the hash type and the key (as byte array)
|
|
|
|
h := hmac.New(sha256.New, []byte(secretKey))
|
|
|
|
// Write Map to it
|
|
|
|
h.Write([]byte(signBody))
|
|
|
|
|
|
|
|
// Get result and encode as hexadecimal string
|
|
|
|
sha := hex.EncodeToString(h.Sum(nil))
|
|
|
|
//fmt.Println()
|
|
|
|
//fmt.Println("timeStamp: " + strconv.Itoa(int(timeStamp)) + " accessID:" + accessId + " body:" + requestBody)
|
|
|
|
sEnc := b64.StdEncoding.EncodeToString([]byte(sha))
|
|
|
|
//fmt.Println("final Result " + sEnc)
|
|
|
|
return sEnc
|
|
|
|
}
|