如何在Laravel Passport登录页面获取OAuth客户端名称?
在Laravel Passport登录页显示OAuth客户端信息的方案
要在登录页面告诉用户正在授权哪个应用,核心是在用户跳转到登录页之前,提前获取并存储OAuth客户端的信息——毕竟默认流程里登录页加载在授权页之前,此时还没触发授权逻辑去拉取客户端详情。
下面给两种可行的实现方式:
方式一:修改登录控制器直接获取客户端信息
直接在登录页的控制器里,通过请求参数里的client_id查询合法客户端,传给视图展示:
- 打开
app/Http/Controllers/Auth/LoginController.php,修改showLoginForm方法:
public function showLoginForm() { $client = null; // 从请求中获取client_id,查询活跃的合法客户端 if (request()->has('client_id')) { $client = \Laravel\Passport\Client::where('id', request('client_id')) ->where('active', true) ->first(); // 存入会话,防止后续跳转时请求参数丢失 if ($client) { session(['oauth_client' => $client]); } } // 优先从会话取客户端信息(适配登录跳转后的场景) $client = session('oauth_client') ?? $client; return view('auth.login', compact('client')); }
- 在登录视图
resources/views/auth/login.blade.php中添加客户端信息展示:
@if($client) <div class="alert alert-info"> 您正在登录到:<strong>{{ $client->name }}</strong> @if($client->description) <p class="mt-2 text-sm">{{ $client->description }}</p> @endif </div> @endif
方式二:重写Passport授权控制器提前存储客户端信息
如果想更贴合Passport的原生流程,可以重写它的授权控制器,在跳转到登录页前就把客户端信息存入会话:
- 创建自定义授权控制器
app/Http/Controllers/Auth/AuthorizationController.php:
namespace App\Http\Controllers\Auth; use Laravel\Passport\Http\Controllers\AuthorizationController as PassportAuthorization; use Illuminate\Http\Request; use Laravel\Passport\Client; class AuthorizationController extends PassportAuthorization { protected function redirectToLogin(Request $request) { // 提前查询并存储合法客户端信息 if ($request->has('client_id')) { $client = Client::where('id', $request->client_id) ->where('active', true) ->first(); if ($client) { $request->session()->put('oauth_client', $client); } } // 调用父类方法完成登录跳转 return parent::redirectToLogin($request); } }
- 在
routes/web.php中覆盖Passport的授权路由:
// 替换默认的Passport授权路由 Route::get('/oauth/authorize', [\App\Http\Controllers\Auth\AuthorizationController::class, 'authorize']);
- 最后在登录控制器的
showLoginForm方法中,从会话取出oauth_client传给视图,视图代码和方式一一致即可。
注意事项
- 必须验证客户端的
active状态,避免伪造client_id导致显示错误信息。 - 会话里的
oauth_client可以在用户登录完成、进入授权页后清除(可选),减少会话冗余。
内容的提问来源于stack exchange,提问作者Grant
相关产品推荐
相关产品推荐

