123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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
- }
|