主にアプリ経由でアクセスする Web サイトを開発しており、ユーザー登録と認証に OAuth2 を使用したいと考えています。これは Android アプリなので、Android で適切な UI を提供する Google の OAuth2 の使用を開始します。
Google は、「アプリケーションのユーザー認証を外部委託する方法として、Google の認証システムを使用することを選択できます。これにより、ユーザー名とパスワードのストアを作成、維持、保護する必要がなくなります。」と述べています。それが私がやりたいことです。ただし、すべての例を調べてみると、ウェブサイトまたはアプリが Google のサービスに対してユーザーを認証することに関するものしか見つかりません。
実際、アプリ (「クライアント」) を Google の OAuth2 に登録しようとすると、Web サイト クライアントと「インストール済み」クライアント (モバイル アプリ) のオプションがありますが、両方はありません。2 つの個別のクライアントを作成することはできますが、OAuth2 ドラフトを読み、問題が発生すると思います。これについて説明します。
これが私がそれがどのように機能するかを想像した方法です:
- ユーザーは MyApp に個人データへのアクセスを要求します。
- アプリは Android の
AccountManager
クラスを使用して、Google の API のアクセス トークンを要求します。 - Android がユーザーに「アプリ 'MyApp' が Google の基本情報へのアクセスを求めています。よろしいですか?」と表示されます。
- ユーザーは「はい」と言います。
AccountManager
電話に保存されている資格情報を使用して Google の OAuth2 サーバーに接続し、アクセス トークンを要求します。- アクセス トークン (緑色の線に続く) が返されます。
AccountManager
アクセス トークンを MyApp に返します。- MyApp は、アクセス トークンを含むユーザーのプライベート データの要求を MySite に送信します。
- MySite は、アクセス トークンを使用してユーザーを確認する必要があります。ここで説明されているように、Google を使用してトークンを検証します - 「Google、このトークンは有効ですか?」。
- さて、私が実現したいのは、Google が「はい、あなたにそれを与えたのは確かにそのユーザーです」と言うことですが、実際には (OAuth2 ドラフトと Google のドキュメントに基づいて) 「いいえそのトークンは MyApp に対してのみ有効で、あなたは MySite です。GTFO!".
では、これをどのように行うべきですか?また、「OpenID を使用する」、「OAuth2 を使用しない」、または同様に役に立たない回答を言わないでください。ああ、私はくだらないポップアップでAccountManager
はなく、素敵な UI を使い続けたいと思っています。WebView
編集
Nikolay からの暫定的な回答 (動作したら報告します!) は、実際には動作するはずであり、Google のサーバーはアクセス トークンがどこから来たのか気にしないというものです。私には少し不安に思えますが、うまくいくかどうか見てみましょう!
アップデート
このパターンを Google ではなく Facebook で実装したところ、完全に機能しました。OAuth2 サーバーは、アクセス トークンがどこから来たかを気にしません。少なくとも Facebook はそうではないので、Google もそうではないと思います。
それを考えると、アクセストークンを保存するのは非常に悪い考えです! しかし、Facebook/Google のサーバーにアクセスしてすべてのリクエストの認証を確認する必要もありません。すべてが遅くなるためです。おそらく最善の方法は、サイトのアクセス トークンが検証されるときに配布する追加の認証 Cookie を追加することですが、より簡単な方法は、アクセス トークンをパスワードのように扱い、そのハッシュを保存することです。アクセス トークンは非常に長いため、ソルトする必要もありません。したがって、上記の手順は次のようになります。
9. MySite は、アクセス トークンを使用してユーザーを確認する必要があります。最初に、ハッシュされた有効なアクセス トークンのキャッシュをチェックします。トークンのハッシュが見つかった場合、ユーザーが認証されていることがわかります。それ以外の場合は、こちらで説明されているように Google で確認します。Googleでは、「Google、このトークンは有効ですか?」
10. Google がアクセス トークンが無効であると判断した場合、ユーザーに GTFO に伝えます。それ以外の場合、Google は「はい、それは有効なユーザーです」と答え、登録済みのユーザー データベースを確認します。その Google ユーザー名 (Facebook を使用している場合は Facebook ID) が見つからない場合は、新しいユーザーを作成できます。次に、アクセス トークンのハッシュ値をキャッシュします。