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

Laravel Passport登录:如何在响应中同时返回认证信息与用户详情?

当然可行!这是Laravel Passport开发中非常常见的需求,完全可以在返回认证令牌的同时把用户详情一起打包到响应里。下面给你两种常用的实现方式,你可以根据自己的代码结构来选:

方法一:自定义登录控制器(推荐,更灵活)

如果你的登录逻辑是自己写的控制器,只需要在生成令牌后,把用户信息一起返回就行,记得隐藏敏感字段(比如密码、remember_token这些)。示例代码如下:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;

class LoginController extends Controller
{
    public function login(Request $request)
    {
        // 先验证请求参数的合法性
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        // 尝试用邮箱和密码认证用户
        if (!Auth::attempt($request->only('email', 'password'))) {
            return response()->json([
                'message' => '邮箱或密码错误'
            ], 401);
        }

        // 获取认证通过的用户实例
        $user = Auth::user();

        // 生成Passport的访问令牌
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->token;

        // 可选:设置令牌的过期时间(比如7天)
        $token->expires_at = now()->addDays(7);
        $token->save();

        // 把令牌信息和用户详情一起返回,用makeHidden隐藏敏感字段
        return response()->json([
            'access_token' => $tokenResult->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => Carbon::parse($token->expires_at)->toDateTimeString(),
            'user' => $user->makeHidden(['password', 'remember_token', 'email_verified_at'])
        ]);
    }
}

方法二:监听Passport事件(适配默认/oauth/token端点)

如果你用的是Passport自带的/oauth/token端点来获取令牌,可以通过监听Passport的事件来修改响应,自动添加用户信息:

  1. 首先创建一个事件监听器:
php artisan make:listener AddUserToTokenResponse
  1. 打开生成的监听器文件App\Listeners\AddUserToTokenResponse.php,修改handle方法:
<?php

namespace App\Listeners;

use Laravel\Passport\Events\AccessTokenCreated;
use Symfony\Component\HttpFoundation\Response;

class AddUserToTokenResponse
{
    public function handle(AccessTokenCreated $event)
    {
        // 获取当前的响应实例
        $response = app(Response::class);
        
        // 解析原响应的JSON内容
        $content = json_decode($response->getContent(), true);
        
        // 把用户详情添加到响应内容里,同样隐藏敏感字段
        $content['user'] = $event->user->makeHidden(['password', 'remember_token']);
        
        // 更新响应内容
        $response->setContent(json_encode($content));
        
        return $response;
    }
}
  1. 在App\Providers\EventServiceProvider.php里注册这个监听器:
protected $listen = [
    \Laravel\Passport\Events\AccessTokenCreated::class => [
        \App\Listeners\AddUserToTokenResponse::class,
    ],
];

重要注意事项

不管用哪种方法,都要确保你的User模型已经引入了Passport的HasApiTokens trait,不然没法生成令牌:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    // ... 其他模型代码
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:41