Go
GAE
Twitter

GAE/Goでanacondaを利用した認証

GAE/Goにてanacondaを利用した際にトークンの取得でハマったのでその際のメモ


使用ライブラリの導入

go get "github.com/ChimeraCoder/anaconda"
go get "github.com/garyburd/go-oauth/oauth"
go get "google.golang.org/appengine"

importとかはみんな勝手にやってもらってるよね?


呼び出し元ハンドラ設定

ルーティングやTwitterの設定などは割愛
consumerKey,consumerSecretは適時自身のものと読み替えてください。

GAEではそのままのhttp clientでは怒られるので
http.DefaultClient.Transport = &urlfetch.Transport{Context: ctx}の記述が必要っぽい

var credential *oauth.Credentials

func GetRequestTokenHandler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    http.DefaultClient.Transport = &urlfetch.Transport{Context: ctx}

    anaconda.SetConsumerKey("consumerKey")
    anaconda.SetConsumerSecret("consumerSecret")

    url, tmpCred, err := anaconda.AuthorizationURL("GetAccessTokenHandlerが呼ばれるURL")
    if err != nil {
        return
    }
    credential = tmpCred
    http.Redirect(w, r, url, http.StatusFound)
}

コールバック先のハンドラ

こちらもhttp.DefaultClient.Transport = &urlfetch.Transport{Context: ctx}を記述を忘れずに

func GetAccessTokenHandler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    http.DefaultClient.Transport = &urlfetch.Transport{Context: ctx}

    c, _, err := anaconda.GetCredentials(credential, r.URL.Query().Get("oauth_verifier"))
    if err != nil {
        return
    }
    api := anaconda.NewTwitterApi(c.Token, c.Secret)
    // TEST POST
    api.PostTweet("test tweet", nil)
}