Golang Cafe #18 まとめ goauth2を試す
2014/02/23に開催された「Golang Cafe #18」についてのまとめです。
今回はいつもとは少し違ってgoauth2を使ってGoogleのCalendar APIとDrive APIを試してみました。とはいうものの、メインはgoauth2でGoogleのOAuth2認証が出来るかどうか試してみることでした。
+TakashiYokoyama氏が準備してくれたサンプルはgoauth2sampleになります。私のサンプルは後ほどのエントリーでまとめます。
GoogleAPIの利用準備
Google Developers Consoleにアクセスします。
Developers Consoleで各種APIのステータスを変更する際日本語だとうまく動作しない場合があるそうなので英語に切り替えます。
「Account settings」でLanguageとFormatを変更しおきます。
「Project」の「Create Project」で適当なプロジェクトを作成します。
プロジェクト名は適当で構いません。
作成したプロジェクトの画面で「APIs」を選択し、APIのステータスを切り替えます。ボタンをクリックしてもすぐには切り替わらない時があるので焦ってはいけません。
プロジェクトの画面で「Credentials」を選択し、「CREATE NEW CLIENT ID」ボタンを押します。
Installed applicationとOtherを選択して、「Create Client ID」をクリックします。
新しいClient IDが発行されるので以降のサンプルではこのClient ID、Client secret、Redirect URIs(urn:で始まる方)を使用することになります。
goauth2パッケージの準備
今回はOAuth2認証を行うためにgoauth2パッケージを使用します。
Google Codeにて公開されていますのでインスールしておきます。
$ go get code.google.com/p/goauth2/oauth
サンプル検証
今回はOAuth2を試すのがメインでGoogleAPIの使用はおまけなので、GoogleAPIの使用方法については言及しません。したがってcalendarsampleの認証部分の説明に留めます。
以下のコードはgetcalendarlist.goからの抜粋です。
まずは認証を行うためにoauth.Configを作ります。
config := &oauth.Config{ ClientId: auth.ClientID, ClientSecret: auth.Secret, RedirectURL: auth.RedirectUrl, Scope: scope, AuthURL: request_token_url, TokenURL: auth_token_url, TokenCache: oauth.CacheFile(cachefile), }
ClientId、ClientSecret、RedirectURLは上で作成したものを使用します。このサンプルではauthがこれらの値の画面からの入力、jsonへの保存、復元を行っています。
Scope、AuthURL、TokenURLはそれぞれ必要なものを設定します。
TokenCacheには認証済みの情報を保存するファイルを指定します。goauth2パッケージは一度認証が成功するとその情報を保存しておいて、毎回認証する手間を省いてくれます。
transport := &oauth.Transport{Config: config} // キャッシュからトークンファイルを取得 _, err = config.TokenCache.Token() if err != nil { // キャッシュなし // 認証コードなし=>ブラウザで認証させるためにURLを出力 if code == "" { url := config.AuthCodeURL("") fmt.Println("ブラウザで以下のURLにアクセスし、認証して下さい。") fmt.Println(url) return } // 認証トークンを取得する。(取得後、キャッシュへ) _, err = transport.Exchange(code) if err != nil { fmt.Println("Exchange: ", err) return } }
次に作成した設定情報を元にTransportを作成します。
Transportは認証を行い、認証済のhttp.Clientを提供します。
config.TokenCache.Token()にて認証済トークンが取得できるので、トークンが存在しない場合は未認証として認証処理を行います。
Config.AuthCodeURLメソッドで認証用URLを取得できるので、ブラウザからそのURLにアクセスして認証を行います。
表示されたコードをコピーします。
そこで取得したコードを引数にプログラムを再度実行すると、今度はコードが指定されているのでtransport.Exchangeメソッドでコードを元に認証済トークンを取得できます。
r, err := transport.Client().Get(request_url) if err != nil { fmt.Println("Get: ", err) return } defer r.Body.Close()
transport.Clientメソッドで認証済のhttp.Clientを取得できるので、あとはいつも通りにコンテンツを取得します。
以上のような流れで非常に簡単にOAuth2認証を行うことができました。
ただ、GAE/Gにデプロイするコマンドappcfg.pyはオプションを指定して起動すると、ブラウザが自動的に立ち上がり、承認後自動で閉じて処理を継続しているようです。
同じようなことができないかと+TakashiYokoyama氏と頑張ってみたところ、なんとか実現することができました。
こちらについては別エントリーにまとめたいと思います。
appcfg.pyはPythonで書かれているのでPythonistaのRyujiIwata氏に解読してもらおうかと思いましたが、本日は残念ながらお仕事で欠席でした。
次回について
次回のGolang Cafe #19はTwelve Go Best Practicesを読む事になりました。