前言:laravel passport 密码模式作为网站前后端分离后API验证登录的一种解决方案,本文主要记录这个过程中遇到的一些问题。
安装
laravel passport要求laravel版本大于等于5.3,因此必须把低于此要求的框架升级到5.3,具体做法可以参考上一篇博客。
升级完后,使用composer require laravel/passport=~1.0
即可安装passport
按照官方文档指导,注册service provider、注册路由和引入HasApiToken等即可,在这里不再赘述。
遇到的问题
第一个问题:由于各种原因,用来对用户进行登录验证的字段和laravel默认往往不一样。这时候就要自定义登录的用户名和密码。
解决方案:
在用户模型里面添加一下两个方法,分别用来做用户名验证和密码验证:
/**
* passport 验证用户名
* @param $username
* @return mixed
*/
public function findForPassport($username) {
return $this->where('FName', $username)->first();
}
/**
* passport 验证密码
* @param $password
* @return bool
*/
public function validateForPassportPasswordGrant($password)
{
return $this->FPwd == md5($password);
}
第二个问题:跨域问题
解决方案:推荐直接使用barryvdh/laravel-cors
扩展包
第三个问题:获取到access_token后,用来访问受保护的资源时,会自动跳转到首页
解决方案:这是由于从5.2升级到5.3后,没有更新.htaccess文件所致,将一下两行内容添加到末尾即可:
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
第四个问题:laravel只能验证session登录或passport登录,不能自动识别两种不同的请求
解决方案:
首先,要确保config/auth.php
文件配置正确(因为从5.1升级而来的系统会发生了非常大的变化),这个文件里面default.guards
的值会影响到laravel默认的验证方式。
这个问题也是由于升级框架后的历史遗留问题,需要将auth
更改为:
//'auth' => \App\Http\Middleware\Authenticate::class,
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,`
参考网站:
- 理解OAuth 2.0
- Laravel Passport login using username or email
- ReflectionException Class web does not exit
- Laravel Passport Password Grant - Client authentication failed
- Passport always redirect on login
- Laravel Passport “auth:api” middleware acts as "web auth" middleware
- Passport $request->user() is null
- Laravel /passport and postman gets all the time unauthorised
- Get user alway return null