Authentication 认证

RESTful Api 是无状态的, 因此这意味着不能使用 sessions && cookies

因此每一个请求应该带有一些 authentication credentials 因为用户的 authentication 状态可能不是保存在 sessions || cookies 中的。

一个通用的实例就是在发送每一个请求的同时带一个 secret access token 来验证用户。因为一个 access token 可以用来确定一个唯一的用户和验证这个用户, API Requests 应该总是通过 https 协议来传输, 以防止 man-in-the-middle (MitM) 攻击。

有多种不同的方式来发送 access token

  • HTTP Basic Auth

    • access token 作为一个用户名被传递。这种情况只适合“当access token可以安全的存储在API 接收端”的情况, 比如 调用 API 的是一个在服务器上运行的程序
  • Query parameter
    • access token 在 API URL 中作为一个查询参数被传递,比如 https://example.com/users?access-token=123456789
    • 因为多数的 Web 服务器会保存 query 参数在服务器日志中, 这个方法应该主要是用于响应无法使用 HTTP 头部信息来发送 access tokenJSONP 请求的。
  • OAuth 2
    • 遵照 OAth2.0 协议, 调用者从一个 授权服务器 上获取 access token, 再通过 HTTP Bearer Tokens 发送给 Api 服务器

Yii 支持上面的几种认证方式, 你也可以自己创建新的认证方法。

要对你的 APIs 启用认证的话, 遵照下面的步骤:

  1. 配置 user 组件的 yii\web\User::enableSession|enableSession 属性为 false
  2. 在你的 REST 控制器中 指明你准备使用哪一种 authenticator 方法
  3. 在你的 yii\web\User::identityClass|user identity class 中实施 yii\web\IdentityInterface::findIdentityByAccessToken()

第一步并不是必须, 但是针对无状态的 RESTful APIs 还是建议要有。 当 yii\web\User::enableSession|enableSessionfalse 的时候, 用户认证状态不能通过 sessions 在多个请求之间保持。反倒是, 第二步和第三部的配置会对来的每一个请求都执行认证检查。

Tips: 你可以在应用的 configurations 的 user application component 中配置 yii\web\User::enableSession|enableSession, 如果你是将 RESTful APIs 作为一个 模块 module, 你可以像下面一样在 module的 init() 方法中添加代码:

public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}

下面针对上面几种情况,在 Yii2 的情况下举几个例子:

第一种情况, 使用 HTTP Basci Auth

use yii\helpers\ArrayHelper;
use yii\filters\auth\HttpBasicAuth; public function behaviors()
{
return ArrayHelper::merge(
parent::behaviors(),[
'authenticator' => [
'class' => HttpBasicAuth::className(),
]
]
);
}

如果你想要使用上面讲到的 3 种方式, 可以像下面一样使用 CompositeAuth :

use yii\helpers\ArrayHelper;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasciAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth; public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'authenticator' => [
#这个地方使用`ComopositeAuth` 混合认证
'class' => CompositeAuth::className(),
#`authMethods` 中的每一个元素都应该是 一种 认证方式的类或者一个 配置数组
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
]
]
]);
}

例如, 一个简单的情景是当每一个用户只能拥有一个 ·access token· 的时候, 你可以在 user 表中的 access_token 列存储它。这种方式可以像下面一样轻易的实现:

use yii\db\ActiveRecord;
use yii\web\IdentityInterface; class User extends ActiveRecord implements IdentityInterface
{
public static function findIndentityByAccessToken($token)
{
return static::findOne(['access_token' => $token]);
}
}

经过上面的认证之后, 对每一个 API 请求, 被请求的 控制都会 在它的 beforeAction() 步骤之前尝试认证用户。

如果认证成功, 控制器会执行其他的检查,(比如rate limiting, authorization)。被认证了的用户的认证信息可以通过 Yii::$app->user->identity 获得。

如果认证失败, 一个 401 HTTP 状态的响应会被发送回来连同其他的头部信息 (比如一个 HTTP BASIC Auth 认证的 WWW-Authenticate 头部信息)

