2011年10月26日水曜日

WindowsPhoneでGoogle+に対してOAuth認証

Google+APIでの認可を書いて、
後日WindowsPhoneへの移植を試みた。。。


しかしそれと同時に衝撃の事実。
DLLの参照設定ができないのだ。



「WindowsPhoneアセンブリのみと連動・・・」・・・なんとっ!

ということでOAuthの生コードを書くことにした。
何か調べるとライブラリは存在するのだが、OAuth1.0っぽいもの(Twitter系)が多くて
勝手に使い物にならないと判断した。

まぁC#触るの自体久しぶりだし、言語になれる意味でやっていきますか。
ってことで結局Google+のOAuthのページを読むことにした。

画面を作ります。

OAuthにはブラウザアクセスが必要なので、ブラウザを準備して
作成した認証コードが必要になるのでテキストと認証用のボタンを準備しておきます。

認証用のURLの発行

上記のURLにある通りにアクセスするURLを作成します。

https://accounts.google.com/o/oauth2/auth?
  client_id=xxxxxxx.apps.googleusercontent.com&
  redirect_uri=urn:ietf:wg:oauth:2.0:oob&
  scope=https://www.googleapis.com/auth/plus.me&
  response_type=code

自分のクライアントIDを添えてブラウザでアクセスします。
scopeに関しては上記のOAuthのサイトでは、別のスコープになってますので注意してください。

これを画面の初期化時にブラウザに設定して呼び出します。
※もちろん本物のアプリは違うタイミングでしょうけど。




こういう風にGoogleの認証ページになります。
認証は前にやった時と同じように行います。で認可が下りると
AuthCodeが発行された画面になります。


アクセストークンを取得する

AuthCodeコードがブラウザ画面に出ますので下にあるテキストボックスに貼付け
「認証」ボタンを押したところで


https://accounts.google.com/o/oauth2/token

のURLに対して

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

client_id=xxxxxxxxx.apps.googleusercontent.com&
client_secret=xxxxxxxxxxx&
code={AuthCode}&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
grant_type=authorization_code

というポストを書いてあげます。
「code」は認証した後に発行された認証コードをテキストボックスに設定した値になります。

ここでWindowsPhoneは非同期処理しかないので送信には
BeginGetResponse(),BeginGetResponse()などを利用する必要があります。

これにより


{
  "access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in":3920,
  "token_type":"Bearer",
  "refresh_token":"1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ"
}

というような文字列が取得できます。
これらの解析にはNewtonsoft.Json.Silverlightを使用しました。


Google+にアクセスする。

さてアクセストークンができたので何はともあれアクセスです。


https://www.googleapis.com/plus/v1/people/me?access_token=xxxxxx


とアクセスしてあげたら自分の情報が取れます。
※meは自分の情報ってことなのでAPI的にはuserIdを指定してあげればOKです。

これでまたJsonが戻ってきますので、解析してあげたらOKなわけです。
OAuth2.0ですので、アクセストークンの時間が切れた場合は
refresh_tokenで再発行を行う必要があります。

その際はアクセストークン時に使用した引数を

refresh_token=1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ&
grant_type=refresh_token


と変えて再発行すれば再認可は必要なくなります。
※refresh_tokenも期限はあるみたいです。




総括


基本的にはOAuthの説明です。
やったことある方なら通常のGoogleのドキュメントだけでOKだと思います。


詳しいAPIの説明は
https://developers.google.com/+/api/
にあります。


注意すべきは
・現状ではGoogleのクライアントAPIでは、WindowsPhoneアプリは無理なこと。
・WindowsPhoneの非同期等のポリシーなどでWebアクセスが通常ではないこと。
・C#が結構イケテル事。
・API呼び出しはBearerを利用した方がいいと思います。
・更新系のGoogle+APIがまだ

WindowsPhoneとC#になれる時間もいるのでゆっくりクライアントを作っていく予定。

さて、ではWindowsPhoneアプリの開発ですね。

2 件のコメント:

Tadahiro さんのコメント...

まぁWindows Phone 7ははっきり言って独自世界ですね。とにかくUIレスポンスを遅くしないために何でも非同期になります。(この辺はWindows 8のMetroでも同じ。)OAuthについてはhttp://neue.cc/2010/09/12_276.htmlなんかも参考になるかと。

Unknown さんのコメント...

WindowsPhoneとC#で結構刺激的にやらせてもらってます。この設計思想嫌いじゃないですね~。

C#1.0世代なので2.0、3.0に追いついていく予定です。ヽ(´Д`;)ノ