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

如何基于Laravel Passport实现「记住我」功能?含移动端API场景

在Laravel Passport中实现「记住我」功能的完整指南

嘿,我来帮你搞定Laravel Passport里的「记住我」功能!其实这个需求实现起来并不复杂,咱们分两部分来聊——先搞定登录表单的前后端逻辑,再讲Passport层面的通用实现思路。

一、登录表单中「记住我」的具体实现步骤

1. 前端表单添加「记住我」复选框

在你的登录表单里加入这个复选框,注意name属性要设为remember,这样后端才能正确接收参数:

<div class="form-group">
    <input type="checkbox" name="remember" id="remember-me">
    <label for="remember-me">记住我</label>
</div>

小提示:复选框未勾选时,前端不会向后台发送这个参数,所以后端要用$request->has('remember')来判断用户是否勾选了「记住我」。

2. 后端登录逻辑处理「记住我」参数

在登录控制器中,先验证用户凭证,然后根据「记住我」的状态调整Passport令牌的有效期。核心是延长刷新令牌的有效期(访问令牌建议保持短期,比如1小时,这更安全)。

示例代码:

use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;

public function login(Request $request)
{
    // 验证登录参数
    $validated = $request->validate([
        'email' => 'required|email',
        'password' => 'required|string',
    ]);

    // 尝试登录,第二个参数就是「记住我」的状态
    if (!Auth::attempt($validated, $request->has('remember'))) {
        return response()->json([
            'message' => '账号或密码错误'
        ], 401);
    }

    $user = Auth::user();
    // 创建Passport访问令牌
    $token = $user->createToken('App Access Token');
    
    // 根据「记住我」状态设置刷新令牌有效期
    $refreshTokenExpireDays = $request->has('remember') ? 14 : 7;
    $token->token->expires_at = Carbon::now()->addDays($refreshTokenExpireDays);
    $token->token->save();

    return response()->json([
        'access_token' => $token->accessToken,
        'token_type' => 'Bearer',
        'expires_at' => Carbon::parse($token->token->expires_at)->toDateTimeString()
    ]);
}

二、Laravel Passport实现「记住我」的通用思路

Passport的「记住我」本质是动态调整令牌的有效期,尤其是刷新令牌的有效期——因为访问令牌通常设计为短期失效,而刷新令牌负责获取新的访问令牌,延长它的有效期就能实现“记住登录状态”的效果。

1. 基础配置默认有效期

你可以在App\Providers\AuthServiceProvider的boot方法里设置Passport令牌的默认有效期:

use Laravel\Passport\Passport;
use Carbon\Carbon;

public function boot()
{
    $this->registerPolicies();
    Passport::routes();

    // 访问令牌默认1小时过期
    Passport::tokensExpireIn(Carbon::now()->addHour());
    // 刷新令牌默认7天过期
    Passport::refreshTokensExpireIn(Carbon::now()->addDays(7));
}

2. 动态覆盖有效期(核心)

当用户勾选「记住我」时,在登录成功后直接修改刚生成的令牌实例的expires_at字段,就像前面控制器代码里做的那样。这种方式灵活,能根据用户的选择动态调整。

3. 安全注意事项

  • 不要把刷新令牌的有效期设置得过长(比如超过30天),否则令牌被盗用后风险会很高;
  • 确保前端在提交表单时,「记住我」复选框的name属性是remember,避免后端无法识别;
  • 如果使用Passport的密码授权模式,同样可以在授权逻辑中加入「记住我」的判断,修改令牌有效期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:07:39