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) .