【Androidアプリ開発】AndroidでのOAuth認証が簡単に実装できるOAuthHelperを作ってみた
もうほぼタイトル通りなのですが、AndroidでのOAuth認証と、OAuth認証で取得したAuthTokenの使い方を理解するのにとても苦労したので、OAuth認証が簡単に実装できるOAuthHelperというクラスを作ってみました。ソースコードは以下のGitHubに公開しています。
以上で完了です。このように、簡単に実装することができます。
syarihu/OAuthHelperSample
https://github.com/syarihu/OAuthHelperSample
OAuthHelperとは
このOAuthHelperは、自分が使いたいGoogle APIのScopeをインスタンス生成時の引数に渡して認証処理を開始するメソッドを実行することで、後は自動でアカウントの選択、認証許可確認、AuthTokenの取得までを行います。なので、これを使えばAuthTokenが返ってきた後のGoogle APIの処理を書くだけで良くなるので、認証部分を書く手間が省けます。
使い方
これを使うためには、少しだけ準備をする必要があります。
以下にその準備から実装までの手順を記載します。
- Google API Consoleで今回利用したいGoogle APIを有効にする
当たり前の話なのですが、Google APIを利用するためにはそのAPIを有効にする必要があります。なので、以下のURLからプロジェクトを作成し、利用したいAPIを有効にします。
https://console.developers.google.com/ - Google API ConsoleでOAuthのクライアントIDを作成する
AndroidアプリでのOAuth認証では、クライアントキーなどは必要ありませんが、あらかじめGoogle APIを利用するアプリのパッケージ名と署名証明書フィンガープリントを登録しておく必要があります。
これらの登録は、Google API Consoleでプロジェクトを選択し、左側にある「APIと認証」の「認証情報」をクリックし、「新しいクライアントIDを作成」ボタンを押すことで、登録することができます。
クライアントIDの作成画面はこんな感じです。
- AndroidManifestに必要なパーミッションを追加する
ようやく実際のソースコードの話になります。OAuth認証を利用するには、以下の2つのパーミッションが必要になります。
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
Google APIを利用する際に必要になると思うので、これも入れておきます。<uses-permission android:name="android.permission.INTERNET" />
- OAuthHelper#OnAuthListenerを実装する
AndroidアプリでOAuth認証を実装したいActivityにOAuthHelper#OnAuthListenerを実装して、getAuthTokenをオーバーライドします。
getAuthTokenの引数にあるauthTokenには取得されたAuthTokenが入ります。なので、ここにAuthTokenを使ったGoogle APIの処理を書きます。
AuthTokenは通常のGoogle APIを利用する際のAPI Keyとは違い、APIの利用時に以下のようにパラメータを渡すことで、APIを利用できます(※参考記事1を参照)。key: access_token
value: 取得したAuthToken - OAuthHelperのインスタンスを作成する
これが実装できたら、OAuthHelperのインスタンスを作成します。OAuthHelperでは第一引数にActivity、第二引数にScopes、第三引数にOnAuthListenerが必要となります。Google Url Shortenerの利用を例として、具体的には以下のように書きます。
mHelper = new OAuthHelper(this, "oauth2:" + UrlshortenerScopes.URLSHORTENER, this);
- OAuthHelper#onActivityResultを実装する
アカウント選択画面や認証許可画面からActivityに戻ってきた際の処理を受け取るため、ActivityのonActivityResult内にOAuthHelper#onActivityResultを実装します。具体的には以下のように書きます。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // アカウント選択や認証画面から返ってきた時の処理をOAuthHelperで受け取る mHelper.onActivityResult(requestCode, resultCode, data); }
- OAuth認証を開始する 最後に、OAuth認証の開始メソッドを実行します。OAuth認証の開始は以下のメソッドで行うことができます。このメソッドの引数については、後述します。
mHelper.startAuth(false);
以上で完了です。このように、簡単に実装することができます。
これを実装したものを実際に実行すると、こんな感じで認証を開始してくれます。
注意点
AccountManagerがキャッシュしているAuthTokenが無効になって使えなくなってしまった場合や、ユーザーがアクセス許可を解除してしまった場合、AuthTokenの再取得をしてあげなければなりません。
そのために用意したのが、先ほどのstartAuthの引数です。この引数は、AuthTokenを再取得するかどうかの値です。なので、通常はfalseで良いのですが、Authenticationエラーが返ってきた際にはこの引数をtrueにしてあげることで、AuthTokenの再取得や再度認証許可画面を表示することができます。
最初にも書きましたが、このOAuthHelperのサンプルプロジェクトは以下のGitHubに公開していますので、良かったら参考にしてみてください。
そのために用意したのが、先ほどのstartAuthの引数です。この引数は、AuthTokenを再取得するかどうかの値です。なので、通常はfalseで良いのですが、Authenticationエラーが返ってきた際にはこの引数をtrueにしてあげることで、AuthTokenの再取得や再度認証許可画面を表示することができます。
まとめ
このAuth認証の方法を見つけるのにかなり時間がかかってしまいましたが、なんとか便利に使えるクラスの実装を行うことができたので良かったです。最初にも書きましたが、このOAuthHelperのサンプルプロジェクトは以下のGitHubに公開していますので、良かったら参考にしてみてください。
syarihu/OAuthHelperSample
https://github.com/syarihu/OAuthHelperSample
また、何か修正する箇所があれば遠慮無く指摘してくれると助かります!
それでは、お疲れさまでした!参考記事
- Using OAuth 2.0 for Installed Applications - Google Identity Platform — Google Developers
https://developers.google.com/identity/protocols/OAuth2InstalledApp#callinganapi - Getting Started - URL Shortener API — Google Developers
https://developers.google.com/url-shortener/v1/getting_started#AboutAuthorization - AndroidでOAuth認証をしたい - Qiita
http://qiita.com/kurukurupapa@github/items/fee066909294e177026a
コメント
コメントを投稿