mirror of
https://github.com/hanzo-fi/go-libs.git
synced 2026-10-30 20:53:44 +00:00
53 lines
1.4 KiB
Go
53 lines
1.4 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"golang.org/x/oauth2"
|
|
|
|
"github.com/hanzo-fi/go-libs/v5/pkg/authn/oidc"
|
|
httphelper "github.com/hanzo-fi/go-libs/v5/pkg/authn/oidc/http"
|
|
"github.com/hanzo-fi/go-libs/v5/pkg/types/time"
|
|
)
|
|
|
|
type TokenEndpointCaller interface {
|
|
TokenEndpoint() string
|
|
HttpClient() *http.Client
|
|
IDTokenVerifier() *Verifier
|
|
}
|
|
|
|
func CallTokenEndpoint(ctx context.Context, request any, caller TokenEndpointCaller) (newToken *oauth2.Token, err error) {
|
|
return callTokenEndpoint(ctx, request, nil, caller)
|
|
}
|
|
|
|
func callTokenEndpoint(ctx context.Context, request any, authFn any, caller TokenEndpointCaller) (newToken *oauth2.Token, err error) {
|
|
|
|
req, err := httphelper.FormRequest(ctx, caller.TokenEndpoint(), request, Encoder, authFn)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
client := caller.HttpClient()
|
|
if client == nil {
|
|
client = httphelper.DefaultHTTPClient
|
|
}
|
|
|
|
tokenRes := new(oidc.AccessTokenResponse)
|
|
if err := httphelper.HttpRequest(client, req, &tokenRes); err != nil {
|
|
return nil, err
|
|
}
|
|
token := &oauth2.Token{
|
|
AccessToken: tokenRes.AccessToken,
|
|
TokenType: tokenRes.TokenType,
|
|
RefreshToken: tokenRes.RefreshToken,
|
|
Expiry: time.Now().UTC().Add(time.Duration(tokenRes.ExpiresIn) * time.Second).Time,
|
|
}
|
|
if tokenRes.IDToken != "" {
|
|
token = token.WithExtra(map[string]any{
|
|
"id_token": tokenRes.IDToken,
|
|
})
|
|
}
|
|
return token, nil
|
|
}
|