OAuth 2.0を使用して、モバイルアプリ用のWeb APIに委任型認可を実装しようとしています。仕様によると、暗黙の許可フローはリフレッシュトークンをサポートしていません。つまり、アクセストークンを特定の期間だけ許可すると、トークンの有効期限が切れたり取り消されたりすると、ユーザーはアプリに再び許可を与えなければなりません。
これは仕様にあるように、ブラウザ上で動作するいくつかのjavascriptコードに適したシナリオなのでしょう。私は、ユーザーがトークンを取得するためにアプリに許可を与える回数を最小限にしようとしているので、リフレッシュトークンをサポートしている Authorization Code フローは良い選択肢のように見えます。
しかし、このフローはリダイレクションの実行にウェブブラウザに大きく依存しているようです。埋め込み型ウェブブラウザを使用する場合、このフローはモバイルアプリにとってまだ良い選択肢なのかどうか、疑問に思っています。それとも、暗黙のフローを使用するべきでしょうか?
残念ながら、この質問に対する明確な回答はないと思います。しかし、私が確認した選択肢は以下のとおりです。
ユーザーに認証情報を求めても良いのであれば、Resource Owner Password Credentialsを使用します。しかし、次のような理由で、これは不可能かもしれません。
ブラウザベースのフローが必要な場合は、Authorization Code Flowをご利用ください。ここで、redirect_uri
の定義が大きな課題となるが、これには以下の選択肢がある。
redirect_uri
(例: urn:ietf:wg:oauth:2.0:oob
) は、クライアントアプリにリダイレクトする代わりに、認証コードを表示するように認証エンドポイントにシグナルを送ります。ユーザーはこのコードを手動でコピーするか、アプリがHTMLドキュメントのタイトルから取得しようとすることができます。localhost
サーバーを使用します (ポート管理は簡単ではないかもしれません)。myapp://...
) を使用して、参照されたときに登録されたハンドラをトリガーする (詳細はモバイルプラットフォームによって異なります)。ご参考になれば幸いです。
ペドロ
モバイルアプリケーションでwebviewを使用することは、AndroidプラットフォームでOAuth2.0プロトコルを実装するための手頃な方法であるはずです。
なぜなら、WebViewClient
クラスで onPageStarted
関数の実装をオーバーライドし、url
パラメータをチェックした後に http://localhost
からのウェブページの読み込みを停止させることができるからです。
public void onPageStarted(final WebView webView, final String url,
final Bitmap favicon) {}
認証のための最もスムーズなユーザーエクスペリエンス、そして最も簡単な実装は、アプリにウェブビューを埋め込むことです。Webviewが認証ポイントから受け取ったレスポンスを処理し、エラー(ユーザーキャンセル)または承認(およびURLクエリパラメータからのトークン抽出)を検出します。 そして、実際にはすべてのプラットフォームでそれが可能だと思います。私は、ios, android, mac, windows store 8.1 アプリ, windows phone 8.1 アプリで、この動作を成功させました。Dropbox、Google Drive、onedrive、Box、Basecampの各サービスに対応しています。Windows以外のプラットフォームでは、Xamarinを使用しました。Xamarinは、プラットフォーム固有のAPIをすべて公開しているわけではありませんが、これを可能にするのに十分な情報を公開しています。クロスプラットフォームの観点からも、かなりアクセスしやすいソリューションで、認証フォームのUIを気にする必要はありません。