web-dev-qa-db-ja.com

単純なOAuth +トークンの有効期限が切れたときのJSONapi応答-分離

分離されたAngularプロジェクトのDrupalで、フロントエンド認証に 'Simple OAuth'および 'jsonapi'モジュールを使用しています。

ユーザーの資格情報は正しいがトークンの有効期限が切れている場合、ヘッダーの応答はまだ200 okであり、トークンが無効であることを示すメッセージが表示されることに気付きました。

oathのドキュメント で説明されているように、400/401または403が必要です。

これがこのように実装される理由はありますか?または、応答を変更する方法はありますか?

6
M M

これがこのように実装される理由はありますか?

200 okは、アクセスの理由で1つ、多数、またはすべてのエンティティがコレクションリソースから除外された場合でも、コレクションリソースの予期されるステータスコードです。

https://www.drupal.org/project/jsonapi/issues/2853066 から:

「コレクションリソース」のステータスコードは、そのリソースで表されるエンティティのいずれかまたはすべてとは完全に異なる必要があります。

特定のタイプのエンティティのリストにアクセスするための明示的な前提条件であるアクセス制御メカニズムが存在しない限り、利用者はコレクションにアクセスできる必要があると想定する必要があります。リソース

アクセス上の理由ですべてのエンティティが省略されている場合でも、空のコレクションに対して200応答を返すことは、RESTと完全に一致しています。


または、応答を変更する方法はありますか?

もちろんできます。ルートの変更とカスタムアクセスのタグ付きサービスの提供に関するドキュメントを確認してください。


最後に、質問で提供したリンクはoauth specsであり、jsonapiとは無関係です。Oauth resource in Drupal =(/oauth/token)は、新しいトークンを取得するときにエラーが発生した場合に、4xxを正しく提供します。

1
zaporylie

編集する

私に役立つ方法を見つけました。

<?php

namespace Drupal\modulename\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 * https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones
 */
class ModuleNameRouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {
    //issue is this only works for JUST /rahapi and not anything else
    //if ( $route = $collection->get('jsonapi.resource_list') ) {
    //  $route->setRequirement('_user_is_logged_in', 'TRUE');
    //}

    foreach ($collection->all() as $route) {
      if (strpos($route->getPath(), '/jsonapi') === 0 ) {
        $route->setRequirement('_user_is_logged_in', 'TRUE');
      }
    }
  }
}

それはmodulename/src/Routing/ModuleNameRouteSubscriber.phpに入ります

次に、これはmodulename/modulename.services.ymlに入ります

services:
  route_subscriber:
    class: Drupal\modulename\Routing\ModuleNameRouteSubscriber
    arguments: []
    tags:
      - { name: event_subscriber }

だから私はここに行くことでそれを見つけました: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Routing%21RouteSubscriberBase.php/class/RouteSubscriberBase/8.2.x

だから私はそれを拡張しています...そして私はそれを拡張する他の多くのものがあることを知っています。/adminの場合はこのようにします。そこで、monkey-see-monkey-doを実行して上記のコードを生成しました。私のサンプルコードがうまくいくことを願っています。

https://api.drupal.org/api/drupal/core%21modules%21system%21src%21EventSubscriber%21AdminRouteSubscriber.php/function/AdminRouteSubscriber%3A%3AalterRoutes/8.2.x

Zaporylieに最初の方向を示してくれてありがとう。

0
eahonet

この実装の前に、トークンをデバッグするもう1つのAPIを呼び出すことができます。ヘッダーにトークンを入力するだけで、結果にトークンの有効期限の詳細が表示されます。

api :- http://your_url/oauth/debug?_format=json
0
Rifas Ali