@@ -31,14 +31,15 @@ func NewOIDCProvider(p *ProviderData) *OIDCProvider {
3131 return &OIDCProvider{ProviderData: p}
3232}
3333
34+var _ Provider = (*OIDCProvider)(nil)
35+
3436// Redeem exchanges the OAuth2 authentication token for an ID token
35−func (p *OIDCProvider) Redeem(redirectURL, code string) (s *sessions.SessionState, err error) {
37+func (p *OIDCProvider) Redeem(ctx context.Context, redirectURL, code string) (s *sessions.SessionState, err error) {
3638 clientSecret, err := p.GetClientSecret()
3739 if err != nil {
3840 return
3941 }
4042
41− ctx := context.Background()
4243 c := oauth2.Config{
4344 ClientID: p.ClientID,
4445 ClientSecret: clientSecret,
@@ -60,7 +61,7 @@ func (p *OIDCProvider) Redeem(redirectURL, code string) (s *sessions.SessionStat
6061 return nil, fmt.Errorf("token response did not contain an id_token")
6162 }
6263
63− s, err = p.createSessionState(token, idToken)
64+ s, err = p.createSessionState(ctx, token, idToken)
6465 if err != nil {
6566 return nil, fmt.Errorf("unable to update session: %v", err)
6667 }
@@ -70,12 +71,12 @@ func (p *OIDCProvider) Redeem(redirectURL, code string) (s *sessions.SessionStat
7071
7172// RefreshSessionIfNeeded checks if the session has expired and uses the
7273// RefreshToken to fetch a new Access Token (and optional ID token) if required
73−func (p *OIDCProvider) RefreshSessionIfNeeded(s *sessions.SessionState) (bool, error) {
74+func (p *OIDCProvider) RefreshSessionIfNeeded(ctx context.Context, s *sessions.SessionState) (bool, error) {
7475 if s == nil || s.ExpiresOn.After(time.Now()) || s.RefreshToken == "" {
7576 return false, nil
7677 }
7778
78− err := p.redeemRefreshToken(s)
79+ err := p.redeemRefreshToken(ctx, s)
7980 if err != nil {
8081 return false, fmt.Errorf("unable to redeem refresh token: %v", err)
8182 }
@@ -84,7 +85,7 @@ func (p *OIDCProvider) RefreshSessionIfNeeded(s *sessions.SessionState) (bool, e
8485 return true, nil
8586}
8687
87−func (p *OIDCProvider) redeemRefreshToken(s *sessions.SessionState) (err error) {
88+func (p *OIDCProvider) redeemRefreshToken(ctx context.Context, s *sessions.SessionState) (err error) {
8889 clientSecret, err := p.GetClientSecret()
8990 if err != nil {
9091 return
@@ -97,7 +98,6 @@ func (p *OIDCProvider) redeemRefreshToken(s *sessions.SessionState) (err error)
9798 TokenURL: p.RedeemURL.String(),
9899 },
99100 }
100− ctx := context.Background()
101101 t := &oauth2.Token{
102102 RefreshToken: s.RefreshToken,
103103 Expiry: time.Now().Add(-time.Hour),
@@ -113,7 +113,7 @@ func (p *OIDCProvider) redeemRefreshToken(s *sessions.SessionState) (err error)
113113 return fmt.Errorf("unable to extract id_token from response: %v", err)
114114 }
115115
116− newSession, err := p.createSessionState(token, idToken)
116+ newSession, err := p.createSessionState(ctx, token, idToken)
117117 if err != nil {
118118 return fmt.Errorf("unable create new session state from response: %v", err)
119119 }
@@ -149,7 +149,7 @@ func (p *OIDCProvider) findVerifiedIDToken(ctx context.Context, token *oauth2.To
149149 return nil, nil
150150}
151151
152−func (p *OIDCProvider) createSessionState(token *oauth2.Token, idToken *oidc.IDToken) (*sessions.SessionState, error) {
152+func (p *OIDCProvider) createSessionState(ctx context.Context, token *oauth2.Token, idToken *oidc.IDToken) (*sessions.SessionState, error) {
153153
154154 var newSession *sessions.SessionState
155155
@@ -157,7 +157,7 @@ func (p *OIDCProvider) createSessionState(token *oauth2.Token, idToken *oidc.IDT
157157 newSession = &sessions.SessionState{}
158158 } else {
159159 var err error
160− newSession, err = p.createSessionStateInternal(token.Extra("id_token").(string), idToken, token)
160+ newSession, err = p.createSessionStateInternal(ctx, token.Extra("id_token").(string), idToken, token)
161161 if err != nil {
162162 return nil, err
163163 }
@@ -170,8 +170,8 @@ func (p *OIDCProvider) createSessionState(token *oauth2.Token, idToken *oidc.IDT
170170 return newSession, nil
171171}
172172
173−func (p *OIDCProvider) CreateSessionStateFromBearerToken(rawIDToken string, idToken *oidc.IDToken) (*sessions.SessionState, error) {
174− newSession, err := p.createSessionStateInternal(rawIDToken, idToken, nil)
173+func (p *OIDCProvider) CreateSessionStateFromBearerToken(ctx context.Context, rawIDToken string, idToken *oidc.IDToken) (*sessions.SessionState, error) {
174+ newSession, err := p.createSessionStateInternal(ctx, rawIDToken, idToken, nil)
175175 if err != nil {
176176 return nil, err
177177 }
@@ -184,7 +184,7 @@ func (p *OIDCProvider) CreateSessionStateFromBearerToken(rawIDToken string, idTo
184184 return newSession, nil
185185}
186186
187−func (p *OIDCProvider) createSessionStateInternal(rawIDToken string, idToken *oidc.IDToken, token *oauth2.Token) (*sessions.SessionState, error) {
187+func (p *OIDCProvider) createSessionStateInternal(ctx context.Context, rawIDToken string, idToken *oidc.IDToken, token *oauth2.Token) (*sessions.SessionState, error) {
188188
189189 newSession := &sessions.SessionState{}
190190
@@ -196,7 +196,7 @@ func (p *OIDCProvider) createSessionStateInternal(rawIDToken string, idToken *oi
196196 accessToken = token.AccessToken
197197 }
198198
199− claims, err := p.findClaimsFromIDToken(idToken, accessToken, p.ProfileURL.String())
199+ claims, err := p.findClaimsFromIDToken(ctx, idToken, accessToken, p.ProfileURL.String())
200200 if err != nil {
201201 return nil, fmt.Errorf("couldn't extract claims from id_token (%e)", err)
202202 }
@@ -217,8 +217,7 @@ func (p *OIDCProvider) createSessionStateInternal(rawIDToken string, idToken *oi
217217}
218218
219219// ValidateSessionState checks that the session's IDToken is still valid
220−func (p *OIDCProvider) ValidateSessionState(s *sessions.SessionState) bool {
221− ctx := context.Background()
220+func (p *OIDCProvider) ValidateSessionState(ctx context.Context, s *sessions.SessionState) bool {
222221 _, err := p.Verifier.Verify(ctx, s.IDToken)
223222 return err == nil
224223}
@@ -230,7 +229,7 @@ func getOIDCHeader(accessToken string) http.Header {
230229 return header
231230}
232231
233−func (p *OIDCProvider) findClaimsFromIDToken(idToken *oidc.IDToken, accessToken string, profileURL string) (*OIDCClaims, error) {
232+func (p *OIDCProvider) findClaimsFromIDToken(ctx context.Context, idToken *oidc.IDToken, accessToken string, profileURL string) (*OIDCClaims, error) {
234233
235234 claims := &OIDCClaims{}
236235 // Extract default claims.
@@ -257,7 +256,7 @@ func (p *OIDCProvider) findClaimsFromIDToken(idToken *oidc.IDToken, accessToken
257256 // contents at the profileURL contains the email.
258257 // Make a query to the userinfo endpoint, and attempt to locate the email from there.
259258
260− req, err := http.NewRequest("GET", profileURL, nil)
259+ req, err := http.NewRequestWithContext(ctx, "GET", profileURL, nil)
261260 if err != nil {
262261 return nil, err
263262 }