Skip to content

升级 jwt 版本, 支持 client 扩展 等 #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions authentication/authentication_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ import (
"github.com/Authing/authing-golang-sdk/v3/constant"
"github.com/Authing/authing-golang-sdk/v3/dto"
"github.com/Authing/authing-golang-sdk/v3/util"

keyfunc "github.com/MicahParks/compatibility-keyfunc"
"github.com/dgrijalva/jwt-go"
"github.com/MicahParks/keyfunc/v2"
"github.com/golang-jwt/jwt/v5"
"github.com/valyala/fasthttp"
)

Expand All @@ -27,9 +26,10 @@ var commonHeaders = map[string]string{
}

type AuthenticationClient struct {
options *AuthenticationClientOptions
jwks *keyfunc.JWKS
eventHub *util.WebSocketEventHub
httpClient *fasthttp.Client
options *AuthenticationClientOptions
jwks *keyfunc.JWKS
eventHub *util.WebSocketEventHub
}

func NewAuthenticationClient(options *AuthenticationClientOptions) (*AuthenticationClient, error) {
Expand Down Expand Up @@ -68,6 +68,7 @@ func NewAuthenticationClient(options *AuthenticationClientOptions) (*Authenticat
options: options,
eventHub: util.NewWebSocketEvent(),
}
client.httpClient = client.createHttpClient()

return client, nil
}
Expand Down Expand Up @@ -481,19 +482,19 @@ func (client *AuthenticationClient) getKeyCommon(token *jwt.Token) (interface{},
if err != nil {
return nil, fmt.Errorf("获取 JWKS 失败 %v", err)
}
return jwks.KeyfuncLegacy(token)
return jwks.Keyfunc(token)
}

func (client *AuthenticationClient) getKey4IdToken(token *jwt.Token) (interface{}, error) {
claims := token.Claims.(*IDTokenClaims)
claims.IssuedAt = 0
claims.IssuedAt = jwt.NewNumericDate(time.Now())

return client.getKeyCommon(token)
}

func (client *AuthenticationClient) getKey4AccessToken(token *jwt.Token) (interface{}, error) {
claims := token.Claims.(*AccessTokenClaims)
claims.IssuedAt = 0
claims.IssuedAt = jwt.NewNumericDate(time.Now())

return client.getKeyCommon(token)
}
Expand Down
69 changes: 30 additions & 39 deletions authentication/authentication_http_client.go
Original file line number Diff line number Diff line change
@@ -1,53 +1,41 @@
package authentication

import (
"bytes"
"crypto/tls"
"encoding/base64"
"encoding/json"
"fmt"

"github.com/Authing/authing-golang-sdk/v3/constant"
"github.com/Authing/authing-golang-sdk/v3/util"
"github.com/valyala/fasthttp"
"strings"
)

func (client *AuthenticationClient) SendHttpRequest(url string, method string, reqDto interface{}) ([]byte, error) {
var buf bytes.Buffer
err := json.NewEncoder(&buf).Encode(reqDto)
if err != nil {
return nil, err
}
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)

data, _ := json.Marshal(&reqDto)
variables := make(map[string]interface{})
json.Unmarshal(data, &variables)

