Ai
1 Star 0 Fork 0

carlmax_my/authing-golang-sdk

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
management_http_client.go 3.66 KB
一键复制 编辑 原始数据 按行查看 历史
carlmax_my 提交于 2024-09-14 14:49 +08:00 . change pkg name
package management
import (
"crypto/tls"
"encoding/json"
"fmt"
url2 "net/url"
"sync"
"time"
"gitee.com/carlmax_my/authing-golang-sdk/v3/constant"
"gitee.com/carlmax_my/authing-golang-sdk/v3/dto"
"gitee.com/carlmax_my/authing-golang-sdk/v3/util/cache"
"github.com/dgrijalva/jwt-go"
"github.com/valyala/fasthttp"
)
type JwtClaims struct {
*jwt.StandardClaims
//用户编号
UID string
Username string
}
func GetAccessToken(client *ManagementClient) (string, error) {
// 从缓存获取token
cacheToken, b := cache.GetCache(constant.TokenCacheKeyPrefix + client.options.AccessKeyId)
if b && cacheToken != nil {
return cacheToken.(string), nil
}
// 从服务获取token,加锁
var mutex sync.Mutex
mutex.Lock()
defer mutex.Unlock()
cacheToken, b = cache.GetCache(constant.TokenCacheKeyPrefix + client.options.AccessKeyId)
if b && cacheToken != nil {
return cacheToken.(string), nil
}
resp, err := QueryAccessToken(client)
if err != nil {
return "", err
}
if token, _ := jwt.Parse(resp.Data.AccessToken, nil); token != nil {
userPoolId := token.Claims.(jwt.MapClaims)["scoped_userpool_id"]
client.userPoolId = userPoolId.(string)
}
cache.SetCache(constant.TokenCacheKeyPrefix+client.options.AccessKeyId, resp.Data.AccessToken, time.Duration(resp.Data.ExpiresIn*int(time.Second)))
return resp.Data.AccessToken, nil
}
func QueryAccessToken(client *ManagementClient) (*dto.GetManagementTokenRespDto, error) {
variables := map[string]interface{}{
"accessKeyId": client.options.AccessKeyId,
"accessKeySecret": client.options.AccessKeySecret,
}
b, err := client.SendHttpRequest("/api/v3/get-management-token", fasthttp.MethodPost, variables)
if err != nil {
return nil, err
}
var r dto.GetManagementTokenRespDto
if b != nil {
json.Unmarshal(b, &r)
}
return &r, nil
}
func (c *ManagementClient) SendHttpRequest(url string, method string, reqDto interface{}) ([]byte, error) {
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)
data, _ := json.Marshal(&reqDto)
variables := make(map[string]interface{})
json.Unmarshal(data, &variables)
if method == fasthttp.MethodGet && variables != nil && len(variables) > 0 {
params := url2.Values{}
urlTemp, _ := url2.Parse(url)
for key, value := range variables {
params.Set(key, fmt.Sprintf("%v", value))
}
urlTemp.RawQuery = params.Encode()
url = urlTemp.String()
}
req.SetRequestURI(c.options.Host + url)
if method != fasthttp.MethodGet {
req.Header.Add("Content-Type", "application/json;charset=UTF-8")
}
req.Header.Add("x-authing-app-tenant-id", ""+c.options.TenantId)
//req.Header.Add("x-authing-request-from", c.options.RequestFrom)
req.Header.Add("x-authing-sdk-version", constant.SdkVersion)
req.Header.Add("x-authing-lang", c.options.Lang)
if url != "/api/v3/get-management-token" {
token, _ := GetAccessToken(c)
req.Header.Add("Authorization", "Bearer "+token)
req.Header.Add("x-authing-userpool-id", c.userPoolId)
}
req.Header.SetMethod(method)
bytes, err := json.Marshal(reqDto) //data是请求数据
if err != nil {
return nil, err
}
req.SetBody(bytes)
resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp)
client := &fasthttp.Client{
TLSConfig: &tls.Config{InsecureSkipVerify: true},
}
err = client.DoTimeout(req, resp, c.options.ReadTimeout)
if err != nil {
resultMap := make(map[string]interface{})
if err == fasthttp.ErrTimeout {
resultMap["statusCode"] = 504
resultMap["message"] = "请求超时"
} else {
resultMap["statusCode"] = 500
resultMap["message"] = err.Error()
}
b, err := json.Marshal(resultMap)
if err != nil {
return nil, err
}
return b, err
}
body := resp.Body()
return body, err
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/carlmax_my/authing-golang-sdk.git
git@gitee.com:carlmax_my/authing-golang-sdk.git
carlmax_my
authing-golang-sdk
authing-golang-sdk
v3.0.16

搜索帮助