2016-04-17 11 views
3

Dieser Code funktioniert:Unable Paket „golang.org/x/oauth2“ verwenden, um mit Facebook zu authentifizieren: „Fehlende redirect_uri Parameter“

func handleFacebookCallback(w http.ResponseWriter, r *http.Request) { 
    state := r.FormValue("state") 
    if state != oauthStateString { 
     fmt.Printf("invalid oauth state, expected '%s', got '%s'\n", oauthStateString, state) 
     http.Redirect(w, r, "/", http.StatusTemporaryRedirect) 
     return 
    } 

    code := r.FormValue("code") 

////////////////////////////////////////////////////  
    Url, err := url.Parse(oauthConf.Endpoint.TokenURL) 
    if err != nil { 
     log.Fatal("Parse: ", err) 
    } 
    parameters := url.Values{} 
    parameters.Add("client_id", oauthConf.ClientID) 
    parameters.Add("client_secret", oauthConf.ClientSecret) 
    parameters.Add("redirect_uri", "http://localhost:9090/oauth2callback") 
    parameters.Add("code", code) 
    Url.RawQuery = parameters.Encode() 
    resp, err := http.Get(Url.String()) 

    if err != nil { 
     fmt.Printf("Get: %s\n", err) 
     http.Redirect(w, r, "/", http.StatusTemporaryRedirect) 
     return 
    } 
    defer resp.Body.Close() 

Aber wenn ich das Teil unterhalb der Markierung ersetzen //////... mit:

token, err := oauthConf.Exchange(oauth2.NoContext, code) 
    if err != nil { 
     fmt.Printf("oauthConf.Exchange() failed with '%s'\n", err) 
     http.Redirect(w, r, "/", http.StatusTemporaryRedirect) 
     return 
    } 

ich:

oauthConf.Exchange() ist fehlgeschlagen mit ‚oauth2: nicht Token holen: 400 Bad Request Response: { "Fehler": { "message": "Missing redirect_uri Parameter.", "Type": "OAuthException", "Code": 191, "fbtrace_id": "XXXX"}}‘

Kann das Paket golang.org/x/oauth2 keinen code für einen token austauschen?

Antwort

1

Ich fand heraus, was fehlte. Ich muss anscheinend das RedirectURL Feld in der oauthConfig Struktur hinzufügen, um Exchange() zu erhalten, um richtig zu arbeiten. Dies ist nicht der Fall für Slack oder GitHub, aber anscheinend ist FB etwas wählerischer.

var oauthConf = &oauth2.Config{ 
     ClientID:  "YOUR_CLIENT_ID", 
     ClientSecret: "YOUR_CLIENT_SECRET", 
     RedirectURL: "http://localhost:9090/oauth2callback", /* Fixed! */ 
     Scopes:  []string{"public_profile"}, 
     Endpoint:  facebook.Endpoint, 
    }