增加OAuth支持
This commit is contained in:
parent
1b603bfd93
commit
3a4f5332c9
29
oauth/define.go
Normal file
29
oauth/define.go
Normal file
@ -0,0 +1,29 @@
|
||||
// Package oauth ...
|
||||
//
|
||||
// Description : oauth ...
|
||||
//
|
||||
// Author : go_developer@163.com<张德满>
|
||||
//
|
||||
// Date : 2022/01/17 12:20 AM
|
||||
package oauth
|
||||
|
||||
// Config OAuth相关配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:20 AM
|
||||
type Config struct {
|
||||
ClientID string `json:"client_id"` // 授权的client id
|
||||
ClientSecret string `json:"client_secret"` // 授权的client_secret
|
||||
CallbackURL string `json:"callback_url"` // 授权后携带code回调的地址
|
||||
Domain string `json:"domain"` // 服务器域名
|
||||
AuthorizationPageURI string `json:"authorization_page_uri"` // 授权页面URI
|
||||
GetAccessTokenURI string `json:"get_access_token_uri"` // 获取access token地址
|
||||
ValidateAccessTokenURI string `json:"validate_access_token_uri"` // 验证access_token地址
|
||||
AccessTokenKey string `json:"access_token_key"` // 验证access token时的key
|
||||
UseAuthorization bool `json:"use_authorization"` // 是否使用header中的Authorization
|
||||
FormatAccessTokenFunc FormatAccessTokenFunc `json:"format_access_token_func"` // 格式化token的函数
|
||||
}
|
||||
|
||||
// FormatAccessTokenFunc 格式化token
|
||||
type FormatAccessTokenFunc func(token string) string
|
128
oauth/oauth.go
Normal file
128
oauth/oauth.go
Normal file
@ -0,0 +1,128 @@
|
||||
// Package oauth ...
|
||||
//
|
||||
// Description : oauth ...
|
||||
//
|
||||
// Author : go_developer@163.com<张德满>
|
||||
//
|
||||
// Date : 2022/01/17 12:18 AM
|
||||
package oauth
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/ddliu/go-httpclient"
|
||||
)
|
||||
|
||||
// NewOAuth 获取OAuth实例
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:19 AM
|
||||
func NewOAuth(cfg Config) *OAuth {
|
||||
return &OAuth{
|
||||
cfg: cfg,
|
||||
}
|
||||
}
|
||||
|
||||
// OAuth 管理
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:19 AM
|
||||
type OAuth struct {
|
||||
cfg Config
|
||||
}
|
||||
|
||||
// GetAuthorizationPageURL 获取授权页面的URL
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:33 AM
|
||||
func (o *OAuth) GetAuthorizationPageURL(scope string, responseType string) string {
|
||||
return fmt.Sprintf(
|
||||
"%s%s?client_id=%s&redirect_uri=%s&scope=%s&response_type=%s",
|
||||
o.cfg.Domain,
|
||||
o.cfg.AuthorizationPageURI,
|
||||
o.cfg.ClientID,
|
||||
url.QueryEscape(o.cfg.CallbackURL),
|
||||
scope,
|
||||
responseType,
|
||||
)
|
||||
}
|
||||
|
||||
// ApplyAccessTokenByCode 通过code申请授权token
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:35 AM
|
||||
func (o *OAuth) ApplyAccessTokenByCode(code string, receiver interface{}) error {
|
||||
// OAuth 授权回调
|
||||
parameter := map[string]string{
|
||||
"code": code,
|
||||
"client_id": o.cfg.ClientID,
|
||||
"client_secret": o.cfg.ClientSecret,
|
||||
"grant_type": "authorization_code",
|
||||
}
|
||||
client := httpclient.NewHttpClient()
|
||||
client.WithHeader("Accept", "application/json")
|
||||
resp, err := client.Post(o.cfg.Domain+o.cfg.GetAccessTokenURI+"?grant_type=authorization_code", parameter)
|
||||
if nil != err {
|
||||
return err
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return fmt.Errorf("【%v】%v", resp.StatusCode, resp.Status)
|
||||
}
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if nil != err {
|
||||
return errors.New("读取响应体失败: " + err.Error())
|
||||
}
|
||||
decoder := json.NewDecoder(bytes.NewReader(body))
|
||||
decoder.UseNumber()
|
||||
return decoder.Decode(receiver)
|
||||
}
|
||||
|
||||
// ValidateAccessToken 验证授权token
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:43 AM
|
||||
func (o *OAuth) ValidateAccessToken(token string, receiver interface{}) error {
|
||||
if nil != o.cfg.FormatAccessTokenFunc {
|
||||
token = o.cfg.FormatAccessTokenFunc(token)
|
||||
}
|
||||
parameter := make(map[string]string)
|
||||
client := httpclient.NewHttpClient()
|
||||
client.WithHeader("Accept", "application/json")
|
||||
if o.cfg.UseAuthorization {
|
||||
client.WithHeader("Authorization", "token "+token)
|
||||
} else {
|
||||
parameter[o.cfg.AccessTokenKey] = token
|
||||
}
|
||||
resp, err := client.Get("https://git.zhangdeman.cn/api/v1/user?grant_type=authorization_code", parameter)
|
||||
if nil != err {
|
||||
return err
|
||||
}
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if nil != err {
|
||||
return errors.New("读取响应体失败 : " + err.Error())
|
||||
}
|
||||
decoder := json.NewDecoder(bytes.NewReader(body))
|
||||
decoder.UseNumber()
|
||||
return decoder.Decode(receiver)
|
||||
}
|
||||
|
||||
// GetUserDetailByToken 根据 token 获取用户详情
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2022/1/17 12:55 AM
|
||||
func (o *OAuth) GetUserDetailByToken(token string, receiver interface{}) error {
|
||||
return o.ValidateAccessToken(token, receiver)
|
||||
}
|
Loading…
Reference in New Issue
Block a user