Skip to content

Commit

Permalink
给获取access_token加上独占锁
Browse files Browse the repository at this point in the history
  • Loading branch information
icepy committed Apr 22, 2018
1 parent 57686cf commit 2da669c
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 9 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ DingTalk Golang SDK https://github.com/icepy

# Feature Overview

- 支持ISV,企业,SSO,SNS免登
- 支持企业,SSO,SNS免登
- 支持对access_token自动续期过期管理
- 支持注册钉钉事件回调
- 支持对钉钉事件回调消息签名的加解密
Expand Down
Binary file added __test__/c4c32edc5910dbc23ca89530aefc50a2.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions src/dingtalk.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dingtalk

import (
"net/http"
"sync"
"time"
)

Expand Down Expand Up @@ -41,6 +42,8 @@ type DingTalkClient struct {
SSOAccessTokenCache Cache
SNSAccessTokenCache Cache
SuiteAccessTokenCache Cache
DevType string
Locker *sync.Mutex
}

type TopConfig struct {
Expand All @@ -65,6 +68,12 @@ type DTConfig struct {
SNSSecret string
}

type DTIsvGetCompanyInfo struct {
AuthCorpID string
PermanentCode string
AuthAccessToken string
}

func NewDingTalkClient(devType string, config *DTConfig) *DingTalkClient {
c := &DingTalkClient{
DTConfig: &DTConfig{},
Expand All @@ -83,6 +92,8 @@ func NewDingTalkClient(devType string, config *DTConfig) *DingTalkClient {
SSOAccessTokenCache: NewFileCache("." + devType + "_sso_acess_token_file"),
SNSAccessTokenCache: NewFileCache("." + devType + "_sns_access_token_file"),
SuiteAccessTokenCache: NewFileCache("." + devType + "_suite_access_token_file"),
Locker: new(sync.Mutex),
DevType: devType,
}
if config != nil {
if config.TopFormat != "" {
Expand Down
17 changes: 16 additions & 1 deletion src/open_api_auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,13 @@ func (e *SuiteAccessTokenResponse) ExpiresIn() int {

// 刷新企业获取的access_token
func (dtc *DingTalkClient) RefreshCompanyAccessToken() error {
dtc.Locker.Lock()
var data AccessTokenResponse
err := dtc.AccessTokenCache.Get(&data)
if err == nil {
dtc.AccessToken = data.AccessToken
fmt.Printf("Get access_token To Local Cache=%s\n", dtc.AccessToken)
dtc.Locker.Unlock()
return nil
}
params := url.Values{}
Expand All @@ -112,17 +114,20 @@ func (dtc *DingTalkClient) RefreshCompanyAccessToken() error {
data.Expires = data.Expires | 7200
data.Created = time.Now().Unix()
err = dtc.AccessTokenCache.Set(&data)
dtc.Locker.Unlock()
}
return err
}

// 刷新企业获取的sso_access_token
func (dtc *DingTalkClient) RefreshCompanySSOAccessToken() error {
func (dtc *DingTalkClient) RefreshSSOAccessToken() error {
dtc.Locker.Lock()
var data SSOAccessTokenResponse
err := dtc.SSOAccessTokenCache.Get(&data)
if err == nil {
dtc.SSOAccessToken = data.SSOAccessToken
fmt.Printf("Get sso_access_token To Local Cache=%s\n", dtc.SSOAccessToken)
dtc.Locker.Unlock()
return nil
}
params := url.Values{}
Expand All @@ -134,17 +139,20 @@ func (dtc *DingTalkClient) RefreshCompanySSOAccessToken() error {
data.Expires = data.Expires | 7200
data.Created = time.Now().Unix()
err = dtc.SSOAccessTokenCache.Set(&data)
dtc.Locker.Unlock()
}
return err
}

// 刷新 SNS access_token
func (dtc *DingTalkClient) RefreshSNSAccessToken() error {
dtc.Locker.Lock()
var data SNSAccessTokenResponse
err := dtc.SNSAccessTokenCache.Get(&data)
if err == nil {
dtc.SNSAccessToken = data.SNSAccessToken
fmt.Printf("Get sns_access_token To Local Cache=%s\n", dtc.SNSAccessToken)
dtc.Locker.Unlock()
return nil
}
params := url.Values{}
Expand All @@ -156,17 +164,20 @@ func (dtc *DingTalkClient) RefreshSNSAccessToken() error {
data.Expires = data.Expires | 7200
data.Created = time.Now().Unix()
err = dtc.SNSAccessTokenCache.Set(&data)
dtc.Locker.Unlock()
}
return err
}

// 刷新 isv suite_access_token
func (dtc *DingTalkClient) RefreshSuiteAccessToken() error {
dtc.Locker.Lock()
var data SuiteAccessTokenResponse
err := dtc.SuiteAccessTokenCache.Get(&data)
if err == nil {
dtc.SuiteAccessToken = data.SuiteAccessToken
fmt.Printf("Get suite_access_token To Local Cache=%s\n", dtc.SuiteAccessToken)
dtc.Locker.Unlock()
return nil
}
info := map[string]string{
Expand All @@ -180,21 +191,25 @@ func (dtc *DingTalkClient) RefreshSuiteAccessToken() error {
data.Expires = data.Expires | 7200
data.Created = time.Now().Unix()
err = dtc.SuiteAccessTokenCache.Set(&data)
dtc.Locker.Unlock()
}
return err
}

// 获取Ticket
func (dtc *DingTalkClient) GetJSAPITicket() (ticket string, err error) {
dtc.Locker.Lock()
var data TicketResponse
err = dtc.TicketCache.Get(&data)
if err == nil {
dtc.Locker.Unlock()
return data.Ticket, err
}
err = dtc.httpRPC("get_jsapi_ticket", nil, nil, &data)
if err == nil {
ticket = data.Ticket
dtc.TicketCache.Set(&data)
dtc.Locker.Unlock()
}
return ticket, err
}
Expand Down
35 changes: 28 additions & 7 deletions src/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,29 @@ import (
)

func (dtc *DingTalkClient) httpRPC(path string, params url.Values, requestData interface{}, responseData Unmarshallable) error {
if dtc.AccessToken != "" {
if params == nil {
params = url.Values{}
}
if params.Get("access_token") == "" {
params.Set("access_token", dtc.AccessToken)
if dtc.DevType == "company" {
if dtc.AccessToken != "" {
if params == nil {
params = url.Values{}
}
if params.Get("access_token") == "" {
params.Set("access_token", dtc.AccessToken)
}
}
}
// if dtc.DevType == "isv" {
// switch v := isvGetCInfo.(type) {
// case *DTIsvGetCompanyInfo:
// if v.AuthAccessToken != "" {
// if params == nil {
// params = url.Values{}
// }
// if params.Get("access_token") == "" {
// params.Set("access_token", v.AuthAccessToken)
// }
// }
// }
// }
return dtc.httpRequest("oapi", path, params, requestData, responseData)
}

Expand Down Expand Up @@ -55,14 +70,20 @@ func (dtc *DingTalkClient) httpSSO(path string, params url.Values, requestData i
return dtc.httpRequest("oapi", path, params, requestData, responseData)
}

func (dtc *DingTalkClient) httpIsv() {

}

func (dtc *DingTalkClient) httpTOP(requestData interface{}, responseData interface{}) error {
var params []string
var paramsJoin string
var cipher []byte
var cipherString string
if body, ok := requestData.(TopMapRequest); ok {
body["sign_method"] = dtc.TopConfig.TopSignMethod
body["session"] = dtc.AccessToken
if dtc.DevType == "company" {
body["session"] = dtc.AccessToken
}
body["format"] = dtc.TopConfig.TopFormat
body["v"] = dtc.TopConfig.TopV
timestamp := time.Now().Unix()
Expand Down

0 comments on commit 2da669c

Please sign in to comment.