You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@casbin.apache.org by hs...@apache.org on 2026/09/05 11:42:11 UTC

(casbin-gateway) 03/03: fix(connections): name the application, not the status code, when a grant is refused

This is an automated email from the ASF dual-hosted git repository.

hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-gateway.git

commit ea3d2e1232142c638c11a3afd606f64d767b3d08
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Sat Sep 5 19:41:59 2026 +0800

    fix(connections): name the application, not the status code, when a grant is refused
---
 object/connection_oauth.go | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/object/connection_oauth.go b/object/connection_oauth.go
index 11ba16c..db3f502 100644
--- a/object/connection_oauth.go
+++ b/object/connection_oauth.go
@@ -265,10 +265,6 @@ func exchange(found connector.Connector, credentials map[string]string, form url
 	if err != nil {
 		return nil, err
 	}
-	if response.StatusCode >= 400 {
-		return nil, fmt.Errorf("the token endpoint answered %s: %s", response.Status, summarize(body))
-	}
-
 	var granted struct {
 		AccessToken  string `json:"access_token"`
 		RefreshToken string `json:"refresh_token"`
@@ -276,12 +272,22 @@ func exchange(found connector.Connector, credentials map[string]string, form url
 		Error        string `json:"error"`
 		ErrorText    string `json:"error_description"`
 	}
-	if err := json.Unmarshal(body, &granted); err != nil {
-		return nil, fmt.Errorf("the token endpoint did not answer with JSON: %s", summarize(body))
+	readable := json.Unmarshal(body, &granted) == nil
+
+	// The body is read before the status, because the status is the less
+	// informative half of the answer: an error comes back with 200 more often
+	// than it should, and GitHub answers an application it does not know with
+	// 404 and nothing but {"error":"Not Found"}. Reporting the status first
+	// would send somebody looking at the URL when the client id is the problem.
+	if readable && granted.Error != "" {
+		return nil, fmt.Errorf("the token endpoint refused this application: %s %s",
+			granted.Error, granted.ErrorText)
 	}
-	// An error here comes back with 200 more often than it should.
-	if granted.Error != "" {
-		return nil, fmt.Errorf("%s: %s", granted.Error, granted.ErrorText)
+	if response.StatusCode >= 400 {
+		return nil, fmt.Errorf("the token endpoint answered %s: %s", response.Status, summarize(body))
+	}
+	if !readable {
+		return nil, fmt.Errorf("the token endpoint did not answer with JSON: %s", summarize(body))
 	}
 	if granted.AccessToken == "" {
 		return nil, fmt.Errorf("the token endpoint returned no access token")


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org