64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package oppo
|
||
|
||
import (
|
||
"crypto/sha256"
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
"net/url"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
// Auth oppo auth token.
|
||
type Auth struct {
|
||
Token string
|
||
Expire int64
|
||
}
|
||
|
||
type authResponse struct {
|
||
Code int `json:"code"`
|
||
Message string `json:"message"`
|
||
Data struct {
|
||
Token string `json:"auth_token"`
|
||
CreateTime int64 `json:"create_time"` // auth token的授权时间,单位为毫秒
|
||
} `json:"data"`
|
||
}
|
||
|
||
// NewAuth get auth token.
|
||
func NewAuth(key, secret string) (a *Auth, err error) {
|
||
tm := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) // 用毫秒
|
||
params := url.Values{}
|
||
params.Add("app_key", key)
|
||
params.Add("timestamp", tm)
|
||
params.Add("sign", sign(key, secret, tm))
|
||
res, err := http.PostForm(_apiAuth, params)
|
||
if err != nil {
|
||
return
|
||
}
|
||
defer res.Body.Close()
|
||
dc := json.NewDecoder(res.Body)
|
||
resp := new(authResponse)
|
||
if err = dc.Decode(resp); err != nil {
|
||
return
|
||
}
|
||
if resp.Code == ResponseCodeSuccess {
|
||
a = &Auth{
|
||
Token: resp.Data.Token,
|
||
Expire: resp.Data.CreateTime/1000 + _authExpire,
|
||
}
|
||
return
|
||
}
|
||
err = fmt.Errorf("new access error, code(%d) description(%s)", resp.Code, resp.Message)
|
||
return
|
||
}
|
||
|
||
func sign(key, secret, timestamp string) string {
|
||
return fmt.Sprintf("%x", sha256.Sum256([]byte(key+timestamp+secret)))
|
||
}
|
||
|
||
// IsExpired judge that whether privilige expired.
|
||
func (a *Auth) IsExpired() bool {
|
||
return a.Expire <= time.Now().Add(4*time.Hour).Unix() // 提前4小时过期,for renew auth
|
||
}
|