bearer: add a package to add/extract a HTTP Authorisation bearer header
This commit is contained in:
committed by
Michael Muré
parent
41d679dfab
commit
cc207aa202
64
toolkit/server/bearer/bearer.go
Normal file
64
toolkit/server/bearer/bearer.go
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
package bearer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ucan-wg/go-ucan/pkg/container"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ErrNoUcan = fmt.Errorf("no ucan")
|
||||||
|
var ErrContainerMalformed = fmt.Errorf("malformed container")
|
||||||
|
|
||||||
|
// ExtractBearerContainer extract a full UCAN container from an HTTP "Authorization: Bearer" header.
|
||||||
|
// It can return:
|
||||||
|
// - ErrNoUcan if no such HTTP header is found
|
||||||
|
// - ErrContainerMalformed if the container or token can't be decoded or if a token is invalid (bad signature ...)
|
||||||
|
func ExtractBearerContainer(h http.Header) (container.Reader, error) {
|
||||||
|
header := h.Get("Authorization")
|
||||||
|
if header == "" {
|
||||||
|
return nil, ErrNoUcan
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(header, "Bearer ") {
|
||||||
|
return nil, ErrNoUcan
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip prefix
|
||||||
|
reader := strings.NewReader(header[len("Bearer "):])
|
||||||
|
|
||||||
|
// read container from any supported format
|
||||||
|
ctn, err := container.FromReader(reader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("%w: %v", ErrContainerMalformed, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddBearerContainer adds the given UCAN container into an `Authorization: Bearer` HTTP header.
|
||||||
|
//
|
||||||
|
// You should use this with HTTP/2 or HTTP/3, as both of those already compress their header.
|
||||||
|
func AddBearerContainer(h http.Header, container container.Writer) error {
|
||||||
|
str, err := container.ToBase64StdPadding()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
h.Set("Authorization", fmt.Sprintf("Bearer %s", str))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddBearerContainerCompressed adds the given UCAN container into an `Authorization: Bearer` HTTP header.
|
||||||
|
//
|
||||||
|
// You should use this with HTTP/1, as it doesn't compress its headers.
|
||||||
|
func AddBearerContainerCompressed(h http.Header, container container.Writer) error {
|
||||||
|
str, err := container.ToBase64StdPaddingGzipped()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
h.Set("Authorization", fmt.Sprintf("Bearer %s", str))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user