var queryString strings.Builder
reqJsonBytes, err := json.Marshal(&reqDto)
if err != nil {
return nil, err
}
if method == fasthttp.MethodGet {
if variables != nil && len(variables) > 0 {
for key, value := range variables {
queryString.WriteString(key)
queryString.WriteString("=")
queryString.WriteString(fmt.Sprintf("%v", value))
queryString.WriteString("&")
}
variables := make(map[string]interface{})
err = json.Unmarshal(reqJsonBytes, &variables)
if err != nil {
return nil, err
}
qs := queryString.String()
if qs != "" {
url += "?" + qs
queryString := util.GetQueryString2(variables)
if queryString != "" {
url += "?" + queryString
}
}

// 设置请求方法
req.Header.SetMethod(method)
// 设置请求地址
req.SetRequestURI(client.options.AppHost + url)

// 设置请求头
if method != fasthttp.MethodGet {
req.Header.Add("Content-Type", "application/json;charset=UTF-8")
}
//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.Lang)
Expand All @@ -69,24 +57,16 @@ func (client *AuthenticationClient) SendHttpRequest(url string, method string, r
} else if client.options.AccessToken != "" {
req.Header.Add("authorization", client.options.AccessToken)
}
req.Header.Add("Content-Type", "application/json;charset=UTF-8")

// 设置请求方法
req.Header.SetMethod(method)

bytes, err := json.Marshal(reqDto) //data是请求数据

if err != nil {
return nil, err
if method != fasthttp.MethodGet {
req.SetBody(reqJsonBytes)
}
req.SetBody(bytes)

resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp)

httpClient := &fasthttp.Client{
TLSConfig: &tls.Config{InsecureSkipVerify: client.options.InsecureSkipVerify},
}

err = httpClient.DoTimeout(req, resp, client.options.ReadTimeout)
err = client.httpClient.DoTimeout(req, resp, client.options.ReadTimeout)
if err != nil {
resultMap := make(map[string]interface{})
if err == fasthttp.ErrTimeout {
Expand All @@ -105,3 +85,14 @@ func (client *AuthenticationClient) SendHttpRequest(url string, method string, r
body := resp.Body()
return body, err
}

func (client *AuthenticationClient) createHttpClient() *fasthttp.Client {
options := client.options
createClientFunc := options.CreateClientFunc
if createClientFunc != nil {
return createClientFunc(options)
}
return &fasthttp.Client{
TLSConfig: &tls.Config{InsecureSkipVerify: options.InsecureSkipVerify},
}
}
12 changes: 9 additions & 3 deletions authentication/authentication_options.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package authentication

import (
"github.com/dgrijalva/jwt-go"
"time"

"github.com/golang-jwt/jwt/v5"
"github.com/valyala/fasthttp"
)

type AuthenticationClientOptions struct {
Expand Down Expand Up @@ -85,6 +87,10 @@ type AuthenticationClientOptions struct {
* 订阅事件 WebSocket 地址
*/
WssHost string
/**
* 自定义 Client 创建函数
*/
CreateClientFunc func(options *AuthenticationClientOptions) *fasthttp.Client
}

type AuthUrlResult struct {
Expand Down Expand Up @@ -156,14 +162,14 @@ type IDTokenExtended struct {
type IDTokenClaims struct {
UserInfoCommon
IDTokenExtended
jwt.StandardClaims
jwt.RegisteredClaims
}
type AccessTokenExtended struct {
Scope string `json:"scope,omitempty"`
}

type AccessTokenClaims struct {
jwt.StandardClaims
jwt.RegisteredClaims
AccessTokenExtended
}

Expand Down
73 changes: 25 additions & 48 deletions authentication/authentication_protocol_http_client.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package authentication

import (
"crypto/tls"
"encoding/json"
"fmt"

"github.com/Authing/authing-golang-sdk/v3/util"
"github.com/valyala/fasthttp"
"net/url"
)

type ContentType int
Expand All @@ -29,76 +29,53 @@ type ResponseData struct {
StatusCode int
}

func GenQueryString(variables map[string]string) string {
params := url.Values{}
for key, value := range variables {
params.Add(key, fmt.Sprintf("%v", value))
}
qs := params.Encode()
return qs
}

func GenFormArgs(variables map[string]string) *fasthttp.Args {
args := &fasthttp.Args{}
for key, value := range variables {
args.Add(key, fmt.Sprintf("%v", value))
}
return args
}

func (client AuthenticationClient) SendProtocolHttpRequest(option *ProtocolRequestOption) (*ResponseData, error) {
req := fasthttp.AcquireRequest()
defer fasthttp.ReleaseRequest(req)

method := option.Method
reqDto := option.ReqDto
url := option.Url
if method == fasthttp.MethodGet && reqDto != nil {
variables := reqDto
qs := GenQueryString(variables)
if qs != "" {
url += "?" + qs
}
queryString := util.GetQueryString(reqDto)
if method == fasthttp.MethodGet && queryString != "" {
url += "?" + queryString
}

req.Header.SetMethod(method)
req.SetRequestURI(url)

for key, value := range option.Headers {
req.Header.Add(key, value)
}
req.Header.SetMethod(method)

resp := fasthttp.AcquireResponse()
defer fasthttp.ReleaseResponse(resp)
if option.ContentType == Json {
req.Header.SetContentType("application/json; charset=UTF-8")
bytes, err := json.Marshal(reqDto) //序列化json

if err != nil {
return &ResponseData{
StatusCode: 500,
}, err
}
req.SetBody(bytes)

} else if method == fasthttp.MethodPost {
req.Header.SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
if reqDto != nil {
variables := reqDto
bytes := GenFormArgs(variables).QueryString()
switch method {
case fasthttp.MethodPost:
if option.ContentType == Json {
req.Header.SetContentType("application/json; charset=UTF-8")
bytes, err := json.Marshal(reqDto) //序列化json
if err != nil {
return &ResponseData{
StatusCode: 500,
}, err
}
req.SetBody(bytes)
} else {
req.Header.SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
if queryString != "" {
req.SetBodyString(queryString)
}
}
} else if method == fasthttp.MethodGet {

} else {
case fasthttp.MethodGet:
default:
return &ResponseData{
StatusCode: 500,
}, fmt.Errorf("不支持的请求类型")
}

httpClient := &fasthttp.Client{
TLSConfig: &tls.Config{InsecureSkipVerify: client.options.InsecureSkipVerify},
}
err := httpClient.DoTimeout(req, resp, client.options.ReadTimeout)
err := client.httpClient.DoTimeout(req, resp, client.options.ReadTimeout)
if err != nil {
return &ResponseData{
StatusCode: 500,
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ module github.com/Authing/authing-golang-sdk/v3
go 1.8

require (
github.com/MicahParks/compatibility-keyfunc v0.14.0
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gorilla/websocket v1.5.0 // indirect
github.com/MicahParks/keyfunc/v2 v2.1.0
github.com/golang-jwt/jwt/v5 v5.0.0
github.com/gorilla/websocket v1.5.0
github.com/klauspost/compress v1.15.2 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/valyala/fasthttp v1.36.0
Expand Down
10 changes: 4 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
github.com/MicahParks/compatibility-keyfunc v0.14.0 h1:VRRQiygqgRcNfTetVM0gqHc2Gl4vn2R0wT2Ph37Qi9M=
github.com/MicahParks/compatibility-keyfunc v0.14.0/go.mod h1:J3Oey5Hj4gxFX8F6lQMms2F9sYhrTzWvsLYIDvz/EFs=
github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k=
github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8=
github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE=
github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
Expand Down
Loading