Authorization 授权

一个用户经过认证之后, 你可能还想要检查他是否有对请求的资源执行某个请求动作的权限。这个过程叫做授权

授权是验证用户是否有足够权限做一些事情的过程。(译者注:Authentication就是验证是否注册,Authorization是检查已登录用户是否有权限) Yii 提供了两种方法来管理授权:

访问控制过滤器(Access Control Filter,简称 ACF)和 基于角色的访问控制(Role-Based Access Control,简称 RBAC)。

如果你的控制器 extend yii\rest\ActiveController, 你可以覆盖重写 yii\rest\Controller::checkAccess()|checkAccess() 方法来执行授权检查。因为这个方法会被内建动作 yii\rest\ActiveController 调用。

Yii2 Api认证和授权(翻译)的更多相关文章

  1. Yii2.0 RESTful API 认证教程

    认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...

  2. 【翻译】asp.net core2.1认证和授权解密

    asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...

  3. Web Api 2 认证与授权 2

    HTTP Message Handler 在 Web Api 2 认证与授权 中讲解了几种实现机制,本篇就详细讲解 Message Handler 的实现方式 关于 Message Handler 在 ...

  4. 关于 Web Api 2 认证与授权

    认证与授权 认证与授权,Authentication and Authorize,这个是两个不同的事.认证是对访问身份进行确认,如验证用户名和密码,而授权是在认证之后,判断是否具有权限进行某操作,如 ...

  5. ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库

    目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...

  6. .Netcore 2.0 Ocelot Api网关教程(5)- 认证和授权

    本文介绍Ocelot中的认证和授权(通过IdentityServer4),本文只使用最简单的IdentityServer,不会对IdentityServer4进行过多讲解. 1.Identity Se ...

  7. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)

    在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...

  8. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)

    好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...

  9. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

随机推荐

  1. 两张表的笛卡尔积用sql语句

    第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小SELECT * FROM table1 CROSS JOIN table2

  2. Android之通知使用权

    通知使用权打开方式 设置--提示音和通知--通知使用权. 具体界面如图: 存在须要拥有通知使用权应用时: 不存在须要拥有通知使用权应用时: 用户为应用勾选复选框后系统弹dialog须要用户进一步确认时 ...

  3. Spark SQL 代码简要阅读(基于Spark 1.1.0)

    Spark SQL允许相关的查询如SQL,HiveQL或Scala运行在spark上.其核心组件是一个新的RDD:SchemaRDD,SchemaRDDs由行对象组成,并包含一个描述此行对象的每一列的 ...

  4. JAVA逐行读取TXT文件

    package help; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; imp ...

  5. (转)Vue2.X的路由管理记录之 钩子函数(切割流水线)

    $route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,里面的属性是 immutable(不可变) 的,不过你可以 watch(监测变化)它. 导航和钩子函数: 导航:路由正在发生改 ...

  6. QSignalMapper类的使用

    Qt中当定义了非常多的button,而他们的信号都同样时(比方都是点击信号),没有必要给他们每一个都设置信号和槽的链接.QSignalMapper给我们攻克了这个难题. 今天完毕这个相似的功能时,不知 ...

  7. ckeditor 前段js配置toolbar以及取值(实用)

    <%@ page contentType="text/html;charset=UTF-8"%><%@ include file="/WEB-INF/v ...

  8. Spring整合JMS——三种connectionFactory

    1.SingleConnectionFactory:对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用.(org.springframework.j ...

  9. 一个Tomcat配置参数引发的血案

    转载:https://mp.weixin.qq.com/s/3IuTcDCTB3yIovp6o_vuKA 一.现象 有用户反馈访问PC首页偶尔会出现白页情况,也偶尔会收到听云的报警短信 二.监控(听云 ...

  10. 极客技术专题【011期】:EasyUI初级教程

    来源:GBin1.com 技术专题:EasyUI初级教程 分享人:极客标签技术编辑 - html580(请站内关注分享人) 资深Web前端工程师,HTML580创始人,目前就职于广州一间软件公司.多年 ...