Laravel JWT 认证的令牌存储策略与令牌的黑名单管理

? Laravel JWT 认证的令牌存储策略与令牌的黑名单管理:一场轻松愉快的技术讲座

大家好,欢迎来到今天的讲座!今天我们要聊的是一个非常有趣的话题——Laravel中的JWT认证。别紧张,我会用轻松幽默的语言,带你一步步了解JWT令牌的存储策略和黑名单管理。?

在开始之前,先来个简单的热身问题:你知道JWT是什么吗?如果你不知道,也没关系!JWT(JSON Web Token)是一个开放标准(RFC 7519),用于在网络应用中安全地传输信息。它就像一张“身份证”,证明你是谁,以及你有权限做什么。


? 第一章:JWT令牌的存储策略

1.1 什么是存储策略?

简单来说,存储策略就是决定把你的JWT令牌放在哪里。你可以把它想象成把钥匙藏在哪里的问题。如果藏得太明显,容易被偷;如果藏得太深,你自己都找不到 ?。

1.2 常见的存储方式

存储位置 优点 缺点
LocalStorage 简单易用,可以长期保存 容易受到XSS攻击
SessionStorage 和LocalStorage类似,但只在当前会话有效 同样容易受到XSS攻击
Cookies 可以设置HttpOnly属性,防止JS访问 需要额外配置CORS和跨域问题

国外技术文档提到,Cookies是更安全的选择,尤其是当你设置了HttpOnlySecure标志时。这就像把钥匙放进一个带密码锁的保险箱里。

1.3 示例代码:使用Cookies存储JWT

// 在登录成功后,将JWT令牌存储到Cookie中
use IlluminateSupportFacadesCookie;

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

    if (! $token = auth()->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }

    // 创建一个HttpOnly Cookie
    $cookie = Cookie::make('jwt_token', $token, 60); // 有效期为60分钟

    return response()->json(['success' => true])->withCookie($cookie);
}

? 第二章:JWT令牌的黑名单管理

2.1 为什么需要黑名单?

假设你有一个JWT令牌,有效期是7天。但是有一天,你突然觉得这个令牌不安全了(比如用户设备丢失或者账号被盗)。这时候,你需要一种方法来让这个令牌失效。这就是黑名单的作用!

黑名单就像一个“禁止名单”,列出所有已经被撤销的令牌。当系统检测到某个令牌在黑名单中时,就会拒绝它的请求。

2.2 如何实现黑名单?

Tymon 的 JWT Auth 包为我们提供了内置的黑名单功能。我们可以通过以下步骤实现:

  1. 启用黑名单功能:确保你在配置文件中启用了黑名单。
  2. 将令牌加入黑名单:当你需要撤销某个令牌时,将其加入黑名单。
  3. 验证令牌是否在黑名单中:每次验证令牌时,检查它是否在黑名单中。

2.2.1 启用黑名单功能

打开 config/jwt.php 文件,找到 blacklist_grace_periodrequired_claims 配置项,确保它们正确设置。

'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
'required_claims' => [
    'iss',
    'iat',
    'exp',
    'nbf',
    'sub',
    'jti',
],

2.2.2 将令牌加入黑名单

当你想注销用户的令牌时,可以使用以下代码:

public function logout(Request $request)
{
    $token = $request->bearerToken();
    if ($token) {
        try {
            // 将令牌加入黑名单
            auth()->invalidate($token);

            return response()->json(['message' => 'Successfully logged out']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Failed to logout'], 500);
        }
    }

    return response()->json(['error' => 'No token provided'], 401);
}

2.2.3 检查令牌是否在黑名单中

Tymon 的 JWT Auth 会在每次验证令牌时自动检查黑名单。如果没有特别需求,你不需要手动实现这个逻辑。


? 第三章:常见问题与解决方案

3.1 黑名单不起作用怎么办?

首先,确保你已经启用了黑名单功能。其次,检查数据库中是否有 jwt_blacklist 表。如果没有,运行以下命令创建:

php artisan jwt:generate
php artisan migrate

3.2 如何处理过期令牌?

过期令牌会自动被拒绝,无需手动加入黑名单。不过,如果你希望支持刷新令牌功能,可以在配置文件中启用 refresh_ttl

'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), // 默认2周

然后,在控制器中实现刷新逻辑:

public function refresh()
{
    return [
        'access_token' => auth()->refresh(),
        'token_type' => 'bearer',
        'expires_in' => auth()->factory()->getTTL() * 60,
    ];
}

? 总结

今天我们一起探讨了Laravel中JWT令牌的存储策略和黑名单管理。记住以下几点:

  • 存储策略:优先选择Cookies,并设置HttpOnlySecure标志。
  • 黑名单管理:启用黑名单功能,及时将不再需要的令牌加入黑名单。
  • 常见问题:检查配置文件和数据库表是否正确。

最后,送给大家一句话:JWT虽然强大,但也要小心使用。就像一把锋利的刀,既能切菜,也能伤人 ?。

好了,今天的讲座就到这里!如果你有任何问题,欢迎在评论区留言。下次见啦! ?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注