1

を使用して、会社の REST API 用に OAuth 2.0 プロバイダーを実装していますspring security oauth
何らかの理由で、トークン エンドポイントを使用するとspring security oauth、クライアントは目的のスコープを要求パラメーターとして送信する必要があります (これはClientCredentialsChecker.validateScopeメソッドで発生します)。Access Token Scope
に関する仕様セクションを理解しているので、scope パラメータはオプションですが、スコープが存在しない場合、プロバイダーは承認リクエストが失敗したと判断できます。 私の質問は次のとおりです。

  • プロバイダーがスコープを義務付けることを許可するという仕様を正しく理解していますか?
  • spring security oauthこれを構成することを許可せずに、仕様のより厳密な解釈を実装することを選択した理由を誰かが知っていますか?

ありがとう

4

1 に答える 1

1

ここでの質問は、スコープ バインディングの概念に帰着すると思います。scope パラメーターはオプションであると仕様に記載されていることは正しいですが、OAuth 2 を実装するサービスでスコープを定義する必要があるかどうかは、実際には実装者 (この場合は Spring) 次第です。

次に、スコープ バインディングの概念について説明します。スコープ、またはユーザーからアクセスできるようにする情報を実装する場合、バインドされたスコープとバインドされていないスコープの 2 つの基本的なタイプがあります。バインドされたスコープを使用する場合、アプリケーションを作成して OAuth キーとシークレットを取得するときに、スコープを定義する必要があります。バインドされていないスコープ (Spring など) を実装する場合、最初のリダイレクト呼び出し中にスコープを定義して、ユーザー認証を取得する必要があります。多くの場合、スコープが定義されていない場合、バインドされていないスコープを実装するサービスは、アクセスできるユーザーの詳細の既定のセットを使用します。Spring の場合、スコープが必要なようです。

免責事項: 私は以前に Spring セキュリティ OAuth 実装を使用したことがありません。

バインドされたものとバインドされていないものの違いを視覚的に示すために、いくつかの例を次に示します。

Facebook はバインドされていないスコープを使用してユーザー データをリクエストするため、最初のリダイレクト リクエストは次のようになります。

//construct Facebook auth URI
$auth_url = sprintf("%s?redirect_uri=%s&client_id=%s&scope=email,publish_stream", 
            $authorization_endpoint, 
            $callback_url, 
            $key);

Gowalla の場合 (Gowalla がまだ利用可能だった頃)、彼らは OAuth キーにバインドされたスコープを使用していたので、その最初のリクエストを行ったときにスコープを定義する必要はなく、より類似したリクエストを提供しました。これ(スコープパラメータが欠落していることに注意してください):

//construct Gowalla auth URI
$auth_url = sprintf("%s?redirect_uri=%s&client_id=%s", 
            $authorization_endpoint, 
            $callback_url, 
            $key);

それが役立つことを願っています、

ジョン

于 2012-04-23T16:10:15.917 に答える