ページ

2014年1月4日土曜日

GoogleのoAuth2.0への認証手順

今回は、よく悩むGoogleのoAuth2.0の対応について記載いたします。(自分メモの意味が強いですが悪しからず
oAuth2.0はGoogleのサービスであるanalysis,Adsense,Blogger,Youtubeなどの
情報をAPI経由で取得する際に利用ができます。

oAuth2.0の認証トークンを取得する部分を中心に記載いたします。
その後、サンプルコードも順次作っていく予定(たぶん・・・

では、oAuth2.0には主だって3種類の認証の方法があります。
  1. Web Applicationに組み込む
  2. クライアントアプリに組み込む
  3. Android・iOSのアプリに組み込む
ぱっと思い当たるのではこの辺りでしょう。
 今回は「クライアントアプリに組み込む」を中心に記載してきます。
 この「クライアントアプリに組み込む」はバッチ処理にも利用できるので大変便利かと
思います。Googleのドキュメントでは、「urn:ietf:wg:oauth:2.0:oob」こちらになります。
目標は、「アクセストークン」の取得になります。 
では、以下のステップで記載していきます。
  1. Google Consoleにプロジェクトを作成する
  2. APIアクセスを有効化する
  3. oAuth2.0の認証情報を作成する
  4. 一時コード(以下code)を取得する
  5. codeを利用しアクセストークンを取得する
  6. リフレッシュトークンからアクセストークンを取得する


Google Consoleにプロジェクトを作成する

とりあえずこちら(Google Console)にアクセスを行いましょう。
今までプロジェクトを作成したことがなければ、図1のような画面になりここから手順は記載いたします。
すでにご存知の方は、次のステップからどうぞ


図1.プロジェクト新規作成


図2.利用規約の同意





これで初期プロジェクトは作成完了名称がAPI Projectになっているため変更が
必要があれば、画面上の「API Project」を選択し、チェックボックスにチェックを入れ「rename」で対応できる

APIアクセスを有効化する

利用したいAPIを有効化するだけですが、注意点があります。
APIによっては、Google側に承認を得ないと動作しないAPIもあります。
とりあえず画面に移動「APIs & auth」⇒「APIs」で一覧に移動できます。

YouTube Data API v3の場合は認証が必要ないAPIの一つです
こちらの場合は、図3のように登録すると利用できます。

図3.YouTube Data API v3の有効作業画面




では、Google側に承認作業が必要な場合は以下のようになります。
Blogger API v3であれば以下の図4の画面となります。

図4.Blogger API v3の承認画面








各画面で必須が異なるのでご注意ください。
その他には、AdSense Host APIなども認証が必要です。


oAuth2.0の認証情報を作成する

では、本題の認証情報を作成しましょうとは言っても手順は簡単です。
APIs & auth」⇒「credentials」に行き図5の画面にあるように
CREATE NEW CLIENT ID」を選択します。

図5.oAuth2.0の認証情報作成





ボタンを押したら図6の画面が表示されますが
今回は、クライアントアプリ等で動かすのが目的なので
真ん中の「Service account」を指定します

図6.oAuth2.0認証の対象を指定






Create Client ID」を押すと.p12の拡張子ものがDLできます。
こちらはアプリに組み込み利用することがありますが今回は
利用しないのでスルーします。


図7.認証後の画像



登録が完了すると図7のようにoAuth2.0に必要な
Client ID」「Email address」「Public key fingerprints
の3つが出てきます。(こちら他人に漏らさないように)これで準備完了です。


一時コード(以下code)を取得する

ここからは、いよいよアクセストークンを取得するために準備します。
では改めて詳細な方法を記載します。
アクターは、二人います。APIをつなぐ側、とAPIに操作される側です
それぞれGoogleのアカウントです。ここでは、前者をアカウント1、後者をアカウント2と呼びます。
便宜上分けていますが、同意アカウントアカウント1だけでも同様の処理が必要です。

以下の手順になります。
  1. oAuth2.0でアクセスしたい相手にcode作成用のURLを通知する【アカウント1作業】
  2. アカウント1から届いた、URLにアクセスしcodeを取得し、アカウント1に通知する【アカウント2作業】
  3. アカウント2から届いたcodeからアクセストークンを生成【アカウント1作業】

oAuth2.0でアクセスしたい相手にcode作成用のURLを通知する【アカウント1作業】

アカウント2に連絡するURLを作成します。
こちらは、規則があるので単純です。
https://accounts.google.com/o/oauth2/auth?scope={scope}redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id={client_id}&access_type=offline
上記の中でclient_idは図7のClient IDから置き換えます。
scopeについては、アクセスしたいAPIに応じ変更する必要があります主要なものをメモしました。注意点として、URLエンコードする必要があります。
複数個指定の場合はスペース【%20】でつなぎます
認証が必要な分だけ指定してください。
アクセスサービス scope
【エンコード後のscope】
AdSense Host API v4.1 https://www.googleapis.com/auth/adsensehost
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fadsensehost】
Google Analytics API v3 https://www.googleapis.com/auth/analytics
https://www.googleapis.com/auth/analytics.edit
https://www.googleapis.com/auth/analytics.manage.users
https://www.googleapis.com/auth/analytics.readonly
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fanalytics%20https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fanalytics%2eedit%20…】
Blogger API V3 https://www.googleapis.com/auth/blogger
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fblogger】
Google+ API v1 https://www.googleapis.com/auth/plus.login
https://www.googleapis.com/auth/plus.me
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profile
【https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fplus%2elogin%20https%3a%2f%2fwww%2egoogleapis%2ecom%2fauth%2fplus%2eme%20…】

このURLをアカウント2側に送ります。


アカウント1から届いた、URLにアクセスしcodeを取得し、アカウント1に通知する【アカウント2作業】

作業がアカウント2に移ります。アカウント1から教えられたURLをたたくと図8の画面に移動します。
図8.認証画面









認証画面で表示されている項目にアクセスする許可を求めているので
確認後問題なければ「承認する」を選択します。
この画面では、アナリティクスのscpoeを利用しましたが許可以外に
アクセス範囲などを指定する必要があるなど手間があります。
何らかの形でマニュアルかする場合はご注意を
また、図8上部に「API Project」とあります。こちらが
oAuth2.0のプロジェクト名です。こちらが気になる方はご変更をGoogle Console内
APIs & auth」⇒「Consent screen」よりHPやロゴなどの変更ができます。

話を戻し、図8の内容を「承認する」と以下の図9の画面となります。

図9.code取得が面






こちらのテキストの内容をアカウント1に教えてください。
これで、アカウント2の作業は完了です。


アカウント2から届いたcodeからアクセストークンを生成【アカウント1作業】

アカウント2から届いたcodeを利用しアクセストークンを取得します。
前々から出ているようにcodeはアカウント2がアカウント1に許可しましたよとGoogleに通知してるないようです。
アカウント1がGoogleにAPIでアカウント2にアクセスすると通知するのがアクセストークンとなる訳です。
ですのでこの内容が漏洩してもアカウント2は勝手にアカウント1以外からそうさされる訳ではありません。

気を取りなしてcodeからアクセストークンに変換しましょう。
以下のURLからアクセストークンを取得できるのですがPOSTをする必要があります。
私はMacで操作しているためMac用のcurlで記載いたします。
Linuxならwgetでも代用できます。

curl -d "code={code}&clent_id={client_id}&client_secret={client_secret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code"  https://accounts.google.com/o/oauth2/token
こちらのないようです。
{code}はアカウント1からの内容、{client_id}, {client_secret}は図7のGoogle Consoleから置き換えください。

こちらを実行すると以下のような内容が帰ってきます。
{
  "access_token" => "y------------------------",
  "token_type" => "Bearer",
  "expires_in" => 3600,
  "refresh_token" : "1/C------------------------"
}
JSONフォーマットとなります。こちらを利用しAPIで問い合わせを行います。
とりあえずアクセストークンを取得できたのでAPIが使えるようになりました。



リフレッシュトークンからアクセストークンを取得する

最後に、リフレッシュトークンについてです。
先ほど取得したアクセストークンですが、30秒ほどしか持ちません。
これは、セキュリティ上の仕様とのことです。そのため30秒毎に
新しいアクセストークンをアカウント2に依頼するのは現実的ではありませんその際に利用するのが
リフレッシュトークン(以下refresh_token)です。


refresh_tokenを利用することで新しいアクセストークンが取得できます。
こちらもPOSTを実施するような形となります。

curl -d "client_id={client_id}&client_secret={client_secret}&refresh_token={refresh_token}&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token
このような形になります。
レスポンスは、以下
{
  "access_token":"1/-----------",
  "expires_in":3920,
  "token_type":"Bearer"
}
このようになります。こちらのアクセストークンを利用しAPI接続を行います。
長くなりましたが以上が説明になります。
必要あればご活用ください。



ブログを書いている間に気がついたのですがGoogle Console日本語化できるのですね














API Project」を選択し、「Account settings」に行けば設定項目があります。
しっかりと見てみるものです。