66

主にアプリ経由でアクセスする Web サイトを開発しており、ユーザー登録と認証に OAuth2 を使用したいと考えています。これは Android アプリなので、Android で適切な UI を提供する Google の OAuth2 の使用を開始します。

Google は、「アプリケーションのユーザー認証を外部委託する方法として、Google の認証システムを使用することを選択できます。これにより、ユーザー名とパスワードのストアを作成、維持、保護する必要がなくなります。」と述べています。それが私がやりたいことです。ただし、すべての例を調べてみると、ウェブサイトまたはアプリが Google のサービスに対してユーザーを認証することに関するものしか見つかりません。

実際、アプリ (「クライアント」) を Google の OAuth2 に登録しようとすると、Web サイト クライアントと「インストール済み」クライアント (モバイル アプリ) のオプションがありますが、両方はありません。2 つの個別のクライアントを作成することはできますが、OAuth2 ドラフトを読み、問題が発生すると思います。これについて説明します。

これが私がそれがどのように機能するかを想像した方法です:

OAuth2 フロー図

  1. ユーザーは MyApp に個人データへのアクセスを要求します。
  2. アプリは Android のAccountManagerクラスを使用して、Google の API のアクセス トークンを要求します。
  3. Android がユーザーに「アプリ 'MyApp' が Google の基本情報へのアクセスを求めています。よろしいですか?」と表示されます。
  4. ユーザーは「はい」と言います。
  5. AccountManager電話に保存されている資格情報を使用して Google の OAuth2 サーバーに接続し、アクセス トークンを要求します。
  6. アクセス トークン (緑色の線に続く) が返されます。
  7. AccountManagerアクセス トークンを MyApp に返します。
  8. MyApp は、アクセス トークンを含むユーザーのプライベート データの要求を MySite に送信します。
  9. MySite は、アクセス トークンを使用してユーザーを確認する必要があります。ここで説明されているように、Google を使用してトークンを検証します - 「Google、このトークンは有効ですか?」。
  10. さて、私が実現したいのは、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) が見つからない場合は、新しいユーザーを作成できます。次に、アクセス トークンのハッシュ値をキャッシュします。

4

6 に答える 6

5

同様の StackOverflow の質問に対する回答を投稿しました。

Google はこれをハイブリッド アプリと呼び、 「Android アプリが Web バックエンドのオフライン アクセスを取得する」方法を説明しています。

その要点は、(OAuth2 トークンではなく) 認証コードを返すために、メッセージscope化された文字列を渡す必要があるということです。GoogleAuthUtil.getTokenこの認証コードは、モバイル アプリからサーバーに渡され、OAuth2 トークンとリフレッシュ トークンと交換できます

パラメータは次のscopeようにする必要があります。

oauth2:server:client_id:<your_server_client_it>:api_scope:<scope_url_1> <scope_url_2> ...
于 2013-07-12T02:22:08.140 に答える
2

モバイル アプリケーションによって取得されたアクセス トークンは、他の場所で使用できます。Drive SDK には、https://developers.google.com/drive/quickstart-androidのフローをたどる素晴らしくシンプルなイントロがあります。

于 2013-04-30T17:54:55.503 に答える
1

少なくとも Google では、アクセス トークンは最終的に期限切れになります。これが、AndroidAccountManagerinvalidateAuthTokenメソッドがある理由です。キャッシュされたアクセス トークンの有効期限が切れているAccountManagerため、古いトークンの提供を停止し、代わりに新しいトークンを取得するように に指示する必要があります。これにより、トークンをキャッシュする方がいくらか安全になります。トークン自体は、そのユーザーとして永久にアクセスできるわけではないからです。代わりに、有効な場合、「最近のある時点で、このトークンは信頼できるソースによって取得されました」とだけ表示されます。

トークンを扱う際に役立つことがわかったいくつかのことを次に示します。1 つ目は、Google の tokeninfo エンドポイントです。トークン自体は base64 でエンコードされた JSON です。これは、暗号化されていないことを意味するため、通信に HTTPS を使用していることを確認する必要があります。ただし、トークンを調べて、何が起こっているのかをよりよく理解できることも意味します。

https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=

トークンが「abcdef」の場合は、次の場所に移動します。

https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=abcdef

Google がトークンを解凍します。これは、トークンがまだ有効である秒数を示す「expires_in」フィールドを含む単純な JSON オブジェクトです。下のビデオの 6:03 で、展開されたトークンを確認できます。

https://developers.google.com/events/io/sessions/383266187

このビデオには OAuth2 の完全な概要が含まれており、OAuth とトークンを扱う場合は、全体を見る価値があります。講演者は、アクセス トークンではなく、有効期限のない他の形式の Oauth2 トークンについても説明します。

もう 1 つの便利なリソースは、OAuth Playground です。これにより、リクエスト スコープ、リクエストの構成、トークンの取得などの基本的なことを実行できます。このリンクは散発的に機能するようで、Chrome では Oauth Playground アプリをインストールする必要がありました。

https://developers.google.com/oauthplayground/

また、ビデオのスピーカーである Tim Bray によるチュートリアルでは、アクセス トークンを使用して Android アプリからサーバーと通信する方法を説明しています。これは、Google API コンソール内のさまざまなものがどのように連携するかを理解し始めたので、私にとって役に立ちました。

http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html

あなたの質問に対する実際の回答に関しては、サーバーにアクセス トークンをキャッシュする必要はまったくないと思います。上記の「Android からのバックエンド呼び出しの検証」リンクで説明したように、トークンの検証はほとんどの場合、高速な静的呼び出しです。つまり、トークンをキャッシュする理由はありません。

ライブラリは Google 証明書をキャッシュし、必要な場合にのみ更新できるため、検証は (ほとんどの場合) 高速な静的呼び出しになります。

最後に、実際に を使用しAccountManagerてアクセス トークンを取得できます。GoogleAuthUtilただし、Google は現在、代わりに Play サービス ライブラリのクラスを使用することを推奨しています。

一言で言えば、OAuth2 リクエストの getAuthToken と getToken を使用する場合との違いは何ですか

GoogleAuthUtilここで、上記のリンクからの同じ人物であるティム・ブレイによるコメントに注意してください。彼らはルートに力を入れていると言っています。ただし、これは Google 認証に限定されることを意味することに注意してください。AccountManagerを使用して、たとえば Facebook トークンを代わりに取得できると思いますが、GoogleAuthUtil.

于 2013-09-08T16:27:02.670 に答える
1

おそらく、認証に OAuth トークンを使用する OpenID Connect が必要です。に関してはAccountManager、現在の OAuth サポートは少しハックですが、「まもなく」リリースされる予定の新しいGoogle Play Servicesにより、これが改善されることが期待されます。デモについては、こちらを参照してください。

于 2012-07-25T02:57:06.930 に答える
0

Google 以外の OAuth サーバーで同様のことを行う必要があったとき、トークンを Web サイトの DB に保持しました。その後、アプリは、データを要求する必要があるときに、Web サービスを使用してトークンを要求します。

ユーザーは、Web またはアプリのいずれかで OAuth 登録を行うことができます。同じアプリケーション トークンを共有したため、同じアクセス トークンを共有できました。登録後、必要なアプリから使用できるように、アクセス トークンとリフレッシュ トークンを DB に保存します。

于 2012-07-25T01:00:43.230 に答える