Restful スタイル API とは何ですか?以前にその概念と基本操作を紹介する大きな記事を書きました。
さて、書きましたが、今日は何を言いますか?
この記事は主に実際のシナリオでの API のデプロイを目的として書かれています。
今日は、当時 API が遭遇した認可検証の問題についてお話します。独占的な作品です。読んで有益であれば、ぜひ「いいね!」をお願いします。
ビジネス分析
まず全体のロジックを理解しましょう
1. ユーザーはクライアントでログインフォームに入力します
2. ユーザーはフォームを送信し、クライアントはログインインターフェイスをリクエストします
3.ユーザーのアカウントとパスワードを検証し、有効なトークンをクライアントに返します
4. クライアントはユーザーのトークンを取得し、それを Cookie などのクライアントに保存します
5。ユーザーの個人情報を取得するためのインターフェースなどの検証
6. サーバーはトークンの有効性を検証します。検証に合格した場合でも、ユーザーはログインする必要があります。もう一度
この記事では、ユーザーのログインとユーザーの個人情報の取得を例として、詳細かつ完全に説明します。
上記がこの記事の焦点です。まだ興奮したり緊張したりしないでください。分析後は、段階的に詳細を説明していきます。
準備
1. API アプリケーションが必要です。
2. クライアントの場合、Postman をインストールしていない場合は、まず自分でダウンロードしてください。テーブルには api_token フィールドが必要です。ない場合は、最初にフィールドを追加し、フィールドが十分な長さであることを確認してください。4. API アプリケーションはルーティングの整形を有効にし、最初に post タイプのログイン操作と get タイプのサインアップテストを設定しました。操作
5. ユーザーコンポーネントのセッションセッションが閉じられます
上記の準備の 4 番目と 5 番目の点について、わかりやすいようにコードを掲載します
'components'=> [ 'user'=> [ 'identityClass'=>'common\models\User', 'enableAutoLogin'=> true, 'enableSession'=> false, ], 'urlManager'=> [ 'enablePrettyUrl'=> true, 'showScriptName'=> false, 'enableStrictParsing'=> true, 'rules'=> [ [ 'class'=>'yii\rest\UrlRule', 'controller'=> ['v1/user'], 'extraPatterns'=> [ 'POST login'=>'login', 'GET signup-test'=>'signup-test', ] ], ] ], // ...... ],
signup-test 操作 テストユーザーを後で追加します。ログイン操作。他の種類の操作は後で追加する必要があります。
認証クラスの選択
apimodulesv1controllersUserController で設定したモデル クラスは commonmodelsUser クラスを指します。重要な点を説明するため、ここでは個別に書き直しません。必要に応じて、User クラスを個別にコピーします。アピモデルへ ダウン。
ユーザーの権限を確認するために、例として yiifiltersauthQueryParamAuth を取り上げます
useyii\filters\auth\QueryParamAuth; publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className() ] ] ); }
この場合、ユーザーにアクセスするすべての操作に認証が必要ということになりませんか?これは機能しません。クライアントが最初にログイン操作にアクセスするとき、トークンはどこから取得されるのでしょうか? YiifiltersauthQueryParamAuth は、検証を必要としないアクションをフィルタリングするための外部属性を提供します。 UserControllerの動作メソッドを少し変更します
publicfunctionbehaviors() { returnArrayHelper::merge (parent::behaviors(), [ 'authenticator'=> [ 'class'=> QueryParamAuth::className(), 'optional'=> [ 'login', 'signup-test' ], ] ] ); }
这样login操作就无需权限验证即可访问了。
添加测试用户
为了避免让客户端登录失败,我们先写一个简单的方法,往user表里面插入两条数据,便于接下来的校验。
UserController增加signupTest操作,注意此方法不属于讲解范围之内,我们仅用于方便测试。
usecommon\models\User; /** * 添加测试用户 */ publicfunctionactionSignupTest () { $user=newUser(); $user->generateAuthKey(); $user->setPassword('123456'); $user->username ='111'; $user->email ='111@111.com'; $user->save(false); return[ 'code'=> 0 ]; }
如上,我们添加了一个username是111,密码是123456的用户
登录操作
假设用户在客户端输入用户名和密码进行登录,服务端login操作其实很简单,大部分的业务逻辑处理都在api\models\loginForm上,来先看看login的实现
useapi\models\LoginForm; /** * 登录 */ publicfunctionactionLogin () { $model=newLoginForm; $model->setAttributes(Yii::$app->request->post()); if($user=$model->login()) { if($userinstanceofIdentityInterface) { return$user->api_token; }else{ return$user->errors; } }else{ return$model->errors; } }
登录成功后这里给客户端返回了用户的token,再来看看登录的具体逻辑的实现
新建api\models\LoginForm.PHP
<?php namespaceapi\models; useYii; useyii\base\Model; usecommon\models\User; /** * Login form */ classLoginFormextendsModel { public$username; public$password; private$_user; constGET_API_TOKEN ='generate_api_token'; publicfunctioninit () { parent::init(); $this->on(self::GET_API_TOKEN, [$this,'onGenerateApiToken']); } /** * @inheritdoc * 对客户端表单数据进行验证的rule */ publicfunctionrules() { return[ [['username','password'],'required'], ['password','validatePassword'], ];
相关推荐:
以上がyii2リセットフルの認可検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。