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
相关产品推荐
相关产品推荐

