Yii2.0 搭建 API 授权认证

App  里面一些api请求会需要授权认证后才能访问。过程如下:

1.用户请求登录API(login,这个接口不需要授权),login API校验用户的帐号密码,如果正确并返回一个有效的token给客户端,客户端拿到用户的token,进行保存。
2.对需要授权的API访问的时候,客户端会把这个token(一般是放在header的Authorization字段中)一起发送给这个API。
3.需要授权的API会先校验token的有效性,校验通过,返回客户端需要的信息,校验失败,需要用户重新登录.

我们 Yii2.0 搭建 RESTful API  基础上还要做一些准备工作,也顺便解决一些上篇教程最后留下的问题。

  1. 首先我们要对Yii-advanced的默认用户表user添加一个字段access_token  

    在项目根目录下 终端运行

     php yii migrate/create add_access_token_column_to_user_table

    在console文件夹下面migrations的文件夹下面多一个数据迁移文件然后编辑如下

     <?php
    
    use yii\db\Migration;
    
    /**
     * Handles adding columns to table `{{%user}}`.
     */
    class m211119_081455_add_access_token_column_to_user_table extends Migration   //add前的日期版本是自动生成的
    {
        public function up()
        {
            $this->addColumn('{{%user}}', 'access_token', $this->string()->defaultValue(null));
        }
    
        public function down()
        {
            $this->dropColumn('{{%user}}', 'access_token');
        }
    }

    在项目根目录下 终端运行

     php yii migrate/up

    至此呢,我们添加了access_token字段

  2. 我把ApI接收的数据格式改为raw 的json格式

    编辑api下的config下main.php

    ...
    'request' => [
        
         'parsers' => [
            'application/json' => 'yii\web\JsonParser',
        ],
    ],
    ...
  3. 关闭user组件的session会话

    编辑api下的config下main.php

    'user' => [
        'identityClass' => 'common\models\User',
        'enableSession' => false,
        'enableAutoLogin' => true,
        'loginUrl' => null,
    ],

4.规划一下这次演示的API 顺便把 UrlManager设置了

GET /v1/users/signup-test (测试注册一个用户,给下面两个接口用)
POST /v1/users/login 登录接口  (免授权认证)
GET /v1/users/profile 登录用户信息接口 (授权认证)

编辑api下的config下main.php

'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing' => true,
        'rules' => [
            [
                'class' => 'yii\rest\UrlRule',
                'controller' => ['v1/user'],
                'extraPatterns' => [
                    'POST login' => 'login',
                    'GET signup-test' => 'signup-test',
                    'GET profile' => 'profile',
                ]
            ],
        ]
    ],

这里做一个小优化,如果rules规则都写在main.php 就会比较臃肿,这里我们专门把路由规则独立一个文件为url-rules.php

<?php
/**
 * url-rules.php
 * 在这里配置所有的路由规则
 */
$urlRuleConfigs = [
        [
        'controller' => ['v1/user'],
        'extraPatterns' => [
            'POST login' => 'login',
            'GET signup-test' => 'signup-test',
            'GET profile' => 'profile'
        ],
        //....这里可以添加更多的路由规则

    ],
];
/**
 * 基本的url规则配置
 */
function baseUrlRules($unit)
{
    $config = [
        'class' => 'yii\rest\UrlRule',
    ];
    return array_merge($config, $unit);
}
return array_map('baseUrlRules', $urlRuleConfigs);

字main.php中引用

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => true,
    'rules' => require(__DIR__ . '/url-rules.php'),
],

6. 在通过api路径和url规则,我们需要在 api目录下的modules/v1/controllers/ 下建一个userController.php 可以用gii建,建立modules/v1/models/LoginForm.php 登录接口用(可以把commom/models/ 文件夹下的LoginForm拿过来修改),本来呢common/modles/user.php 也需要移到modules/v1/models/,但是这里只是演示就共用一下不移了。

准备工作做好了,我们就来看一下接口怎么写

继续阅读

更多内容请付费阅读

评论区
登陆 后评论!