@@ -614,12 +614,13 @@ func oidcRedirect(w http.ResponseWriter, r *http.Request) {
614
614
loginURL , _ := url .JoinPath (util .Config .WebHost , "auth/login" )
615
615
616
616
if err != nil {
617
- log .Error ( err . Error () )
617
+ log .Errorf ( "Failed to retrieve OAuth state cookie: %v" , err )
618
618
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
619
619
return
620
620
}
621
621
622
622
if r .FormValue ("state" ) != oauthState .Value {
623
+ log .Warn ("OAuth state mismatch" )
623
624
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
624
625
return
625
626
}
@@ -628,54 +629,58 @@ func oidcRedirect(w http.ResponseWriter, r *http.Request) {
628
629
629
630
_oidc , oauth , err := getOidcProvider (pid , ctx , r .URL .Path )
630
631
if err != nil {
631
- log .Error ( err . Error () )
632
+ log .Errorf ( "Failed to get OIDC provider: %v" , err )
632
633
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
633
634
return
634
635
}
635
636
636
637
provider , ok := util .Config .OidcProviders [pid ]
637
638
if ! ok {
638
- log .Error ( fmt . Errorf ("no such provider: %s" , pid ) )
639
+ log .Errorf ("No such OIDC provider: %s" , pid )
639
640
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
640
641
return
641
642
}
642
643
643
644
verifier := _oidc .Verifier (& oidc.Config {ClientID : oauth .ClientID })
644
645
645
646
code := r .URL .Query ().Get ("code" )
647
+ if code == "" {
648
+ log .Warn ("Missing authorization code in request" )
649
+ http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
650
+ return
651
+ }
646
652
647
653
oauth2Token , err := oauth .Exchange (ctx , code )
648
654
if err != nil {
649
- log .Error ( err . Error () )
655
+ log .Errorf ( "Failed to exchange authorization code: %v" , err )
650
656
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
651
657
return
652
658
}
653
659
654
660
var claims claimResult
655
-
656
- // Extract the ID Token from OAuth2 token.
657
661
rawIDToken , ok := oauth2Token .Extra ("id_token" ).(string )
658
662
659
663
if ok && rawIDToken != "" {
660
- var idToken * oidc.IDToken
661
- // Parse and verify ID Token payload.
662
- idToken , err = verifier .Verify (ctx , rawIDToken )
663
-
664
- if err == nil {
665
- claims , err = claimOidcToken (idToken , provider )
664
+ idToken , err := verifier .Verify (ctx , rawIDToken )
665
+ if err != nil {
666
+ log .Errorf ("Failed to verify ID token: %v" , err )
667
+ http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
668
+ return
666
669
}
670
+ claims , err = claimOidcToken (idToken , provider )
667
671
} else {
668
- var userInfo * oidc.UserInfo
669
- userInfo , err = _oidc .UserInfo (ctx , oauth2 .StaticTokenSource (oauth2Token ))
670
-
671
- if err == nil {
672
+ userInfo , err := _oidc .UserInfo (ctx , oauth2 .StaticTokenSource (oauth2Token ))
673
+ if err != nil {
674
+ log .Errorf ("Failed to retrieve user info: %v" , err )
675
+ http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
676
+ return
677
+ }
672
678
673
- if userInfo .Email == "" {
674
- claims , err = claimOidcUserInfo (userInfo , provider )
675
- } else {
676
- claims .email = userInfo .Email
677
- claims .name = userInfo .Profile
678
- }
679
+ if userInfo .Email == "" {
680
+ claims , err = claimOidcUserInfo (userInfo , provider )
681
+ } else {
682
+ claims .email = userInfo .Email
683
+ claims .name = userInfo .Profile
679
684
}
680
685
681
686
claims .username = getRandomUsername ()
@@ -685,40 +690,39 @@ func oidcRedirect(w http.ResponseWriter, r *http.Request) {
685
690
}
686
691
687
692
if err != nil {
688
- log .Error ( err . Error () )
693
+ log .Errorf ( "Failed to parse claims: %v" , err )
689
694
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
690
695
return
691
696
}
692
697
693
- user , err := helpers .Store (r ).GetUserByLoginOrEmail ("" , claims .email ) // ignore username because it creates a lot of problems
694
- if err != nil {
698
+ user , err := helpers .Store (r ).GetUserByLoginOrEmail ("" , claims .email )
699
+ if errors . Is ( err , db . ErrNotFound ) {
695
700
user = db.User {
696
701
Username : claims .username ,
697
702
Name : claims .name ,
698
703
Email : claims .email ,
699
704
External : true ,
700
705
}
701
706
user , err = helpers .Store (r ).CreateUserWithoutPassword (user )
702
- if err != nil {
703
- log . Error ( err . Error ())
704
- http . Redirect ( w , r , loginURL , http . StatusTemporaryRedirect )
705
- return
706
- }
707
+ }
708
+ if err != nil {
709
+ log . Errorf ( "Failed to create or retrieve user: %v" , err )
710
+ http . Redirect ( w , r , loginURL , http . StatusTemporaryRedirect )
711
+ return
707
712
}
708
713
709
714
if ! user .External {
710
- log .Error ( fmt . Errorf ("OIDC user '%s' conflicts with local user" , user .Username ) )
715
+ log .Errorf ("OIDC user '%s' conflicts with local user" , user .Username )
711
716
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
712
717
return
713
718
}
714
719
715
720
createSession (w , r , user )
716
721
717
722
redirectPath := mux .Vars (r )["redirect_path" ]
718
-
719
723
redirectPath , err = url .JoinPath (util .Config .WebHost , redirectPath )
720
724
if err != nil {
721
- log .Error ( err )
725
+ log .Errorf ( "Failed to construct redirect path: %v" , err )
722
726
http .Redirect (w , r , loginURL , http .StatusTemporaryRedirect )
723
727
return
724
728
}
0 commit comments