✨ feat: enhance JWT exchange process with proxy support. (close #1087)
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
relaycommon "one-api/relay/common"
|
relaycommon "one-api/relay/common"
|
||||||
|
"one-api/service"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -45,7 +46,7 @@ func getAccessToken(a *Adaptor, info *relaycommon.RelayInfo) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to create signed JWT: %w", err)
|
return "", fmt.Errorf("failed to create signed JWT: %w", err)
|
||||||
}
|
}
|
||||||
newToken, err := exchangeJwtForAccessToken(signedJWT)
|
newToken, err := exchangeJwtForAccessToken(signedJWT, info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("failed to exchange JWT for access token: %w", err)
|
return "", fmt.Errorf("failed to exchange JWT for access token: %w", err)
|
||||||
}
|
}
|
||||||
@@ -96,14 +97,25 @@ func createSignedJWT(email, privateKeyPEM string) (string, error) {
|
|||||||
return signedToken, nil
|
return signedToken, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func exchangeJwtForAccessToken(signedJWT string) (string, error) {
|
func exchangeJwtForAccessToken(signedJWT string, info *relaycommon.RelayInfo) (string, error) {
|
||||||
|
|
||||||
authURL := "https://www.googleapis.com/oauth2/v4/token"
|
authURL := "https://www.googleapis.com/oauth2/v4/token"
|
||||||
data := url.Values{}
|
data := url.Values{}
|
||||||
data.Set("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer")
|
data.Set("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer")
|
||||||
data.Set("assertion", signedJWT)
|
data.Set("assertion", signedJWT)
|
||||||
|
|
||||||
resp, err := http.PostForm(authURL, data)
|
var client *http.Client
|
||||||
|
var err error
|
||||||
|
if proxyURL, ok := info.ChannelSetting["proxy"]; ok {
|
||||||
|
client, err = service.NewProxyHttpClient(proxyURL.(string))
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("new proxy http client failed: %w", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
client = service.GetHttpClient()
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.PostForm(authURL, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user