2017年1月20日金曜日

Golang Cafe #18 まとめ goauth2を試す 2014-02-25

勉強の為に引用しました。
http://d.hatena.ne.jp/taknb2nch/20140225/1393314429


2014/02/23に開催された「Golang Cafe #18」についてのまとめです。
今回はいつもとは少し違ってgoauth2を使ってGoogleのCalendar APIとDrive APIを試してみました。とはいうものの、メインはgoauth2GoogleのOAuth2認証が出来るかどうか試してみることでした。

+TakashiYokoyama氏が準備してくれたサンプルはgoauth2sampleになります。私のサンプルは後ほどのエントリーでまとめます。

GoogleAPIの利用準備

Google Developers Consoleにアクセスします。
Developers Consoleで各種APIのステータスを変更する際日本語だとうまく動作しない場合があるそうなので英語に切り替えます。
「Account settings」でLanguageとFormatを変更しおきます。

f:id:taknb2nch:20140225145705p:image:w300

「Project」の「Create Project」で適当なプロジェクトを作成します。

f:id:taknb2nch:20140225145706p:image:w300

プロジェクト名は適当で構いません。

f:id:taknb2nch:20140225145707p:image:w300

作成したプロジェクトの画面で「APIs」を選択し、APIのステータスを切り替えます。ボタンをクリックしてもすぐには切り替わらない時があるので焦ってはいけません。

f:id:taknb2nch:20140225145708p:image:w300

プロジェクトの画面で「Credentials」を選択し、「CREATE NEW CLIENT ID」ボタンを押します。

f:id:taknb2nch:20140225145709p:image:w300

Installed applicationとOtherを選択して、「Create Client ID」をクリックします。

f:id:taknb2nch:20140225145710p:image:w300

新しいClient IDが発行されるので以降のサンプルではこのClient ID、Client secret、Redirect URIs(urn:で始まる方)を使用することになります。

f:id:taknb2nch:20140226133705p:image:w300

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にアクセスして認証を行います。

f:id:taknb2nch:20140225163048p:image:w300

表示されたコードをコピーします。

f:id:taknb2nch:20140225163049p:image:w300

そこで取得したコードを引数プログラムを再度実行すると、今度はコードが指定されているので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 #19Twelve Go Best Practicesを読む事になりました。


0 コメント:

コメントを投稿