@@ -742,7 +742,7 @@ func (api *API) postLogout(rw http.ResponseWriter, r *http.Request) {
742
742
// @Security CoderSessionToken
743
743
// @Produce json
744
744
// @Tags Users
745
- // @Success 200 {object} map[string]string "Returns a map containing the OIDC logout URL"
745
+ // @Success 200 {object} codersdk.OIDCLogoutResponse "Returns a map containing the OIDC logout URL"
746
746
// @Router /users/oidc-logout [get]
747
747
func (api * API ) userOIDCLogoutURL (rw http.ResponseWriter , r * http.Request ) {
748
748
ctx := r .Context ()
@@ -757,6 +757,11 @@ func (api *API) userOIDCLogoutURL(rw http.ResponseWriter, r *http.Request) {
757
757
return
758
758
}
759
759
760
+ logger := api .Logger .Named (userAuthLoggerName )
761
+
762
+ // Default response: empty URL if OIDC logout is not supported
763
+ response := codersdk.OIDCLogoutResponse {URL : "" }
764
+
760
765
// Retrieve the user's OAuthAccessToken for logout
761
766
// nolint:gocritic // We only can get user link by user ID and login type with the system auth.
762
767
link , err := api .Database .GetUserLinkByUserIDLoginType (dbauthz .AsSystemRestricted (ctx ),
@@ -765,16 +770,17 @@ func (api *API) userOIDCLogoutURL(rw http.ResponseWriter, r *http.Request) {
765
770
LoginType : user .LoginType ,
766
771
})
767
772
if err != nil {
768
- api .Logger .Error (ctx , "failed to retrieve OIDC user link" , "error" , err )
769
773
if xerrors .Is (err , sql .ErrNoRows ) {
770
- httpapi .Write (ctx , rw , http .StatusNotFound , codersdk.Response {
771
- Message : "No OIDC link found for this user." ,
772
- })
773
- } else {
774
- httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
775
- Message : "Failed to retrieve user authentication data." ,
776
- })
774
+ logger .Warn (ctx , "no OIDC link found for this user" )
775
+ httpapi .Write (ctx , rw , http .StatusOK , response )
776
+ return
777
777
}
778
+
779
+ logger .Error (ctx , "failed to retrieve OIDC user link" , "error" , err )
780
+ httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
781
+ Message : "Failed to retrieve user authentication data." ,
782
+ Detail : err .Error (),
783
+ })
778
784
return
779
785
}
780
786
@@ -787,19 +793,18 @@ func (api *API) userOIDCLogoutURL(rw http.ResponseWriter, r *http.Request) {
787
793
logoutURI := dvOIDC .LogoutRedirectURI .Value ()
788
794
789
795
if oidcEndpoint == "" {
790
- api .Logger .Error (ctx , "missing OIDC logout endpoint" )
791
- httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
792
- Message : "OIDC configuration is missing." ,
793
- })
796
+ logger .Warn (ctx , "missing OIDC logout endpoint" )
797
+ httpapi .Write (ctx , rw , http .StatusOK , response )
794
798
return
795
799
}
796
800
797
801
// Construct OIDC Logout URL
798
802
logoutURL , err := url .Parse (oidcEndpoint )
799
803
if err != nil {
800
- api . Logger .Error (ctx , "failed to parse OIDC endpoint" , "error" , err )
804
+ logger .Error (ctx , "failed to parse OIDC endpoint" , "error" , err )
801
805
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
802
806
Message : "Invalid OIDC endpoint." ,
807
+ Detail : err .Error (),
803
808
})
804
809
return
805
810
}
@@ -820,7 +825,7 @@ func (api *API) userOIDCLogoutURL(rw http.ResponseWriter, r *http.Request) {
820
825
logoutURL .RawQuery = q .Encode ()
821
826
822
827
// Return full logout URL
823
- response := map [ string ] string { "oidc_logout_url" : logoutURL .String ()}
828
+ response . URL = logoutURL .String ()
824
829
httpapi .Write (ctx , rw , http .StatusOK , response )
825
830
}
826
831
0 commit comments