Documentation
¶
Overview ¶
Package oauth provides OAuth 2.1 server capabilities.
Index ¶
- func BuildAuthorizationURL(baseURL, clientID, redirectURI, scope, state string) string
- func GenerateCodeChallenge(verifier string, method PKCEMethod) (string, error)
- func ValidateCodeChallenge(challenge string) error
- func ValidateCodeVerifier(verifier string) error
- func VerifyCodeChallenge(verifier, challenge string, method PKCEMethod) (bool, error)
- type AuthorizationCode
- type AuthorizationRequest
- type Client
- type DCRConfig
- type DCRRequest
- type DCRResponse
- type DCRService
- type ErrorResponse
- type PKCEMethod
- type RefreshToken
- type Server
- func (s *Server) Authorize(ctx context.Context, req AuthorizationRequest, userID string, ...) (string, error)
- func (s *Server) RegisterClient(ctx context.Context, req DCRRequest) (*DCRResponse, error)
- func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (s *Server) StartCleanupRoutine(ctx context.Context, interval time.Duration)
- func (s *Server) Token(ctx context.Context, req TokenRequest) (*TokenResponse, error)
- type ServerConfig
- type Storage
- type TokenRequest
- type TokenResponse
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BuildAuthorizationURL ¶
BuildAuthorizationURL builds an authorization URL.
func GenerateCodeChallenge ¶
func GenerateCodeChallenge(verifier string, method PKCEMethod) (string, error)
GenerateCodeChallenge generates a code challenge from a verifier.
func ValidateCodeChallenge ¶
ValidateCodeChallenge validates a code challenge.
func ValidateCodeVerifier ¶
ValidateCodeVerifier validates a code verifier. Per RFC 7636, it must be 43-128 characters of [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~".
func VerifyCodeChallenge ¶
func VerifyCodeChallenge(verifier, challenge string, method PKCEMethod) (bool, error)
VerifyCodeChallenge verifies a code verifier against a challenge.
Types ¶
type AuthorizationCode ¶
type AuthorizationCode struct {
ID string `json:"id"`
Code string `json:"code"`
ClientID string `json:"client_id"`
UserID string `json:"user_id"`
UserClaims map[string]any `json:"user_claims"`
CodeChallenge string `json:"code_challenge"`
RedirectURI string `json:"redirect_uri"`
Scope string `json:"scope"`
ExpiresAt time.Time `json:"expires_at"`
Used bool `json:"used"`
CreatedAt time.Time `json:"created_at"`
}
AuthorizationCode represents an OAuth authorization code.
func (*AuthorizationCode) IsExpired ¶
func (c *AuthorizationCode) IsExpired() bool
IsExpired checks if the authorization code has expired.
type AuthorizationRequest ¶
type AuthorizationRequest struct {
ResponseType string
ClientID string
RedirectURI string
Scope string
State string
CodeChallenge string
CodeChallengeMethod string
}
AuthorizationRequest represents an authorization request.
type Client ¶
type Client struct {
ID string `json:"id"`
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret"` // bcrypt hashed
Name string `json:"name"`
RedirectURIs []string `json:"redirect_uris"`
GrantTypes []string `json:"grant_types"`
RequirePKCE bool `json:"require_pkce"`
CreatedAt time.Time `json:"created_at"`
Active bool `json:"active"`
}
Client represents an OAuth 2.1 client.
func (*Client) SupportsGrantType ¶
SupportsGrantType checks if the client supports a grant type.
func (*Client) ValidRedirectURI ¶
ValidRedirectURI checks if a redirect URI is valid for this client.
type DCRConfig ¶
type DCRConfig struct {
// Enabled enables DCR.
Enabled bool
// AllowedRedirectPatterns are regex patterns for allowed redirect URIs.
AllowedRedirectPatterns []string
// DefaultGrantTypes are the default grant types for new clients.
DefaultGrantTypes []string
// RequirePKCE requires PKCE for all clients.
RequirePKCE bool
}
DCRConfig configures Dynamic Client Registration.
type DCRRequest ¶
type DCRRequest struct {
ClientName string `json:"client_name"`
RedirectURIs []string `json:"redirect_uris"`
GrantTypes []string `json:"grant_types,omitempty"`
TokenEndpointAuthMethod string `json:"token_endpoint_auth_method,omitempty"`
}
DCRRequest is a Dynamic Client Registration request.
type DCRResponse ¶
type DCRResponse struct {
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret,omitempty"`
ClientName string `json:"client_name"`
RedirectURIs []string `json:"redirect_uris"`
GrantTypes []string `json:"grant_types"`
ClientSecretExpiresAt int `json:"client_secret_expires_at"` // 0 means never
}
DCRResponse is a Dynamic Client Registration response.
type DCRService ¶
type DCRService struct {
// contains filtered or unexported fields
}
DCRService handles Dynamic Client Registration.
func NewDCRService ¶
func NewDCRService(storage Storage, config DCRConfig) (*DCRService, error)
NewDCRService creates a new DCR service.
func (*DCRService) Register ¶
func (s *DCRService) Register(ctx context.Context, req DCRRequest) (*DCRResponse, error)
Register registers a new OAuth client.
type ErrorResponse ¶
type ErrorResponse struct {
Error string `json:"error"`
ErrorDescription string `json:"error_description,omitempty"`
}
ErrorResponse represents an OAuth error response.
type PKCEMethod ¶
type PKCEMethod string
PKCEMethod defines the code challenge method.
const ( // PKCEMethodPlain uses plain text (not recommended). PKCEMethodPlain PKCEMethod = "plain" // PKCEMethodS256 uses SHA-256 hashing (recommended). PKCEMethodS256 PKCEMethod = "S256" )
func DefaultPKCEMethod ¶
func DefaultPKCEMethod() PKCEMethod
DefaultPKCEMethod returns the default (and recommended) PKCE method.
type RefreshToken ¶
type RefreshToken struct {
ID string `json:"id"`
Token string `json:"token"`
ClientID string `json:"client_id"`
UserID string `json:"user_id"`
UserClaims map[string]any `json:"user_claims"`
Scope string `json:"scope"`
ExpiresAt time.Time `json:"expires_at"`
CreatedAt time.Time `json:"created_at"`
}
RefreshToken represents an OAuth refresh token.
func (*RefreshToken) IsExpired ¶
func (t *RefreshToken) IsExpired() bool
IsExpired checks if the refresh token has expired.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server is an OAuth 2.1 authorization server.
func NewServer ¶
func NewServer(config ServerConfig, storage Storage) (*Server, error)
NewServer creates a new OAuth server.
func (*Server) Authorize ¶
func (s *Server) Authorize(ctx context.Context, req AuthorizationRequest, userID string, userClaims map[string]any) (string, error)
Authorize handles the authorization endpoint.
func (*Server) RegisterClient ¶
func (s *Server) RegisterClient(ctx context.Context, req DCRRequest) (*DCRResponse, error)
RegisterClient handles Dynamic Client Registration.
func (*Server) ServeHTTP ¶
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request)
ServeHTTP implements http.Handler for the OAuth server.
func (*Server) StartCleanupRoutine ¶
StartCleanupRoutine starts a background routine to clean up expired codes and tokens.
func (*Server) Token ¶
func (s *Server) Token(ctx context.Context, req TokenRequest) (*TokenResponse, error)
Token handles the token endpoint.
type ServerConfig ¶
type ServerConfig struct {
// Issuer is the OAuth issuer URL.
Issuer string
// AccessTokenTTL is the access token lifetime.
AccessTokenTTL time.Duration
// RefreshTokenTTL is the refresh token lifetime.
RefreshTokenTTL time.Duration
// AuthCodeTTL is the authorization code lifetime.
AuthCodeTTL time.Duration
// DCR configures Dynamic Client Registration.
DCR DCRConfig
}
ServerConfig configures the OAuth server.
type Storage ¶
type Storage interface {
// Client management
CreateClient(ctx context.Context, client *Client) error
GetClient(ctx context.Context, clientID string) (*Client, error)
UpdateClient(ctx context.Context, client *Client) error
DeleteClient(ctx context.Context, clientID string) error
ListClients(ctx context.Context) ([]*Client, error)
// Authorization code management
SaveAuthorizationCode(ctx context.Context, code *AuthorizationCode) error
GetAuthorizationCode(ctx context.Context, code string) (*AuthorizationCode, error)
DeleteAuthorizationCode(ctx context.Context, code string) error
CleanupExpiredCodes(ctx context.Context) error
// Token management
SaveRefreshToken(ctx context.Context, token *RefreshToken) error
GetRefreshToken(ctx context.Context, token string) (*RefreshToken, error)
DeleteRefreshToken(ctx context.Context, token string) error
DeleteRefreshTokensForClient(ctx context.Context, clientID string) error
CleanupExpiredTokens(ctx context.Context) error
}
Storage defines the interface for OAuth data persistence.