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

php-open-source-saver/jwt-auth刷新令牌机制及自定义声明问题咨询

php-open-source-saver/jwt-auth 刷新令牌机制及常见疑问解答

刷新令牌基础流程

和你了解的常规JWT流程一致:用户登录时,后端返回access token(短有效期,比如5分钟)和refresh token(长有效期,比如1天);当access token过期后,前端携带refresh token请求刷新接口,后端验证通过后返回新的access token。

你提供的代码中,respondWithToken负责返回标准化的token响应,refresh接口调用auth()->refresh()完成令牌刷新操作。


你的疑问解答

1. 该包如何验证请求用户的合法性?

这个包通过以下步骤完成用户合法性验证:

  • 令牌提取:默认从请求的Authorization头中提取Bearer格式的令牌(不管是access还是refresh token)。
  • 签名验证:用配置文件中设置的密钥(JWT_SECRET)验证令牌签名,确保令牌未被篡改。
  • 有效期检查:验证令牌的exp(过期时间)声明,确认令牌未过期。
  • 用户关联验证:解析令牌中的sub(用户ID)声明,查询对应数据库用户是否存在,确保用户未被删除或禁用。
  • 黑名单校验(若启用):检查令牌是否在黑名单中(比如用户主动注销后,旧token会被加入黑名单)。

只有以上所有验证通过,才会认定请求用户合法。

2. 为何刷新接口中未显式传入refresh token?

这是因为php-open-source-saver/jwt-auth集成了Laravel的认证系统,会自动处理令牌的提取与解析:

  • 前端请求刷新接口时,需要在Authorization头中携带有效的refresh token(格式:Bearer {refresh_token})。
  • 接口的路由通常会被auth:api中间件保护,该中间件会自动从请求头中提取令牌并完成初步验证。
  • auth()->refresh()方法内部会直接使用当前已通过验证的令牌(也就是传入的refresh token),生成新的access token,无需手动传入。

3. 能否在JWT payload中添加权限、角色等自定义声明?

完全可以,有两种常用方式:

方式一:生成令牌时直接添加

在登录生成token的逻辑中,使用claims()方法传入自定义声明:

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (! $token = auth()->claims([
        'role' => 'admin', // 角色声明
        'permissions' => ['user:edit', 'post:delete'] // 权限声明
    ])->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }

    return $this->respondWithToken($token);
}

方式二:通过配置或事件全局添加

如果你需要给所有生成的token都添加统一的自定义声明,可以:

  • 修改配置文件config/jwt.php中的claims数组,添加默认声明;
  • 监听PHPOpenSourceSaver\JWTAuth\Events\JWTAttempting事件,在事件处理类中动态添加自定义声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:35:04