8 phttp "github.com/coreos/go-oidc/http"
9 "github.com/coreos/go-oidc/jose"
12 type TokenRefresher interface {
13 // Verify checks if the provided token is currently valid or not.
14 Verify(jose.JWT) error
16 // Refresh attempts to authenticate and retrieve a new token.
17 Refresh() (jose.JWT, error)
20 type ClientCredsTokenRefresher struct {
25 func (c *ClientCredsTokenRefresher) Verify(jwt jose.JWT) (err error) {
26 _, err = VerifyClientClaims(jwt, c.Issuer)
30 func (c *ClientCredsTokenRefresher) Refresh() (jwt jose.JWT, err error) {
31 if err = c.OIDCClient.Healthy(); err != nil {
32 err = fmt.Errorf("unable to authenticate, unhealthy OIDC client: %v", err)
36 jwt, err = c.OIDCClient.ClientCredsToken([]string{"openid"})
38 err = fmt.Errorf("unable to verify auth code with issuer: %v", err)
45 type AuthenticatedTransport struct {
53 func (t *AuthenticatedTransport) verifiedJWT() (jose.JWT, error) {
57 if t.TokenRefresher.Verify(t.jwt) == nil {
61 jwt, err := t.TokenRefresher.Refresh()
63 return jose.JWT{}, fmt.Errorf("unable to acquire valid JWT: %v", err)
70 // SetJWT sets the JWT held by the Transport.
71 // This is useful for cases in which you want to set an initial JWT.
72 func (t *AuthenticatedTransport) SetJWT(jwt jose.JWT) {
79 func (t *AuthenticatedTransport) RoundTrip(r *http.Request) (*http.Response, error) {
80 jwt, err := t.verifiedJWT()
85 req := phttp.CopyRequest(r)
86 req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", jwt.Encode()))
87 return t.RoundTripper.RoundTrip(req)