mg4377娱乐娱城官网_mg4377娱乐手机版_www.mg4377.com

api授权验证详解,风格搭建

时间:2019-07-06 05:02来源:mg4377娱乐手机版
前言 什么是restful风格的api呢?大家事先有写过大篇的稿子来介绍其定义以及基本操作。 前不久在商讨怎么运用 yii2 搭建 restful api,将 yii2 restful api / yii2rest api 搭建心得写下,款待一同

前言

什么是restful风格的api呢?大家事先有写过大篇的稿子来介绍其定义以及基本操作。

前不久在商讨怎么运用 yii2 搭建 restful api,将 yii2 restful api / yii2 rest api 搭建心得写下,款待一同座谈使用yii2.0.13 advanced 版,将 frontend 整个作为 api 接口项目,除了接口的路由准则能够印证通过外,其余的路由准则都回到央浼错误的格式

证实:restful是一套精美的接口调用标准。

如何是restful风格的api呢?大家事先有写过大篇的篇章来介绍其定义以及基本操作。

既然如此写过了,那明天是要说点什么吗?

1、数据库结构
CREATE TABLE `goods` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `name` varchar NOT NULL, `price` int unsigned NOT NULL, `status` tinyint unsigned NOT NULL, `create_time` int unsigned NOT NULL, `modify_time` int unsigned NOT NULL, PRIMARY KEY  ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

运用正规:

既然写过了,那后天是要说点什么呢?

那篇小说首要针对实际场景中api的铺排来写。

2、使用 gii 创建 goods model

注意事项:

那篇作品主要针对实际场景中api的安插来写。

我们后天就来大大的侃侃那叁个年api际遇的授权验证难点!独家干活,纵然看完全数收益,记得不要遗忘给本身点赞哦。

3、创建 api modules

在 frontend 下新建文件夹 modules使用 gii 在 modules 文件中创制 v1 module(制止今后接口更新替换时向前包容,接口扩展 v1 v2 等版本调整)

1,对应命名空间改成api,

笔者们前日就来大大的侃侃近几来api遭受的授权验证难题!独家干活,假设看完全体收益,记得不要遗忘给自个儿点赞哦。

政工分析

4、将 v1 moduel 写到配置文件中
'modules' => [ 'v1' => [ 'class' => 'frontendmodulesv1Module', ],],

2,api模块要独自分离

业务分析

咱俩先来打听一下总体逻辑

5、修改 frontend 下 main.php 中,user 的安插(以下说的配置文件,都是 frontend 下 main.php)
'user' => [ 'identityClass' => 'frontendmodelsUser', 'enableAutoLogin' => false, 'enableSession' => false, 'loginUrl' => null,],

我们先来打探一下全方位逻辑

1.用户在客户端填写登入表单
2.用户提交表单,客户端央求登陆接口login
3.服务端校验用户的帐号密码,并重回三个有效的token给客户端
4.客户端获得用户的token,将之存款和储蓄在客户端譬如cookie中
5.客户端辅导token访谈要求校验的接口比方获取用户个人音信接口
6.劳务端校验token的实惠,校验通过,反正重返客户端须要的消息,校验战败,须求用户重新登入

6、新建 frontendapi授权验证详解,风格搭建。modelsUser,继承 commonmodelsUser
<?phpnamespace frontendmodels;class User extends commonmodelsUser{}
  • 用户在客户端填写登入表单
  • 用户提交表单,客户端诉求登入接口login
  • 服务端校验用户的帐号密码,并再次回到三个得力的token给客户端
  • 客户端得到用户的token,将之存储在客户端比方cookie中
  • 客户端引导token访谈需求校验的接口比方获取用户个人新闻接口
  • 劳务端校验token的得力,校验通过,反正再次回到客户端供给的新闻,校验失败,要求用户重新登陆

本文大家以用户登入,获取用户的个人音讯为例进行详尽的完整版表明。

7、启用并修改配置文件中的 urlManager

调治 urlManager 的时候要小心,他会将生成好的路由写入缓存,有个别改变或许不会立即生效

