Android Advent Calendar 2012 12/24 

 Googleアカウントでのサービス認可周りの紹介(OAuth2.0とか Google Play Servicesとか Cloud Endpointsとか)

 

 Android Advent Calendar 2012 12/24(表)担当の @t_egg です。明日はクリスマスですね。クリスマスとは、夢があるという名目で子ども達に嘘をつく親が大量発生する日であると共に、聖なる夜ならぬ性なる夜でもあったりするようですが、リア充なAndroidデベロッパーの皆様はいかがお過ごしでしょうか。

 今日の私のエントリでは、GoogleアカウントとGoogleサービスとの連携に関連するテーマに触れます。連携に関係するものとして、Google Play Servicesや、Google Cloud Endpoints などについても軽く紹介したいと思います。

Googleアカウント

 店頭などで買えるAndroidデバイスの多くは、GMail、MapsやPlay StoreなどのGoogleアプリがインストールされているAndroid互換デバイスなので、ほぼ全ての利用者が何らかのGoogleアカウントを認証させて使っています。そうしないとPlay Storeからアプリをインストール出来ないからです。アプリ開発者から見た時のAndroidのメリットのひとつに、認証済みのGoogleアカウントが既にデバイスにあることから、アプリが認証行為や認証情報の保持をする必要がないため、Googleアカウントを使ったアプリが作りやすいという点があると思います。また、アプリ内だけでなく、Google Drive、Google BigQuery、Google AppEngineといったGoogleサービスをバックエンドに使う際も、利用者に煩雑さを感じさせずに済むことが多いと思います。

Googleサービスの利用

 Googleアカウントと紐づいたGoogleの各種サービスをプログラムから利用する際、以前はClientLoginやAuthSubという仕組みを使っていましたが、今年(2012年)の春にdeprecatedになっています。

参考)

現在はOAuth2.0が推奨されています。

OAuth、OAuth2.0

 OAuthとは、WEBに公開しているデータやAPIに対するアクセスの認可を目的として標準化された通信仕様( これとか、 これ)です。今回のコンテキストで述べると、他のプログラムから利用者のGoogleアカウントに紐づいているサービスやデータに対するアクセスを許す仕組みと言っていいと思います。OAuthはtwitterやFacebookなどのSNSサービスで使われているので、御馴染みの仕組みです。アカウントへのアクセスを許すか許さないか、といった2択の判断ではなく、タイムラインの取得は出来るが、投稿は許さない。タイムラインへの投稿は出来るがダイレクトメッセージにはアクセスできない。といった細かい権限単位で利用者が認可できます。

 OAuth2.0は、OAuth1.0で必須だったリクエストのトークンや署名のやり取りを簡潔にして、JavaScript等からも利用しやすく改善されたものですが、目的や構造はOAuth1.0と大きく変わってはいません。

Google Plugin for Eclipse

 Google Plugin for Eclipseは、Googleの各サービスのAPIや、開発環境を手軽にダウンロード、セットアップできるEclipse Pluginです。最近はADT(Android Development Tools) も含まれているので、Androidを使った開発や、Androidと他のGoogleとを組み合わせた開発では、Google Plugin for Eclipseを使うと環境構築が少し楽になると思います。

Eclipseのプロジェクトを右クリックして、Googleを選ぶと、様々な開発支援用メニューが出てきます。Google Codeにホスティングしているプロジェクトからチェックアウトしたりできるところが面白いです。(最近はあまり使っていませんが...)

  ここでAdd Google APIsを選ぶと、Googleサービスに関係するAPIを検索してインストールすることが出来ます。

 

 Javaで煩雑になりがちな依存関係のあるJARも含めてダウンロードし、ビルドパスに追加してくれます。

 

Google Play Services API

 

  Google Play Services APIは、AndroidアプリとGoogleの各種サービスとの連携をさらに容易に行えるように拡張されたコンポーネントで、Google Playの仕組みのひとつとして提供されます。各アプリからは、ライブラリを通してGoogle Play ServicesのAPKへアクセスする点が特徴的です。

