6 フォロワー

認証

Webアプリケーションとは異なり、RESTful APIは通常ステートレスです。つまり、セッションやクッキーを使用すべきではありません。したがって、ユーザーの認証状態はセッションやクッキーによって維持されないため、各リクエストには何らかの認証資格情報を含める必要があります。一般的な方法は、各リクエストに秘密のアクセストークンを送信してユーザーを認証することです。アクセストークンはユーザーを一意に識別して認証するために使用できるため、**中間者攻撃(MitM攻撃)を防ぐために、APIリクエストは常にHTTPS経由で送信する必要があります。**

アクセストークンを送信する方法はいくつかあります。

  • HTTPベーシック認証:アクセストークンはユーザー名として送信されます。これは、アクセストークンをAPIコンシューマー側で安全に保存できる場合にのみ使用してください。たとえば、APIコンシューマーがサーバー上で実行されているプログラムの場合などです。
  • クエリパラメータ:アクセストークンはAPI URLのクエリパラメータとして送信されます(例:https://example.com/users?access-token=xxxxxxxx)。ほとんどのWebサーバーはクエリパラメータをサーバーログに保持するため、このアプローチは、アクセストークンの送信にHTTPヘッダーを使用できないJSONPリクエストを提供する場合に主に使用してください。
  • OAuth 2:アクセストークンは、コンシューマーによって承認サーバーから取得され、OAuth2プロトコルに従ってHTTPベアラートークンを介してAPIサーバーに送信されます。

Yiiは上記のすべての認証方法をサポートしています。新しい認証方法を簡単に作成することもできます。

APIの認証を有効にするには、次の手順に従ってください。

  1. user アプリケーションコンポーネント を設定します。
    • enableSessionプロパティをfalseに設定します。
    • loginUrlプロパティをnullに設定して、ログインページにリダイレクトする代わりにHTTP 403エラーを表示します。
  2. RESTコントローラークラスでauthenticatorビヘイビアを設定することにより、使用する認証方法を指定します。
  3. yii\web\IdentityInterface::findIdentityByAccessToken()ユーザーアイデンティティクラスに実装します。

ステップ1は必須ではありませんが、ステートレスであるべきRESTful APIには推奨されます。enableSessionfalseの場合、ユーザー認証ステータスはセッションを使用してリクエスト間で永続化されません。代わりに、ステップ2と3で実現されるように、すべてのリクエストに対して認証が行われます。

ヒント: アプリケーションとしてRESTful APIを開発する場合は、アプリケーション設定でuserアプリケーションコンポーネントのenableSessionを構成できます。モジュールとしてRESTful APIを開発する場合は、次の行をモジュールのinit()メソッドに配置できます。

public function init()
{
    parent::init();
    \Yii::$app->user->enableSession = false;
}

例えば、HTTP Basic認証を使用するには、authenticatorビヘイビアを次のように構成できます。

use yii\filters\auth\HttpBasicAuth;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::class,
    ];
    return $behaviors;
}

上記で説明した3つの認証方法すべてをサポートしたい場合は、次のようにCompositeAuthを使用できます。

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::class,
        'authMethods' => [
            HttpBasicAuth::class,
            HttpBearerAuth::class,
            QueryParamAuth::class,
        ],
    ];
    return $behaviors;
}

authMethods内の各要素は、認証メソッドのクラス名または構成配列である必要があります。

findIdentityByAccessToken()の実装はアプリケーション固有です。例えば、各ユーザーが1つのアクセストークンしか持てない単純なシナリオでは、アクセストークンをユーザーテーブルのaccess_token列に格納できます。このメソッドは、次のようにUserクラスで容易に実装できます。

use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface
{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_token' => $token]);
    }
}

上記のように認証が有効になると、すべてのAPIリクエストに対して、リクエストされたコントローラーはbeforeAction()ステップでユーザーの認証を試みます。

認証が成功すると、コントローラーは他のチェック(レート制限、承認など)を実行してからアクションを実行します。認証されたユーザーのアイデンティティ情報は、Yii::$app->user->identityから取得できます。

認証に失敗すると、HTTPステータス401のレスポンスが、他の適切なヘッダー(HTTP Basic認証の場合はWWW-Authenticateヘッダーなど)と共に返されます。

承認

ユーザーが認証された後、リクエストされたリソースに対してリクエストされたアクションを実行する権限があるかどうかを確認する必要があるでしょう。このプロセスは承認と呼ばれ、承認セクションで詳しく説明されています。

yii\rest\ActiveControllerを継承するコントローラーの場合、承認チェックを実行するためにcheckAccess()メソッドをオーバーライドできます。このメソッドは、yii\rest\ActiveControllerによって提供される組み込みアクションによって呼び出されます。

タイプミスを見つけた場合、またはこのページの改善が必要だと考える場合は、
Githubで編集してください !