2013-11-24 8 views
10

Ich habe mir zwei Tage lang den Kopf dafür geschlagen und mir fehlt eindeutig etwas. Ich bin ein bisschen ein Doofus auf Backend/Server-Entwicklung und hoffe, dass jemand mich in die richtige Richtung zeigen kann.Oauth2 in Go mit Martini - ResponseWriter Syntax für Reddit

  • Ich habe eine Desktop-Anwendung (nicht Go), die eine OAuth2-Anfrage von Reddit macht.
  • Der OAuth2 in meiner Anwendung funktioniert gerade gut, aber der Fluss schlägt fehl, wenn Reddit die Weiterleitungs-URI auf meinem eigenen Server traf.
  • Ich schätze, es wartet auf das richtige ResponseWriter-Ergebnis und keines meiner Dutzend inkompetenten Versuche hat funktioniert.
  • Die Umleitung URI trifft meine Server und Callback-Funktion (unten) dann tut nichts.
  • Fragen

    • Wo falsch gehe ich?
    • Ist Variable "t" meine Auth-Code und bin ich fertig (aka, du bist ein Hanswurst!)?
    • Kann ich einfach meinen Wert in meine Non-Go-App schreiben und fertig sein?
    • Oder fehlt mir ein Schritt?
    • Hinweis: Code leicht vereinfacht.

    Vielen Dank!

    package main 
    
    import (
        "code.google.com/p/goauth2/oauth" 
        "fmt" 
        "github.com/codegangsta/martini" 
        "io" 
        "net/http" 
    ) 
    
    var config = &oauth.Config{ 
        ClientId:  CLIENT_ID, 
        ClientSecret: CLIENT_SECRET, 
        Scope:  "identify", 
        AuthURL:  "https://ssl.reddit.com/api/v1/authorize", 
        TokenURL:  "https://ssl.reddit.com/api/v1/access_token", 
        RedirectURL: "http://localhost:3000/reddit_oauth", 
    } 
    
    func main() { 
        m := martini.Classic() 
        m.Get("/reddit_oauth", handleCallback) 
        m.Run() 
    } 
    
    func handleCallback(w http.ResponseWriter, r *http.Request) { 
        //Get the code from the response 
        code := r.FormValue("code") 
    
        // Exchange the received code for a token 
        t := &oauth.Transport{Config: config} 
        t.Exchange(code) 
    
        // Am I done? 
    } 
    

    Referenzpunkte

    Misc

    • Warum Martini? Es sieht verdammt gut aus.
    • Warum nicht nur Oauth2? Weil ich unwissend bin.
    • Warum nicht PHP/Python? Weil, komm schon! Ich versuche Go zu lernen. (Ich liebe es und einige tolle Ergebnisse, die meine UI Arbeit verbessert.)
    +2

    't.Exchange (Code) 'gibt das Authentifizierungs-Token und einen Fehler zurück. Überprüfen Sie deren Wert. – thwd

    +1

    Siehe auch hier für ein vollständigeres Beispiel: https://code.google.com/p/goauth2/source/browse/oauth/example/oauthreq.go – elithrar

    +0

    Danke für die Leads. Ich werde es mir ansehen und einen weiteren Riss machen. – Geoffrey

    Antwort

    1

    Okay, die Antwort saß meist in meiner Client-Anwendung - wieder, nicht Go - die ein paar fehlende Aspekte in seinem OAuth2 hatte anfordern. (Es dauerte auch ein wenig Mühe die Header richtig für die verschiedenen Anfragen zu erhalten.)

    Die besten Infos zu Reddit des OAuth2 Prozess fand ich war hier: http://www.reddit.com/r/redditdev/comments/197x36/using_oauth_to_send_valid_requests/

    Die Antwort von Reddit noch Pings mich für die ClientID fragen und ClientSecret, von dem ich sicher bin, dass er über einen geeigneten ResponseWriter bedient werden könnte, obwohl ich im Moment einfach in ein Popup kopiere/einfüge, damit ich mich auf etwas anderes konzentrieren kann!

    Wenn ich das Quadrat entfernt habe, werde ich diese Antwort hinzufügen.

    Wenn jemand an weiteren Informationen interessiert ist, zögern Sie bitte nicht zu fragen.

    Nochmals vielen Dank, TomWilde und Elithrar!

    +0

    Ein anderer Tag des Kampfes enthüllte das Problem: Ein Fehler-Handler überschrieb ständig die Ergebnisse des Erfolgs-Handlers. – Geoffrey

    Verwandte Themen