@@ -141,21 +141,21 @@ func (a *AuthProviderOIDC) RegisterHandler(
141
141
// the template and log an error.
142
142
registrationId , err := types .RegistrationIDFromString (registrationIdStr )
143
143
if err != nil {
144
- httpError (writer , err , "invalid registration ID " , http . StatusBadRequest )
144
+ httpError (writer , NewHTTPError ( http . StatusBadRequest , "invalid registration id " , err ) )
145
145
return
146
146
}
147
147
148
148
// Set the state and nonce cookies to protect against CSRF attacks
149
149
state , err := setCSRFCookie (writer , req , "state" )
150
150
if err != nil {
151
- httpError (writer , err , "Internal server error" , http . StatusInternalServerError )
151
+ httpError (writer , err )
152
152
return
153
153
}
154
154
155
155
// Set the state and nonce cookies to protect against CSRF attacks
156
156
nonce , err := setCSRFCookie (writer , req , "nonce" )
157
157
if err != nil {
158
- httpError (writer , err , "Internal server error" , http . StatusInternalServerError )
158
+ httpError (writer , err )
159
159
return
160
160
}
161
161
@@ -219,64 +219,63 @@ func (a *AuthProviderOIDC) OIDCCallbackHandler(
219
219
) {
220
220
code , state , err := extractCodeAndStateParamFromRequest (req )
221
221
if err != nil {
222
- httpError (writer , err , err . Error (), http . StatusBadRequest )
222
+ httpError (writer , err )
223
223
return
224
224
}
225
225
226
226
cookieState , err := req .Cookie ("state" )
227
227
if err != nil {
228
- httpError (writer , err , "state not found" , http . StatusBadRequest )
228
+ httpError (writer , NewHTTPError ( http . StatusBadRequest , "state not found" , err ) )
229
229
return
230
230
}
231
231
232
232
if state != cookieState .Value {
233
- httpError (writer , err , "state did not match" , http . StatusBadRequest )
233
+ httpError (writer , NewHTTPError ( http . StatusForbidden , "state did not match" , nil ) )
234
234
return
235
235
}
236
236
237
237
idToken , err := a .extractIDToken (req .Context (), code , state )
238
238
if err != nil {
239
- httpError (writer , err , err . Error (), http . StatusBadRequest )
239
+ httpError (writer , err )
240
240
return
241
241
}
242
242
243
243
nonce , err := req .Cookie ("nonce" )
244
244
if err != nil {
245
- httpError (writer , err , "nonce not found" , http . StatusBadRequest )
245
+ httpError (writer , NewHTTPError ( http . StatusBadRequest , "nonce not found" , err ) )
246
246
return
247
247
}
248
248
if idToken .Nonce != nonce .Value {
249
- httpError (writer , err , "nonce did not match" , http . StatusBadRequest )
249
+ httpError (writer , NewHTTPError ( http . StatusForbidden , "nonce did not match" , nil ) )
250
250
return
251
251
}
252
252
253
253
nodeExpiry := a .determineNodeExpiry (idToken .Expiry )
254
254
255
255
var claims types.OIDCClaims
256
256
if err := idToken .Claims (& claims ); err != nil {
257
- err = fmt .Errorf ("decoding ID token claims: %w" , err )
258
- httpError (writer , err , err .Error (), http .StatusInternalServerError )
257
+ httpError (writer , fmt .Errorf ("decoding ID token claims: %w" , err ))
259
258
return
260
259
}
261
260
262
261
if err := validateOIDCAllowedDomains (a .cfg .AllowedDomains , & claims ); err != nil {
263
- httpError (writer , err , err . Error (), http . StatusUnauthorized )
262
+ httpError (writer , err )
264
263
return
265
264
}
266
265
267
266
if err := validateOIDCAllowedGroups (a .cfg .AllowedGroups , & claims ); err != nil {
268
- httpError (writer , err , err . Error (), http . StatusUnauthorized )
267
+ httpError (writer , err )
269
268
return
270
269
}
271
270
272
271
if err := validateOIDCAllowedUsers (a .cfg .AllowedUsers , & claims ); err != nil {
273
- httpError (writer , err , err . Error (), http . StatusUnauthorized )
272
+ httpError (writer , err )
274
273
return
275
274
}
276
275
277
276
user , err := a .createOrUpdateUserFromClaim (& claims )
278
277
if err != nil {
279
- httpError (writer , err , err . Error (), http . StatusInternalServerError )
278
+ httpError (writer , err )
280
279
return
281
280
}
282
281
@@ -289,9 +288,9 @@ func (a *AuthProviderOIDC) OIDCCallbackHandler(
289
288
// Register the node if it does not exist.
290
289
if registrationId != nil {
291
290
verb := "Reauthenticated"
292
- newNode , err := a .handleRegistrationID (user , * registrationId , nodeExpiry )
291
+ newNode , err := a .handleRegistration (user , * registrationId , nodeExpiry )
293
292
if err != nil {
294
- httpError (writer , err , err . Error (), http . StatusInternalServerError )
293
+ httpError (writer , err )
295
294
return
296
295
}
297
296
@@ -302,7 +301,7 @@ func (a *AuthProviderOIDC) OIDCCallbackHandler(
302
301
// TODO(kradalby): replace with go-elem
303
302
content , err := renderOIDCCallbackTemplate (user , verb )
304
303
if err != nil {
305
- httpError (writer , err , err . Error (), http . StatusInternalServerError )
304
+ httpError (writer , err )
306
305
return
307
306
}
308
307
@@ -317,7 +316,7 @@ func (a *AuthProviderOIDC) OIDCCallbackHandler(
317
316
318
317
// Neither node nor machine key was found in the state cache meaning
319
318
// that we could not reauth nor register the node.
320
- httpError (writer , nil , "login session expired, try again" , http . StatusInternalServerError )
319
+ httpError (writer , NewHTTPError ( http . StatusGone , "login session expired, try again" , nil ) )
321
320
return
322
321
}
323
322
@@ -328,7 +327,7 @@ func extractCodeAndStateParamFromRequest(
328
327
state := req .URL .Query ().Get ("state" )
329
328
330
329
if code == "" || state == "" {
331
- return "" , "" , errEmptyOIDCCallbackParams
330
+ return "" , "" , NewHTTPError ( http . StatusBadRequest , "missing code or state parameter" , errEmptyOIDCCallbackParams )
332
331
}
333
332
334
333
return code , state , nil
@@ -346,7 +345,7 @@ func (a *AuthProviderOIDC) extractIDToken(
346
345
if a .cfg .PKCE .Enabled {
347
346
regInfo , ok := a .registrationCache .Get (state )
348
347
if ! ok {
349
- return nil , errNoOIDCRegistrationInfo
348
+ return nil , NewHTTPError ( http . StatusNotFound , "registration not found" , errNoOIDCRegistrationInfo )
350
349
}
351
350
if regInfo .Verifier != nil {
352
351
exchangeOpts = []oauth2.AuthCodeOption {oauth2 .VerifierOption (* regInfo .Verifier )}
@@ -355,18 +354,18 @@ func (a *AuthProviderOIDC) extractIDToken(
355
354
356
355
oauth2Token , err := a .oauth2Config .Exchange (ctx , code , exchangeOpts ... )
357
356
if err != nil {
358
- return nil , fmt .Errorf ("could not exchange code for token: %w" , err )
357
+ return nil , NewHTTPError ( http . StatusForbidden , "invalid code" , fmt .Errorf ("could not exchange code for token: %w" , err ) )
359
358
}
360
359
361
360
rawIDToken , ok := oauth2Token .Extra ("id_token" ).(string )
362
361
if ! ok {
363
- return nil , errNoOIDCIDToken
362
+ return nil , NewHTTPError ( http . StatusBadRequest , "no id_token" , errNoOIDCIDToken )
364
363
}
365
364
366
365
verifier := a .oidcProvider .Verifier (& oidc.Config {ClientID : a .cfg .ClientID })
367
366
idToken , err := verifier .Verify (ctx , rawIDToken )
368
367
if err != nil {
369
- return nil , fmt .Errorf ("failed to verify ID token: %w" , err )
368
+ return nil , NewHTTPError ( http . StatusForbidden , "failed to verify id_token" , fmt .Errorf ("failed to verify ID token: %w" , err ) )
370
369
}
371
370
372
371
return idToken , nil
@@ -381,7 +380,7 @@ func validateOIDCAllowedDomains(
381
380
if len (allowedDomains ) > 0 {
382
381
if at := strings .LastIndex (claims .Email , "@" ); at < 0 ||
383
382
! slices .Contains (allowedDomains , claims .Email [at + 1 :]) {
384
- return errOIDCAllowedDomains
383
+ return NewHTTPError ( http . StatusUnauthorized , "unauthorised domain" , errOIDCAllowedDomains )
385
384
}
386
385
}
387
386
@@ -403,7 +402,7 @@ func validateOIDCAllowedGroups(
403
402
}
404
403
}
405
404
406
- return errOIDCAllowedGroups
405
+ return NewHTTPError ( http . StatusUnauthorized , "unauthorised group" , errOIDCAllowedGroups )
407
406
}
408
407
409
408
return nil
@@ -417,7 +416,7 @@ func validateOIDCAllowedUsers(
417
416
) error {
418
417
if len (allowedUsers ) > 0 &&
419
418
! slices .Contains (allowedUsers , claims .Email ) {
420
- return errOIDCAllowedUsers
419
+ return NewHTTPError ( http . StatusUnauthorized , "unauthorised user" , errOIDCAllowedUsers )
421
420
}
422
421
423
422
return nil
@@ -488,7 +487,7 @@ func (a *AuthProviderOIDC) createOrUpdateUserFromClaim(
488
487
return user , nil
489
488
}
490
489
491
- func (a * AuthProviderOIDC ) handleRegistrationID (
490
+ func (a * AuthProviderOIDC ) handleRegistration (
492
491
user * types.User ,
493
492
registrationID types.RegistrationID ,
494
493
expiry time.Time ,
0 commit comments