()
| 213 | } |
| 214 | |
| 215 | func (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 | |
| 266 | func (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) |
nothing calls this directly
no test coverage detected