@@ -241,6 +241,23 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) {
241
241
}
242
242
}
243
243
244
+ if link .UserID != uuid .Nil {
245
+ link ,err = api .Database .UpdateUserLink (ctx , database.UpdateUserLinkParams {
246
+ UserID :user .ID ,
247
+ LoginType :database .LoginTypeGithub ,
248
+ OAuthAccessToken :state .Token .AccessToken ,
249
+ OAuthRefreshToken :state .Token .RefreshToken ,
250
+ OAuthExpiry :state .Token .Expiry ,
251
+ })
252
+ if err != nil {
253
+ httpapi .Write (rw ,http .StatusInternalServerError , codersdk.Response {
254
+ Message :"A database error occurred." ,
255
+ Detail :fmt .Sprintf ("update user link: %s" ,err .Error ()),
256
+ })
257
+ return
258
+ }
259
+ }
260
+
244
261
_ ,created := api .createAPIKey (rw ,r ,createAPIKeyParams {
245
262
UserID :user .ID ,
246
263
LoginType :database .LoginTypeGithub ,
@@ -432,6 +449,23 @@ func (api *API) userOIDC(rw http.ResponseWriter, r *http.Request) {
432
449
}
433
450
}
434
451
452
+ if link .UserID != uuid .Nil {
453
+ link ,err = api .Database .UpdateUserLink (ctx , database.UpdateUserLinkParams {
454
+ UserID :user .ID ,
455
+ LoginType :database .LoginTypeOIDC ,
456
+ OAuthAccessToken :state .Token .AccessToken ,
457
+ OAuthRefreshToken :state .Token .RefreshToken ,
458
+ OAuthExpiry :state .Token .Expiry ,
459
+ })
460
+ if err != nil {
461
+ httpapi .Write (rw ,http .StatusInternalServerError , codersdk.Response {
462
+ Message :"A database error occurred." ,
463
+ Detail :fmt .Sprintf ("update user link: %s" ,err .Error ()),
464
+ })
465
+ return
466
+ }
467
+ }
468
+
435
469
// If the upstream email or username has changed we should mirror
436
470
// that in Coder. Many enterprises use a user's email/username as
437
471
// security auditing fields so they need to stay synced.