Webアプリケーションとは異なり、RESTful APIは通常ステートレスです。つまり、セッションやクッキーを使用すべきではありません。したがって、ユーザーの認証状態はセッションやクッキーによって維持されないため、各リクエストには何らかの認証資格情報を含める必要があります。一般的な方法は、各リクエストに秘密のアクセストークンを送信してユーザーを認証することです。アクセストークンはユーザーを一意に識別して認証するために使用できるため、**中間者攻撃(MitM攻撃)を防ぐために、APIリクエストは常にHTTPS経由で送信する必要があります。**
アクセストークンを送信する方法はいくつかあります。
https://example.com/users?access-token=xxxxxxxx
)。ほとんどのWebサーバーはクエリパラメータをサーバーログに保持するため、このアプローチは、アクセストークンの送信にHTTPヘッダーを使用できないJSONPリクエストを提供する場合に主に使用してください。Yiiは上記のすべての認証方法をサポートしています。新しい認証方法を簡単に作成することもできます。
APIの認証を有効にするには、次の手順に従ってください。
user
アプリケーションコンポーネント を設定します。false
に設定します。null
に設定して、ログインページにリダイレクトする代わりにHTTP 403エラーを表示します。authenticator
ビヘイビアを設定することにより、使用する認証方法を指定します。ステップ1は必須ではありませんが、ステートレスであるべきRESTful APIには推奨されます。enableSessionがfalse
の場合、ユーザー認証ステータスはセッションを使用してリクエスト間で永続化されません。代わりに、ステップ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で編集してください !
コメントするにはサインアップまたはログインしてください。