如何基于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
相关产品推荐
相关产品推荐

