在配置中如有问题:加Q405420415,有问必答。
一. yii2.0几种授权的介绍
RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS 来防止 man-in-the-middle(MitM)中间人攻击。
/*以上摘自YII中国官方文档*/
下面有几种方式(稍微自己整理下,感觉看起来更容易理解点):
HttpBasicAuth:在请求的头添加Authorization(即:Authorization: "Basic 用户名和密码的base64加密字符串" )
HttpBearerAuth:在请求的头添加Authorization(即:Authorization: "Bearer access-token" )
QueryParamAuth:在URL结尾添加GET参数access-token(即: https://demo.com/users?access-token=xxxxxxxx)
二. 详细的配置
① 重写common/user/models的findIdentityByAccessToken方法
/**
* {@inheritdoc}
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
② 添加控制层登录的相关代码(能够保存到数据库中,如果LoginForm没有请重新用命里安装下,这些文件都是安装完后自带的,然后复制到api/models这个目录来,其中user表是利用yii-admin 扩展组件里面migrate生成的,前面博客有介绍其安装流程)
namespace api\controllers;
use api\models\LoginForm;
use yii\rest\ActiveController;
use Yii;
/**
* User controller
*/
class UserController extends ActiveController
{
public $modelClass = 'common\models\User';
/**
* 登陆
* @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();
}
}
}
③ 重写api/models/LoginForm.php的login方法
/**
* Logs in a user using the provided username and password.
*
* @return bool whether the user is logged in successfully
*/
public function login()
{
if ($this->validate()) {
$access_token = $this->_user->generateAccessToken();
$this->_user->save();
return $access_token;
} else {
return false;
}
}
三. postman测试API接口,我这边多创建了Article控制器,来测试(我先上代码,有几个注意事项我在代码中注释)
namespace api\controllers;
use yii\rest\ActiveController;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
use Yii;
class ArticleController extends ActiveController
{
public $modelClass = '';
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
//这边选择你要开启的验证方式
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
return $behaviors;
}
/**
* GET 返回文章的内容
* @return array
*/
public function actionGetArticleInfo()
{
return ['title' => 'title', 'content' => 'content'];
}
}
① 登陆API接口
②获取文章信息(我这边用HttpBearerAuth,其余大家自己摸索下,都差不多,选择自己想要的。还有个注意点记得在配置文件那边把Artilce这个控制器加进去,不然会报404找不到,这个在上个RESTful教程一有讲解到)
/*这图是我故意没有在header添加验证信息,会报的错误*/
/*这是成功的*/