71

https://developers.facebook.com/docs/authentication/で説明されているように、Facebook OAuth2 認証フローで「コード」と「トークン」の両方が必要なのはなぜですか?

OAuth ダイアログ リファレンス ( https://developers.facebook.com/docs/reference/dialogs/oauth/ ) を見ると、ユーザーに関する情報を取得するためにのみトークンを使用しているように見えます。またはresponse_typeとしてパラメーターを指定すると、最初にトークンを取得します。tokencode,token

トークンを直接取得するのではなく、「コード」を取得してから、そのコードを使用して「トークン」を取得する必要があるのはなぜですか?

OAuthの仕組みについて基本的なことを誤解していると思いhttps://graph.facebook.com/oauth/access_tokenますが、ダイアログで初めてトークンを取得すると、リクエストを完全に回避しているようです。

4

11 に答える 11

30

Salesforce ドキュメントから厚かましく拝借:

認証コード

認可コードは、認可サーバーによって作成され、ブラウザ経由でクライアント アプリケーションに渡される、ユーザーのアクセス許可を表す有効期間の短いトークンです。クライアント アプリケーションは、承認コードを承認サーバーに送信して、アクセス トークンと、必要に応じて更新トークンを取得します。

アクセス トークン アクセス トークンは、エンド ユーザーに代わって認証された要求を行うためにクライアントによって使用されます。認証コードよりも有効期間が長く、通常は数分または数時間です。アクセス トークンの有効期限が切れると、それを使用しようとすると失敗し、更新トークンを介して新しいアクセス トークンを取得する必要があります。

于 2012-06-01T19:45:34.437 に答える
23

OAuth 2.0 仕様から:

認可コードは、クライアントを認証する機能や、アクセス トークンをリソース オーナーのユーザー エージェントを介さずにクライアントに直接送信する機能など、いくつかの重要なセキュリティ上の利点を提供します。 .

つまり、基本的に - 主な理由は、アクセス トークンを取得するアクターの数を制限することです。

「トークン」応答は、主にブラウザーに存在するクライアント (例: JavaScript クライアント) を対象としています。

于 2011-12-29T18:12:19.747 に答える
9

クライアントアプリではなく、ユーザーが自分自身に代わって認証サーバー(つまり、facebook)に対して認証するため、混乱が生じました。クライアント アプリ (https を使用) を保護してから、ユーザー エージェント (ブラウザー) を保護するのは非常に簡単です。

IETF-oauth ( https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-threatmodel-08#section-3.4 ) からの元の定式化は次のとおりです。

3.4. 認証コード

認証コードは、成功したエンドユーザーの認証プロセスの中間結果を表し、クライアントがアクセスと更新トークンを取得するために使用します。認証コードは、2 つの目的で、トークンの代わりにクライアントのリダイレクト URI に送信されます。

  1. ブラウザーベースのフローは、URI クエリ パラメーター (HTTP リファラー)、ブラウザー キャッシュ、またはログ ファイル エントリを介して潜在的な攻撃者にプロトコル パラメーターを公開し、リプレイされる可能性があります。この脅威を軽減するために、トークンの代わりに有効期間の短い認証コードが渡され、クライアントと認証サーバー間のより安全な直接接続を介してトークンと交換されます。

  2. 間接的な認可リクエストのコンテキストよりも、クライアントと認可サーバー間の直接的なリクエスト中にクライアントを認証する方がはるかに簡単です。後者はデジタル署名を必要とします。

于 2015-12-02T10:23:02.383 に答える
3

基本的に、Lix の answer の拡張として、アクセス コード ルートを使用すると、リソース オーナー (つまり Facebook ユーザー) は、たとえばログオフすることによって、オフライン クライアント (つまり、あなたの申請)。これが重要でない場合は、アクセス コード ルートを使用する必要はありません。

さらに、サーバーに提供されたトークンが実際にリソース所有者 (つまり、Facebook ユーザー) に登録され、ユーザー エージェント (または中間者) に登録されていないことを確認するために、アクセス コードが提供されます。

これは、暗黙的付与フローと認可コード付与フローのどちらを選択するかという問題に似ているようです。実はここが逆の視点のように見える!? .

また、ドリューが述べたように、

アクセス トークンの有効期限が切れると、それを使用しようとすると失敗し、更新トークンを介して新しいアクセス トークンを取得する必要があります。

もう 1 つの部分は更新トークンですが、FB ドキュメントで十分に説明されているとは思いません。私が正しければ、暗黙の許可 (直接トークン) は本当に短命であるはずですが、それは施行される予定であり、FB.js はその多くを隠しているようです (これは私が深く調べていないものです)。 .

私が正しければ、これcode%20tokenは、ユーザー エージェントがトークンを持つことと、サーバーが単一の要求でトークン交換プロセスを開始できることの両方を可能にする最適化です (ネットワーク IO を介したものは、特にユーザー エージェントにとって高価であると見なされるため)。 .

于 2014-07-09T13:41:29.507 に答える
2

OAuth 2.0 with facebook では、全体的なコンセプトは次のように単純です。

Step 1. GETリクエストで「Authorization Code」を取得する

request URI: https://www.facebook.com/dialog/oauth
Params:
    response_type=code
    client_id={add your "App id" got by registering app}
    redirect_uri={add redirect uri defined at the registration of app}
    scope={add the scope needed in your app}
Headers: None

ステップ 2. POST リクエストとして認証コードを送信して「アクセス トークン」を取得する

    URI: https://graph.facebook.com/oauth/access_token
    Params:
        grant_type=authorization_code
        client_id=<add your "App id" got by registering app>
        redirect_uri=<add redirect uri defined at the registration of app>
        code=<obtained authorization code from previous step>
    Headers:
        Authorization:Basic encode <App Id:App Secret> with base64 
        Content-Type:application/json

ステップ 3. 上記のステップで取得したアクセス トークンを使用して、ユーザー リソースを取得します。

于 2019-09-25T14:42:23.123 に答える
-1

ユーザーがログインしたときにトークンを受け取ります。ただし、他のアクションを実行しているときにトークンを変更したい場合があります。アプリ/ページとしてのEG投稿、または。を使用したユーザーとしての投稿offline_access

于 2011-12-29T10:07:24.903 に答える