Yii2.0 RESTful API認証チュートリアル【トークン検証】
11601 ワード
最近はRESTful API認証機能をして、プロセス全体を記録して、後で確認しやすいです.本文はhttps://segmentfault.com/a/1190000016368603部分の内容を参照して、この作者の分かち合いに感謝して、以下の内容は私のプロジェクトの実際の状況によって調整しました.
資格認定の概要
Webアプリケーションとは異なり、RESTful APIsは通常無状態である.つまり、sessionsまたはcookiesを使用するべきではないことを意味する.そのため、各要求には、sessionsまたはcookiesによってユーザーの認証状態が維持されていない可能性があるため、秘密のaccess tokenを送信してユーザーを認証することが一般的である.アクセスtokenはユーザを一意に識別し認証することができるため、API要求はHTTPSによってman-in-the-middle(MitM)仲介者の攻撃を防止すべきである.
認証方式 HTTP基本認証:access tokenはユーザ名として送信され、アプリケーションはaccess tokenにおいてAPI使用側のシーンが安全に存在することができ、例えば、API使用側は1台のサーバ上で実行されるプログラムである. 要求パラメータ:access tokenはAPI URL要求パラメータとして送信され、例えばhttps://example.com/users?acc...は、多くのサーバが要求パラメータをログに保存するため、HTTPヘッダを使用してaccess token を送信できないため、主にJSONP要求に使用されるべきである. OAuth 2:ユーザは、認証サーバからOAuth 2プロトコルに基づくaccess tokenを取得し、HTTP Bearer Tokensを介してAPIサーバに送信する.
上で簡単に説明します.内容はYii Framework 2.0権威ガイドから来ています.
実装手順
継続下一篇の内容(ここではデフォルトのUserデータテーブルを一時的に使用しますが、本環境では別のデータテーブルを分離して認証してください)
追加するデータの内容
前編のUserデータテーブルに続いて、accessを追加する必要があります.tokenとexpire_atのフィールド、プロジェクトルートディレクトリオープンコンソールに入るには、次のコマンドを入力します: プロジェクトディレクトリを開く/console/migrations/m 181224_075747_add_column_access_token_user.phpは以下の内容を修正します: プロジェクトディレクトリを開く/console/migrations/m 181224_092333_add_column_expire_at_user.phpは以下の内容を修正します: 移行コマンド を実行する.
コンフィギュレーション
アプリを開くphp userアプリケーションコンポーネントの構成: セッションコンポーネントを注釈するか、 を削除します. apimodelsUserを作成します.phpは認証クラスを実現し、IdentityInterface を継承する.
commonmodelsUserクラスをapimodelsディレクトリにコピーし、名前空間をapimodelsに変更 commomodelsLoginForm.phpクラスをapimodels*ディレクトリにコピーし、ネーミングスペースを変更し、login*メソッドを書き換える: 上のコードはUserモデルにgenerateAccessToken()メソッドを追加したのでapimodelsUser.phpにこのメソッドを追加する 次にapicontrollersに新しいコントローラを追加してUserControllerと命名しyiirestActiveControllerを継承し、ログインLoginメソッドを記述します.具体的なコードは以下の通りです. 最後にURL規則 が追加された.
アプリを開くphp componentsプロパティを変更し、次のコードを追加します.
デバッグツールを使用してテストhttp://youdomain/users/loginを行い、POSTリクエスト送信であることを覚えておき、POSTMANで問題がある場合はContent-Type:アプリケーション/x-www-form-urlencodedを指定します.OK、意外なことがなければ、accessを受け取ることができると信じています.tokenです.次に、このtokenをどのように使用して、どのように認証状態を維持して、このtokenを携帯しないとアクセスできないようにして、401に戻ります.
資格認定ステータスの維持
認証手順の実装: RESTコントローラクラスでauthenticator動作を構成し、どの認証方式を使用するかを指定します. あなたのuser identity classクラスでyiiwebIdentityInterface::findIdentityByAccessToken()の方法を実現します.
具体的な実現方法は以下の通りである.以前のUserコントローラ(apicontrollersUserController.php)を開き、 を追加します. findIdentityByAccessToken()メソッドの実装: apimodelsUserを開きます.php書き換えfindIdentityByAccessToken()メソッド apicontrollersUserControllerを開きます.php,Testメソッドを追加してトークン検証 をテストする apiconfigmainを修正します.php
次にあなたのドメイン名http://youdomain/users/testにアクセスして、パラメータを持たないで401に戻りましたか?OK、ここではURLアクセスとヘッドによる携帯の2つのアクセス方法を紹介します http://youdomain/users/test?a... ヘッダ情報 を伝達する.
Bearerとあなたのtokenの間にスペースがあることに注意してください.多くの学生がこの上で何度も触ったのはYII 2に基づいています.0 RESTful認証の内容.
本文はhttps://segmentfault.com/a/1190000016368603部分の内容を参照して、この作者の分かち合いに感謝して、以上の内容は私のプロジェクトの実際の状況によって調整しました.
資格認定の概要
Webアプリケーションとは異なり、RESTful APIsは通常無状態である.つまり、sessionsまたはcookiesを使用するべきではないことを意味する.そのため、各要求には、sessionsまたはcookiesによってユーザーの認証状態が維持されていない可能性があるため、秘密のaccess tokenを送信してユーザーを認証することが一般的である.アクセスtokenはユーザを一意に識別し認証することができるため、API要求はHTTPSによってman-in-the-middle(MitM)仲介者の攻撃を防止すべきである.
認証方式
上で簡単に説明します.内容はYii Framework 2.0権威ガイドから来ています.
実装手順
継続下一篇の内容(ここではデフォルトのUserデータテーブルを一時的に使用しますが、本環境では別のデータテーブルを分離して認証してください)
追加するデータの内容
前編のUserデータテーブルに続いて、accessを追加する必要があります.tokenとexpire_atのフィールド、
./yii migrate/create add_column_access_token_to_user
./yii migrate/create add_column_expire_at_to_user
public function up()
{
$ret = $this->db->createCommand("SELECT * FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'user' AND column_name = 'access_token'")->queryOne();// user 'access_token'
if (empty($ret)) {
$this->addColumn('user', 'access_token', $this->string(255)->defaultValue(NULL)->comment(' '));
}
}
public function down()
{
$this->dropColumn('user', 'access_token');
return true;
}
public function up()
{
$ret = $this->db->createCommand("SELECT * FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'user' AND column_name = 'expire_at'")->queryOne();
if (empty($ret)) {
$this->addColumn('user', 'expire_at', $this->integer(11)->defaultValue(NULL)->comment(' '));
}
}
public function down()
{
$this->dropColumn('user', 'expire_at');
return true;
}
./yii migrate
コンフィギュレーション
アプリを開くphp
'user' => [
'identityClass' => 'api\models\User',
'enableAutoLogin' => true,
'enableSession'=>false,
//'identityCookie' => ['name' => '_identity-api', 'httpOnly' => true],
],
// 'session' => [
// // this is the name of the session cookie used for login on the backend
// 'name' => 'advanced-api',
// ],
commonmodelsUserクラスをapimodelsディレクトリにコピーし、名前空間をapimodelsに変更
validate()) {
//return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
if ($this->getUser()) {
$access_token = $this->_user->generateAccessToken();
$this->_user->expire_at = time() + static::EXPIRE_TIME;
$this->_user->save();
Yii::$app->user->login($this->_user, static::EXPIRE_TIME);
return $access_token;
}
}
return false;
}
namespace api\models;
use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\web\UnauthorizedHttpException;
...
...
class User extends ActiveRecord implements IdentityInterface
{
...
...
/**
* accessToken
* @return string
* @throws \yii\base\Exception
*/
public function generateAccessToken()
{
$this->access_token=Yii::$app->security->generateRandomString();
return $this->access_token;
}
}
namespace api\controllers;
use api\models\LoginForm;
use yii\rest\ActiveController;
use yii;
class UserController extends ActiveController
{
public $modelClass = 'api\models\User';
public function actions()
{
$action= parent::actions(); // TODO: Change the autogenerated stub
unset($action['index']);
unset($action['create']);
unset($action['update']);
unset($action['delete']);
}
public function actionIndex()
{
//
}
/**
*
* @return array
* @throws \yii\base\Exception
* @throws \yii\base\InvalidConfigException
*/
public function actionLogin()
{
$model = new LoginForm();
if ($model->load(Yii::$app->getRequest()->getBodyParams(), '') && $model->login()) {
return [
'access_token' => $model->login(),
];
} else {
return $model->getFirstErrors();
}
}
}
アプリを開くphp componentsプロパティを変更し、次のコードを追加します.
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule',
'controller' => 'user',
'extraPatterns'=>[
'POST login'=>'login',
],
],
],
]
デバッグツールを使用してテストhttp://youdomain/users/loginを行い、POSTリクエスト送信であることを覚えておき、POSTMANで問題がある場合はContent-Type:アプリケーション/x-www-form-urlencodedを指定します.OK、意外なことがなければ、accessを受け取ることができると信じています.tokenです.次に、このtokenをどのように使用して、どのように認証状態を維持して、このtokenを携帯しないとアクセスできないようにして、401に戻ります.
資格認定ステータスの維持
認証手順の実装:
具体的な実現方法は以下の通りである.
use yii\helpers\ArrayHelper;
use yii\filters\auth\QueryParamAuth;
...//
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'authenticatior' => [
'class' => QueryParamAuth::className(), // access token
'except' => ['login'], // access token , $noAclLogin
]
]);
}
...
...
use yii\web\UnauthorizedHttpException;
...
class User extends ActiveRecord implements IdentityInterface
{
...
...
/**
* {@inheritdoc}
*/
public static function findIdentityByAccessToken($token, $type = null)
{
// throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
$user = static::find()->where(['access_token' => $token, 'status' => self::STATUS_ACTIVE])->one();
if (!$user) {
return false;
}
if ($user->expire_at < time()) {
throw new UnauthorizedHttpException('the access - token expired ', -1);
} else {
return $user;
}
}
...
}
public function actionTest()
{
return ['status'=>'success'];
}
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule',
'controller' => 'user',
//'pluralize' => false, // false
'extraPatterns'=>[
'GET test'=>'test',
'POST login'=>'login',
],
],
],
]
次にあなたのドメイン名http://youdomain/users/testにアクセスして、パラメータを持たないで401に戻りましたか?OK、ここではURLアクセスとヘッドによる携帯の2つのアクセス方法を紹介します
Authorization:Bearer YYdpiZna0hJGhjsfqwxUeHEgLDfHEjB-
Bearerとあなたのtokenの間にスペースがあることに注意してください.多くの学生がこの上で何度も触ったのはYII 2に基づいています.0 RESTful認証の内容.
本文はhttps://segmentfault.com/a/1190000016368603部分の内容を参照して、この作者の分かち合いに感謝して、以上の内容は私のプロジェクトの実際の状況によって調整しました.