You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

65 lines
1.6 KiB

package huawei
// http://developer.huawei.com/consumer/cn/service/hms/catalog/huaweipush.html?page=hmssdk_huaweipush_api_reference_s1
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
const (
_accessTokenURL = "https://login.vmall.com/oauth2/token"
_grantType = "client_credentials"
_respCodeSuccess = 0
)
// Access huawei access token.
type Access struct {
AppID string
Token string
Expire int64
}
type accessResponse struct {
Token string `json:"access_token"`
Expire int64 `json:"expires_in"` // Access Token的有效期,以秒为单位
Scope string `json:"scope"` // Access Token的访问范围,即用户实际授予的权限列表
Code int `json:"error"`
Desc string `json:"error_description"`
}
// NewAccess get token.
func NewAccess(clientID, clientSecret string) (a *Access, err error) {
params := url.Values{}
params.Add("grant_type", _grantType)
params.Add("client_id", clientID)
params.Add("client_secret", clientSecret)
res, err := http.PostForm(_accessTokenURL, params)
if err != nil {
return
}
defer res.Body.Close()
dc := json.NewDecoder(res.Body)
resp := new(accessResponse)
if err = dc.Decode(resp); err != nil {
return
}
if resp.Code == _respCodeSuccess {
a = &Access{
AppID: clientID,
Token: resp.Token,
Expire: time.Now().Unix() + resp.Expire,
}
return
}
err = fmt.Errorf("new access error, code(%d) description(%s)", resp.Code, resp.Desc)
return
}
// IsExpired judge that whether privilige expired.
func (a *Access) IsExpired() bool {
return a.Expire <= time.Now().Add(8*time.Hour).Unix() // 提前8小时过期,for renew auth
}