You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Passport登录页面获取OAuth客户端名称?

在Laravel Passport登录页显示OAuth客户端信息的方案

要在登录页面告诉用户正在授权哪个应用,核心是在用户跳转到登录页之前,提前获取并存储OAuth客户端的信息——毕竟默认流程里登录页加载在授权页之前,此时还没触发授权逻辑去拉取客户端详情。

下面给两种可行的实现方式:

方式一:修改登录控制器直接获取客户端信息

直接在登录页的控制器里,通过请求参数里的client_id查询合法客户端,传给视图展示:

  1. 打开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'));
}
  1. 在登录视图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的原生流程,可以重写它的授权控制器,在跳转到登录页前就把客户端信息存入会话:

  1. 创建自定义授权控制器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);
    }
}
  1. 在routes/web.php中覆盖Passport的授权路由:
// 替换默认的Passport授权路由
Route::get('/oauth/authorize', [\App\Http\Controllers\Auth\AuthorizationController::class, 'authorize']);
  1. 最后在登录控制器的showLoginForm方法中,从会话取出oauth_client传给视图,视图代码和方式一一致即可。

注意事项

  • 必须验证客户端的active状态,避免伪造client_id导致显示错误信息。
  • 会话里的oauth_client可以在用户登录完成、进入授权页后清除(可选),减少会话冗余。

内容的提问来源于stack exchange,提问作者Grant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:05:22