package bearer
import (
smithyhttp
)
type Message interface{}
type Signer interface {
SignWithBearerToken(context.Context, Token, Message) (Message, error)
}
type AuthenticationMiddleware struct {
signer Signer
tokenProvider TokenProvider
}
func ( *middleware.Stack, Signer, TokenProvider) error {
return .Finalize.Add(
NewAuthenticationMiddleware(, ),
middleware.After,
)
}
func ( Signer, TokenProvider) *AuthenticationMiddleware {
return &AuthenticationMiddleware{
signer: ,
tokenProvider: ,
}
}
const authenticationMiddlewareID = "BearerTokenAuthentication"
func ( *AuthenticationMiddleware) () string {
return authenticationMiddlewareID
}
func ( *AuthenticationMiddleware) (
context.Context, middleware.FinalizeInput, middleware.FinalizeHandler,
) (
middleware.FinalizeOutput, middleware.Metadata, error,
) {
, := .tokenProvider.RetrieveBearerToken()
if != nil {
return , , fmt.Errorf("failed AuthenticationMiddleware wrap message, %w", )
}
, := .signer.SignWithBearerToken(, , .Request)
if != nil {
return , , fmt.Errorf("failed AuthenticationMiddleware sign message, %w", )
}
.Request =
return .HandleFinalize(, )
}
type SignHTTPSMessage struct{}
func () *SignHTTPSMessage {
return &SignHTTPSMessage{}
}
func (SignHTTPSMessage) ( context.Context, Token, Message) (Message, error) {
, := .(*smithyhttp.Request)
if ! {
return nil, fmt.Errorf("expect smithy-go HTTP Request, got %T", )
}
if !.IsHTTPS() {
return nil, fmt.Errorf("bearer token with HTTP request requires HTTPS")
}
:= .Clone()
.Header.Set("Authorization", "Bearer "+.Value)
return , nil
}