laravel passport 使用问题
作者:钓赛通
发布时间:2021-12-15
点击数:
对于API接口的开发,laravel官方推荐我们使用passport,但是在使用过程中偶尔会有一些小问题,所以花了一点时间做了一下整理。
注:Passport 需要你对 OAuth2 非常熟悉才能自如使用,可以参考阮一峰博客:理解OAuth 2.0
1.安装问题
composer require laravel/passport
这样会默认安装最新版的passport,但事实证明并不是所有人都能安装成功,绝大多数人都会有一个公共的问题,就是版本的问题,这个在各大这区讨论得也是比较多的。我是这样解决的
composer require laravel/passport ~7.3
对于composer ~ 符号不了解的可以去这里了解:composer包版本,如果 ~7.3 的版本还是不行就试试 其他版本,不同的laravel版本需要对应的passport版本,比如你的laravel版本是6.0,就需要安装passport7.3的版本
2.和JWT包不兼容
Replicating claims as headers is deprecated and will removed from v4.0. Please manually set the header if you need it replicated.
laravel的passport包使用thephpleague/oauth2-server, 而thephpleague/oauth2-server 使用的是 lcobucci/jwt “3.3.3”.版本,而本地的jwt版本应该不一致,导致的不兼容
composer require lcobucci/jwt=3.3.3
3.passport 模型指向问题
根据其他教程的配置,源码是这样写的。
src/Bridge/UserRepository.php
public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity)
{
$provider = config('auth.guards.api.provider');
if (is_null($model = config('auth.providers.'.$provider.'.model'))) {
throw new RuntimeException('Unable to determine authentication model from configuration.');
}
if (method_exists($model, 'findForPassport')) {
$user = (new $model)->findForPassport($username);
} else {
$user = (new $model)->where('email', $username)->first();
}
}
有两个问题:
一、默认验证的字段是 email,如果你的用户名是其他的字段,那么就要自己在认证的 model 里通过 findForPassport 方法来定义。
二、passport 认证的 model 是根据 config('auth.guards.api.provider') 来指定的。根据默认配置会指向user模型。如果找不到这个配置 passport 就会报错。但是如果你实在不想用 api 这个guards,或者你需要多表认证,那你也可以写一个中间件做动态配置(使用个人授权令牌时不存在这个问题)
4.传递访问令牌
请求被passport保护的路由时,请求头 必须 按如下格式传递
'Accept' => 'application/json'
'Authorization' => 'Bearer '.$accessToken
如果不传递 Accept 或者 Accept 的值不是 application/json ,laravel会走自带的 auth 验证流程,既 Authenticate 中间件