bitbot/auth/jwt_client.go

86 lines
1.9 KiB
Go

// auth/jwt_client.go
package auth
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
// JWTClient is a struct representing the JWT authentication client.
type JWTClient struct {
ServerURL string
TokenEndpoint string
ClientID string
ClientSecret string
}
// NewJWTClient creates a new JWTClient instance.
func NewJWTClient(serverURL, tokenEndpoint, clientID, clientSecret string) *JWTClient {
return &JWTClient{
ServerURL: serverURL,
TokenEndpoint: tokenEndpoint,
ClientID: clientID,
ClientSecret: clientSecret,
}
}
// GetAccessToken retrieves a JWT access token from the server.
func (c *JWTClient) GetAccessToken() (string, error) {
// Construct the payload for token request
payload := map[string]string{
"client_id": c.ClientID,
"client_secret": c.ClientSecret,
}
// Convert payload to JSON
payloadJSON, err := json.Marshal(payload)
if err != nil {
return "", err
}
// Make a POST request to the /auth/tokens endpoint
resp, err := http.Post(c.ServerURL+c.TokenEndpoint, "application/json", bytes.NewBuffer(payloadJSON))
if err != nil {
return "", err
}
defer resp.Body.Close()
response, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("failed to authenticate: %s", response)
}
// Return the obtained token
return string(response), nil
}
// MakeRequest makes an authenticated HTTP request using the provided access token.
func (c *JWTClient) MakeRequest(apiURL, token string) ([]byte, error) {
req, err := http.NewRequest("GET", c.ServerURL+"/auth/tokens/make-request", nil)
if err != nil {
return nil, err
}
req.Header.Set("Authorization", "Bearer "+token)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
response, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return response, nil
}