2017-10-31 6 views

答えて

2

を取得する必要がありますどのようにあなたがする必要があります私は、このリンクGoogle Quickstart

にサンプルを開いたが、私はクライアントを取得する方法は、キーであるGoogleは私に をそれを与えますような何か:

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 
} 

だから、あなたはあなたのLoginハンドラに送信し、これはランダムなキーを生成し、そして、自分のカレンダーにアクセスするためにそれらがログインしていて、あなたを許可するためにGoogleに(およびユーザー)を送信しますあなたにリダイレクトされますAuthハンドラ。これにより、返されたstateの鍵があなたが送った鍵と一致することを確認し、そうであればGoogleからトークンを取得します。それをセッションに保存します。クライアントを取得する場合は、セッションからトークンを取得し、それを使用して新しいクライアントを交換します。次に、このクライアントを使用してカレンダーサービスを作成します。

私はコードを正確にはチェックしていませんが、実際には基本的にこのコードを使用しているアプリケーションから最小限の例を作成しようとしています(インポートやタイプミス、 。

関連する問題