如何正确鉴权同邮箱密码用户并在OAuth密码授权中传自定义参数
问题解决方案
你可以在/oauth/token的请求参数中添加自定义字段,但需要同步调整服务端OAuth服务的用户验证逻辑,才能让自定义字段生效,解决多scope下同邮箱密码匹配到错误用户的问题。
1. 请求端参数调整
你写的参数添加方式逻辑正确,只需要注意补全语法逗号即可,修正后示例:
$response = $http->request('POST', env('APP_URL') . '/api/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => $oClient->id, 'client_secret' => $oClient->secret, 'username' => $request->email, 'password' => $request->password, 'user_role' => 'example_role', // 补全逗号避免语法报错 'scope' => 'business', ], ]);
2. 服务端自定义验证逻辑
以使用最广泛的Laravel Passport框架为例,你需要重写密码授权的用户查询规则,将自定义字段加入验证条件:
- 首先在
app/Providers/AuthServiceProvider.php的boot方法中,自定义用户验证逻辑,同时匹配邮箱、密码、你传入的自定义字段:
public function boot() { $this->registerPolicies(); Passport::routes(); Passport::viaRequest('custom-password-grant', function ($request) { // 验证时同时匹配邮箱、密码、自定义标识字段 $user = User::where('email', $request->username) // 如果用户表存储scope也可以直接匹配请求传的scope参数 // ->where('scope', $request->scope) ->where('user_role', $request->user_role) ->first(); return $user && Hash::check($request->password, $user->password) ? $user : null; }); }
- 之后修改
config/auth.php中api guard的driver为你定义的custom-password-grant即可。
如果使用的是其他OAuth2服务端框架,逻辑通用:只需要在密码授权的用户验证环节,从请求中获取自定义参数,加入用户查询的where条件即可,不需要修改OAuth2的基础配置。
内容的提问来源于stack exchange,提问作者Jan Keber
相关产品推荐
相关产品推荐