https://developer.android.com/intl/ja/google/play-services/index.html から転載

 Google Play Servicesは、まだ出たばかりということもあるのか配布形態がしょっちゅう変わっているのですが、現時点ではAndroid SDK Managerで、extras/Google Play services をインストールすると、

 の下に、ライブラリプロジェクトやサンプルプロジェクトがダウンロードされます。このライブラリプロジェクトをEclipseにインポートし、アプリのプロジェクトから参照する形で利用します。

 Google Play ServicesのJARのcom.google.android.gmsパッケージの中には、認証情報の取得や認可行為で必要な処理を行う便利クラスがいくつか含まれています。以下はAuthトークンを得るコードの例です。アプリからはIDとスコープとを指定し、トークンを得ようとします。スコープとは認可によってアクセス可能な範囲を制限するものです。トークンが得られない場合は、UserRecoverableAuthExceptionが発生しますので、認可を行う画面へ遷移する処理を書きます。基本的にはこれだけです。

  String authToken = null;

  try {

          authToken = GoogleAuthUtil.getToken(mActivity, "t.egawa@gmail.com",  

                                         "oauth2:https://www.googleapis.com/auth/userinfo.profile");

  } catch (GooglePlayServicesAvailabilityException playException) {

      // Google Play Servicesが使えないデバイスの場合

         

  } catch (UserRecoverableAuthException userRecoverableException) {

      // トークンが得られなかった場合

      // 認可画面へ遷移する

      mActivity.startActivityForResult(userRecoverableException.getIntent(), 1);

  } catch (GoogleAuthException fatalException) {

      // その他の例外

  }

・・・

 認可画面とは以下のようなもので、利用者に対して、そのアプリが利用しようとしているスコープの情報が表示されます。利用者がこの画面で許可すると、アプリは許可された権限でのアクセスができるようになります。

 

 詳しくは、Google Play Servicesのサンプル(Android SDKのインストールディレクトリ extras/google/google_play_services/samples)を御覧下さい。

Google Could Endpoints

 最後に、Google Cloud EndpointsというAppEngineの新機能をご紹介します。Google Cloud EndpointsとはAppEngineをバックエンドとして使うクライアントアプリケーションの開発をより簡単にすることを目的として開発されているもので、

といった機能があります。

 Google Cloud Endpointsは現時点ではまだ正式公開されていないようで、自分の開発するアプリで利用する為にはtrusted testerとしてAppEngineのapp IDを申請する必要があります。以下のURLから申請すれば、数日からだいたい1週間程度でtrusted testerとして登録してくれ、Google Groupsや開発ドキュメントへアクセス権を得ることができますので、御興味がある方は申請してみて下さい。Google Cloud Endpointsの機能を試すだけであれば申請しなくとも試すことは可能です。

 

 Google Cloud Endpointsでは、(Javaの場合)APIとして公開したいクラスやメソッドに対してアノテーションを宣言します。以下は、Google Cloud Endpointsのコードラボ の題材になっているtictactoe(○xゲーム)での例です。

@Api(name = "tictactoe")

public class BoardEndpoint {

  @ApiMethod(name = "board.getmove", httpMethod = "POST")

  public Board getmove(Board board) {

    ・・・

  }

・・・

 また、アノテーションにクライアントIDやオーディエンスを追加することで、OAuthでの認証認可が必要なAPIを作成することもできます。

@Api(

    name = "tictactoe",

    clientIds = {"xxxxx.apps.googleusercontent.com", "AndroidのClient ID"},

    audiences = {"あなたのappid.appspot.com"}

)

 Google Cloud Endpointsで作成したAPIは、サービス開発者が提供するGoogle APIのひとつに自動的に組み込まれるので、自分が公開しているAPIをGoogle APIs Explorerで確認したり、WEBブラウザから操作したりできます。

 嬉しいことに、endpoints.sh というシェルスクリプトで実行することで、サーバー側で定義したAPIに対応する各種プラットフォーム用のクライアントライブラリを自動生成してくれるので、iOS用、Android用、WEBアプリ用といったクライアントAPIを自前でそれぞれ用意する必要がなくなります。

 ※Eclipseから(Google Plugin for Eclipseから)もできるようですが、なぜか私の環境ではうまく動きませんでした。(他にもこまごまとできなかったことがいくつか...)

 Google Cloud Endpointsもまだ出来立てということもありしょっちゅう変わっていますが、使い方やAndroidとの連携について詳しく知りたい方は、以下のサンプルなどを見てみると参考になるかもしれません。(古いJAR使ってたりするやつもあって動かすの結構大変かもしれませんが...やってて途中で泣きそうになったのは内緒です。 )

 また、Google Cloud Endpointsは、明日(12/25)に @vvakame さんが詳しく説明してくれるそうなので、そちらを読むといいと思います。

[EOF]