[PHP] 自定义 laravel/passport 的误区讲解
Passport 的 Client 模型对应用户是默认的 User 模型、使用的 guards 是 api。
如果你发现自定义 passport 时总是调试不成功,那么很有可能是以下原因。
/** * Get the user that the client belongs to. * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this->belongsTo( config('auth.providers.'.config('auth.guards.api.provider').'.model') ); }
Passport 如果要替换 Users,需要修改 config/auth.php 中 guards.api.provider 的值,并且增加新的 auth.providers。
Passport 如果打算新增 guards 来替换默认使用的 api,需要覆写 Client 模型的上面代码部分、并在 AuthServiceProvider 中启用新模型。
https://laravel.com/docs/6.x/passport#overriding-default-models
config/auth.php example:
// Used by laravel/passport Client, see app/Client.php 'oauth' => [ 'driver' => 'passport', 'provider' => 'members', 'hash' => false, ],
app/Providers/AuthServiceProvider.php example:
public function boot() { $this->registerPolicies(); Passport::routes(); Passport::useTokenModel(Token::class); Passport::useClientModel(Client::class); Passport::useAuthCodeModel(AuthCode::class); Passport::usePersonalAccessClientModel(PersonalAccessClient::class); }
注意,自定义的用户表 model 依旧需要继承自 \Illuminate\Foundation\Auth\User,而不是默认的 Illuminate\Database\Eloquent\Model。
调试接口:
验证接口:
使用 auth:api 作为 middleware,根据配置的 passport 驱动,内部 guard 根据 token 传递方式进行 BearerToken(JWT) 或者 Cookie 验证,验证通过后会在 $request 附上相关用户信息 oauth_access_token_id、oauth_client_id、oauth_user_id、oauth_scopes。
[PHP] 浅谈 Laravel Authentication 的 auth:api
[PHP] 浅谈 Laravel Authentication 的 guards 与 providers
[PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth:airlock