'urlManager' => [ //用于表明 urlManager 是否启用 URL 美化功能 //默认不启用。但实际使用中,特别是产品环境,一般都会启用 'enablePrettyUrl' => true, //是否启用严格解析,如启用严格解析,要求当前请求应至少匹配1个路由规则,否则认为是无效路由。 //这个选项仅在 enablePrettyUrl 启用后才有效。 //如果开启,表示只有配置在 rules 里的规则才有效 //由于项目会将一些 url 进行优化,所以这里需要设置为 true 'enableStrictParsing' => true, //指定是否在URL在保留入口脚本 index.php 'showScriptName' => false, 'rules' => [ //当然,如果自带的路由无法满足需求,可以自己增加规则 'GET <module:d >/<controller:w >/search' => '<module>/<controller>/search', [ 'class' => 'yiirestUrlRule', 'controller' => ['v1/goods'], // 由于 resetful 风格规定 URL 保持格式一致并且始终使用复数形式 // 所以如果你的 controller 是单数的名称比如 UserController // 设置 pluralize 为 true 的话,url 地址必须是 users 才可访问 // 如果 pluralize 设置为 false, url 地址必须是 user 也可访问 // 如果你的 controller 本身是复数名称 UsersController ,此参数没用,url 地址必须是 users 'pluralize' => false, ], ],],

正文我们以用户登入,获取用户的个人消息为例举办详细的完整版说明。
以上,就是大家本篇文章要落实的根本。先别激动,也别恐慌,深入分析好了后头,细节部分大家再深厉浅揭走下去。

如上,正是大家本篇小说要兑现的主要性。先别激动,也别紧张,剖判好了后来,细节部分大家再望文生义走下来。

8、去掉配置文件中的 errorHandler 配置(整个 frontend 都以接口,无需 html 的响应格式)

未焚徙薪干活

积谷防饥干活

9、将内容协商配置到指导文件中(因为任何 frontend 都亟需)
'bootstrap' => [ 'log', //全局内容协商 [ //ContentNegotiator 类可以分析request的header然后指派所需的响应格式给客户端,不需要我们人工指定 'class' => 'yiifiltersContentNegotiator', 'formats' => [ 'application/json' => yiiwebResponse::FORMAT_JSON, 'application/xml' => yiiwebResponse::FORMAT_XML, //api 端目前只需要json 和 xml //还可以增加 yiiwebResponse 类内置的响应格式,或者自己增加响应格式 ], ]],
  • 您应当有一个api应用,假设您还平昔不,请先活动这里→_→Restful api基础
  • 对此客户端,大家计划使用postman举办效仿,假若您的google浏览器还未有安装postman,请先活动下载
  • 要测量试验的用户表要求有二个api_token的字段,没有的请先自行加多,并有限援助该字段足够长度
  • api应用开启了路由美化,并先配置post类型的login操作和get类型的signup-test操作
  • 关闭了user组件的session会话

1.你应该有三个api应用.
2.对于客户端,大家希图利用postman进行效仿,假使您的google浏览器还尚无安装postman,请先活动下载
3.要测验的用户表必要有三个api_token的字段,未有的请先自行增加,并保管该字段丰盛长度
4.api应用开启了路由美化,并先配置post类型的login操作和get类型的signup-test操作
5.关闭了user组件的session会话

10、配置文件中,components 配置 response,重回格式
'response' => [ 'class' => 'yiiwebResponse', //设置 api 返回格式,错误码不在 header 里实现,而是放到 body里 'as resBeforeSend' => [ 'class' => 'frontendextensionsResBeforeSendBehavior', 'defaultCode' => 500, 'defaultMsg' => 'error', ], //ps:components 中绑定事件,可以用两种方法 //'on eventName' => $eventHandler, //'as behaviorName' => $behaviorConfig, //参考 http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format],

至于地点企图干活的第4点和第5点,大家贴一下代码方便清楚

至于地点希图干活的第4点和第5点,大家贴一下代码方便清楚

11、编写 frontendextensionsResBeforeSendBehavior 代码
<?phpnamespace frontendextensions;use Yii;use yiiwebResponse;use yiibaseBehavior;class ResBeforeSendBehavior extends Behavior{ public $defaultCode = 500; public $defaultMsg = 'error'; // 重载events() 使得在事件触发时,调用行为中的一些方法 public function events() { // 在 EVENT_BEFORE_SEND 事件触发时,调用成员函数 beforeSend return [ Response::EVENT_BEFORE_SEND => 'beforeSend', ]; } // 注意 beforeSend 是行为的成员函数,而不是绑定的类的成员函数。 // 还要注意,这个函数的签名,要满足事件 handler 的要求。 public function beforeSend { try { $response = $event->sender; if($response->data === null){ $response->data = [ 'code' => $this->defaultCode, 'msg' => $this->defaultMsg, ]; } elseif(!$response->isSuccessful) { $exception = Yii::$app->getErrorHandler()->exception; if(is_object($exception) && !$exception instanceof yiiwebHttpException){ throw $exception; } else { $rData = $response->data; $response->data = [ 'code' => empty($rData['status']) ? $this->defaultCode : $rData['status'], 'msg' => empty($rData['message']) ? $this->defaultMsg : $rData['message'], ]; } } else { /** * $response->isSuccessful 表示是否会抛出异常 * 值为 true, 代表返回数据正常,没有抛出异常 */ $rData = $response->data; $response->data = [ 'code' => isset($rData['error_code']) ? $rData['error_code'] : 0, 'msg' => isset($rData['res_msg']) ? $rData['res_msg'] : $rData, ]; $response->statusCode = 200; } } catch (Exception $e) { $response->data = [ 'code' => $this->defaultCode, 'msg' => $this->defaultMsg, ]; } return true; }}
'components' => [
 'user' => [ 
 'identityClass' => 'commonmodelsUser',
 'enableAutoLogin' => true,
 'enableSession' => false,
 ],
 'urlManager' => [
 'enablePrettyUrl' => true,
 'showScriptName' => false,
 'enableStrictParsing' => true,
 'rules' => [
  [
  'class' => 'yiirestUrlRule',
  'controller' => ['v1/user'],
  'extraPatterns' => [
   'POST login' => 'login',
   'GET signup-test' => 'signup-test',
  ]
  ],
 ]
 ],
 // ......
],
'components' => [
 'user' => [ 
  'identityClass' => 'commonmodelsUser',
  'enableAutoLogin' => true,
  'enableSession' => false,
 ],
 'urlManager' => [
  'enablePrettyUrl' => true,
  'showScriptName' => false,
  'enableStrictParsing' => true,
  'rules' => [
   [
    'class' => 'yiirestUrlRule',
    'controller' => ['v1/user'],
    'extraPatterns' => [
     'POST login' => 'login',
     'GET signup-test' => 'signup-test',
    ]
   ],
  ]
 ],
 // ......
],
12、创建 GoodsController.php
<?phpnamespace frontendmodulesv1controllers; use yiirestActiveController; class GoodsController extends ActiveController { public $modelClass = 'commonmodelsGoods'; public function actionSearch(){ return [ 'error_code' => 20, 'res_msg' => 'ok', ]; }}

signup-test操作大家前面加多测量试验用户,为记名操作提供有利。别的品种的操作前面看须求再做增添。

signup-test操作我们后边增加测验用户,为报到操作提供方便。其余类其余操作前边看要求再做增添。

13、应用入口同级增添.htaccess文件,遮蔽index.php,以apache为例
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteRule .* index.php

认证类的选取

认证类的选择

14、测试
命令:curl -s -H Accept:application/xml http://local.rest.com/v1/goods/1返回:<?xml version="1.0" encoding="UTF-8"?><response> <code>0</code> <msg> <id>1</id> <name>测试商品1</name> <price>600</price> <status>1</status> <create_time>1520490595</create_time> <modify_time>1520490595</modify_time> </msg></response>

命令:curl -s -H Accept:application/json http://local.rest.com/v1/goods/1返回:{ "code":0, "msg":{ "id":"1", "name":"测试商品1", "price":"600", "status":1, "create_time":"1520490595", "modify_time":"1520490595" }}

命令:curl -s -H Accept:application/json http://local.rest.com/v1/goods11返回:{"code":404,"msg":"Page not found."}

命令:curl -s -H Accept:application/json http://local.rest.com/v1/goods/search返回:{"code":20,"msg":"ok"}

我们在apimodulesv1controllersUserController中设定的model类指向 commonmodelsUser类,为了评释入眼这里我们就不单独拿出来重写了,看各位要求,有须要的话再单独copy二个User类到apimodels下。

我们在apimodulesv1controllersUserController中设定的model类指向 commonmodelsUser类,为了印证入眼这里大家就不单独拿出去重写了,看各位要求,有供给的话再单独copy贰个User类到apimodels下。

15、参考

校验用户权限我们以 yiifiltersauthQueryParamAuth 为例

校验用户权限我们以 yiifiltersauthQueryParamAuth 为例

use yiifiltersauthQueryParamAuth;

public function behaviors() 
{
 return ArrayHelper::merge (parent::behaviors(), [ 
  'authenticator' => [ 
  'class' => QueryParamAuth::className() 
  ] 
 ] );
}
use yiifiltersauthQueryParamAuth;

public function behaviors() 
{
 return ArrayHelper::merge (parent::behaviors(), [ 
   'authenticator' => [ 
    'class' => QueryParamAuth::className() 
   ] 
 ] );
}

如此一来,那岂不是全体访谈user的操作都急需验证了?那不行,客户端第多个访谈login操作的时候哪来的token,yiifiltersauthQueryParamAuth对外提供一个属性,用于过滤无需表明的action。大家将UserController的behaviors方法稍作修改

如此一来,那岂不是全体访问user的操作都亟待表明了?那特别,客户端第二个访谈login操作的时候哪来的token,yiifiltersauthQueryParamAuth对外提供叁个本性,用于过滤无需验证的action。大家将UserController的behaviors方法稍作修改

public function behaviors() 
{
 return ArrayHelper::merge (parent::behaviors(), [ 
  'authenticator' => [ 
  'class' => QueryParamAuth::className(),
  'optional' => [
   'login',
   'signup-test'
  ],
  ] 
 ] );
}
public function behaviors() 
{
 return ArrayHelper::merge (parent::behaviors(), [ 
   'authenticator' => [ 
    'class' => QueryParamAuth::className(),
    'optional' => [
     'login',
     'signup-test'
    ],
   ] 
 ] );
}

那般login操作就无需权限验证就可以访谈了。

这么login操作就无需权限验证就可以访问了。

编辑:mg4377娱乐手机版 本文来源:api授权验证详解,风格搭建

关键词: 风格 restful api yii2restful