2017-10-31 2 views

Antwort

2

Sie müssen machen so etwas wie:

import (
    "crypto/rand" 
    "encoding/base64" 
    "encoding/gob" 
    "golang.org/x/oauth2/google" 
    "golang.org/x/oauth2" 
    calendar "google.golang.org/api/calendar/v3" 
    "github.com/gorilla/sessions" 
) 
var conf oauth2.Config 

func init() { 
    gob.Register(&oauth2.Token{}) 
} 

func getLoginURL(state string) string { 
    // State can be some kind of random generated hash string. 
    // See relevant RFC: http://tools.ietf.org/html/rfc6749#section-10.12 
    return conf.AuthCodeURL(state) 
} 

func randToken() string { 
    b := make([]byte, 32) 
    rand.Read(b) 
    return base64.StdEncoding.EncodeToString(b) 
} 

func Login(w http.ResponseWriter, r *http.Request) { 
    conf = &oauth2.Config{ 
     ClientID: "your-client-id", 
     ClientSecret: "your-client-secret", 
     RedirectUrl: "https://www.yoursite.com/auth", 
     Endpoint: google.Endpoint, 
     Scopes: []string{"https://www.googleapis.com/auth/calendar"} 
    } 
    state := randToken() 
    sess, _ := session.Get(r, "session") 
    sess.Values["state"] = state 
    sess.Save(r, w) 
    http.Redirect(w, r, conf.AuthCodeURL(state), http.StatusFound) 
} 

func Auth(w http.ResponseWriter, r *http.Request) { 
    sess, _ := session.Get(r, "session") 
    state = sess.Values["state"] 
    if state != r.URL.Query().Get("state") { 
     http.Error(w, "authorization failed", http.StatusUnauthorized) 
     return 
    } 
    tok, _ := conf.Exchange(oauth2.NoContext, c.QueryParam("code")) 
    sess.Values["token"] = tok 
    sess.Save(r, w) 
    http.Redirect(w, r, "https://www.yoursite.com/profile", http.StatusFound) 
} 

func GetClient(r *http.Request) *http.Client { 
    sess, _ := session.Get(r, "session") 
    tok, _ := sess.Values["token"].(*oauth2.Token) 
    client := conf.Client(oauth2.NoContext, tok) 
    return client 
} 

func Calendar(w http.ResponseWriter, r *http.Request) { 
    client := GetClient(r) 
    calendarService, _ = calendar.New(client) 
    //do stuff 
} 

So, können Sie sie zu Ihrem Login Handler senden, erzeugt dies einen zufälligen Schlüssel und sendet sie (und den Benutzer) googeln sie anmelden und genehmigen Sie müssen ihre Kalender zugreifen, die wird sie dann zu dir umleiten Auth Handler. Dadurch wird sichergestellt, dass der von Ihnen gesendete Schlüssel state mit dem von Ihnen gesendeten übereinstimmt, und wenn dies der Fall ist, wird der Token von Google bezogen. Sie speichern es dann in der Sitzung. Wenn Sie ihren Client abrufen möchten, rufen Sie das Token aus Ihrer Sitzung ab und verwenden es, um einen neuen Client auszutauschen, den Sie dann zum Erstellen Ihres Kalenderdiensts verwenden.

Ich habe den Code nicht genau überprüft, aber ich habe versucht, ein minimales Beispiel von meiner App zu machen, die eigentlich diesen Code verwendet, also sollte es funktionieren (abgesehen davon, dass wahrscheinlich ein Import oder Tippfehler oder ein paar kleinere Dinge fehlen) .

Verwandte Themen