MCPcopy Create free account
hub / github.com/couchbase/sync_gateway / handleOIDCRefresh

Method handleOIDCRefresh

rest/oidc_api.go:215–264  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

213}
214
215func (h *handler) handleOIDCRefresh() error {
216 refreshToken := h.getQuery(requestParamRefreshToken)
217 if refreshToken == "" {
218 return base.NewHTTPError(http.StatusBadRequest, "Refresh token must be present for oidc refresh")
219 }
220
221 providerName := h.getQuery(requestParamProvider)
222 provider, err := h.getOIDCProvider(providerName)
223 if err != nil || provider == nil {
224 return base.HTTPErrorf(http.StatusBadRequest, "Unable to identify provider for callback request")
225 }
226
227 client, err := provider.GetClient(h.ctx(), h.getOIDCCallbackURL)
228 if err != nil {
229 return fmt.Errorf("OIDC initialization error: %w", err)
230 }
231
232 context := auth.GetOIDCClientContext(provider.InsecureSkipVerify)
233 token, err := client.Config().TokenSource(context, &oauth2.Token{RefreshToken: refreshToken}).Token()
234 if err != nil {
235 base.InfofCtx(h.ctx(), base.KeyAuth, "Unsuccessful token refresh: %v", err)
236 return base.HTTPErrorf(http.StatusInternalServerError, "Unable to refresh token.")
237 }
238
239 rawIDToken, ok := token.Extra(keyIDToken).(string)
240 if !ok {
241 return base.HTTPErrorf(http.StatusInternalServerError, "No id_token field in oauth2 token.")
242 }
243 base.InfofCtx(h.ctx(), base.KeyAuth, "Obtained token from Authorization Server: %v", rawIDToken)
244
245 username, sessionID, err := h.createSessionForTrustedIdToken(rawIDToken, provider)
246 if err != nil {
247 return err
248 }
249
250 refreshResponse := &OIDCTokenResponse{
251 IDToken: rawIDToken,
252 SessionID: sessionID,
253 Username: username,
254 }
255
256 if provider.IncludeAccessToken {
257 refreshResponse.AccessToken = token.AccessToken
258 refreshResponse.Expires = int(token.Expiry.Sub(time.Now()).Seconds())
259 refreshResponse.TokenType = token.TokenType
260 }
261
262 h.writeJSON(refreshResponse)
263 return nil
264}
265
266func (h *handler) createSessionForTrustedIdToken(rawIDToken string, provider *auth.OIDCProvider) (username string, sessionID string, err error) {
267 user, updates, tokenExpiryTime, err := h.db.Authenticator(h.ctx()).AuthenticateTrustedJWT(rawIDToken, provider, h.getOIDCCallbackURL)

Callers

nothing calls this directly

Calls 12

getQueryMethod · 0.95
getOIDCProviderMethod · 0.95
ctxMethod · 0.95
writeJSONMethod · 0.95
NewHTTPErrorFunction · 0.92
HTTPErrorfFunction · 0.92
GetOIDCClientContextFunction · 0.92
InfofCtxFunction · 0.92
GetClientMethod · 0.80
ErrorfMethod · 0.80
ConfigMethod · 0.80

Tested by

no test coverage detected