token.go raw

   1  package bearer
   2  
   3  import (
   4  	"context"
   5  	"time"
   6  )
   7  
   8  // Token provides a type wrapping a bearer token and expiration metadata.
   9  type Token struct {
  10  	Value string
  11  
  12  	CanExpire bool
  13  	Expires   time.Time
  14  }
  15  
  16  // Expired returns if the token's Expires time is before or equal to the time
  17  // provided. If CanExpires is false, Expired will always return false.
  18  func (t Token) Expired(now time.Time) bool {
  19  	if !t.CanExpire {
  20  		return false
  21  	}
  22  	now = now.Round(0)
  23  	return now.Equal(t.Expires) || now.After(t.Expires)
  24  }
  25  
  26  // TokenProvider provides interface for retrieving bearer tokens.
  27  type TokenProvider interface {
  28  	RetrieveBearerToken(context.Context) (Token, error)
  29  }
  30  
  31  // TokenProviderFunc provides a helper utility to wrap a function as a type
  32  // that implements the TokenProvider interface.
  33  type TokenProviderFunc func(context.Context) (Token, error)
  34  
  35  // RetrieveBearerToken calls the wrapped function, returning the Token or
  36  // error.
  37  func (fn TokenProviderFunc) RetrieveBearerToken(ctx context.Context) (Token, error) {
  38  	return fn(ctx)
  39  }
  40  
  41  // StaticTokenProvider provides a utility for wrapping a static bearer token
  42  // value within an implementation of a token provider.
  43  type StaticTokenProvider struct {
  44  	Token Token
  45  }
  46  
  47  // RetrieveBearerToken returns the static token specified.
  48  func (s StaticTokenProvider) RetrieveBearerToken(context.Context) (Token, error) {
  49  	return s.Token, nil
  50  }
  51