JWTRefreshTokenBundle核心功能解析:从配置到实战的完整路线图

【免费下载链接】JWTRefreshTokenBundle Implements a Refresh Token system over Json Web Tokens in Symfony 【免费下载链接】JWTRefreshTokenBundle 项目地址: https://gitcode.com/gh_mirrors/jw/JWTRefreshTokenBundle

JWTRefreshTokenBundle是Symfony框架中一款强大的JWT刷新令牌管理工具,它能够与LexikJWTAuthenticationBundle无缝集成,为应用提供安全高效的令牌刷新机制。本文将从基础安装到高级配置,全面解析该bundle的核心功能与实战应用。

快速安装指南

安装JWTRefreshTokenBundle非常简单,根据你的数据存储方案选择对应的安装命令:

ORM用户(使用Doctrine关系型数据库)

composer require doctrine/orm doctrine/doctrine-bundle gesdinet/jwt-refresh-token-bundle

ODM用户(使用MongoDB)

composer require doctrine/mongodb-odm doctrine/mongodb-odm-bundle gesdinet/jwt-refresh-token-bundle

注意:安装前确保已安装Symfony框架和LexikJWTAuthenticationBundle,且必须选择ORM或ODM中的一种进行安装,否则可能导致错误。

基础配置步骤

1. 创建刷新令牌实体类

ORM用户(MySQL/PostgreSQL等)

创建src/Entity/RefreshToken.php文件,内容如下:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gesdinet\JWTRefreshTokenBundle\Entity\RefreshToken as BaseRefreshToken;

#[ORM\Table('jwt_refresh_token')]
#[ORM\Entity]
class RefreshToken extends BaseRefreshToken
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer')]
    #[ORM\GeneratedValue(strategy: 'AUTO')]
    protected $id;
}
ODM用户(MongoDB)

创建src/Document/RefreshToken.php文件,内容如下:

<?php

namespace App\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Gesdinet\JWTRefreshTokenBundle\Document\RefreshToken as BaseRefreshToken;

#[ODM\Document(collection: 'jwt_refresh_token')]
class RefreshToken extends BaseRefreshToken
{
    #[ODM\Id(strategy: 'auto')]
    protected $id;
}

2. 配置bundle

创建config/packages/gesdinet_jwt_refresh_token.yaml文件,根据你的实体类路径进行配置:

gesdinet_jwt_refresh_token:
    refresh_token_class: App\Entity\RefreshToken  # ORM用户
    # refresh_token_class: App\Document\RefreshToken  # ODM用户

3. 数据库迁移

执行数据库迁移命令,创建刷新令牌表:

php bin/console make:migration
php bin/console doctrine:migrations:migrate

4. 配置路由

config/routes.yaml中添加刷新令牌路由:

gesdinet_jwt_refresh_token:
    path:       /api/token/refresh
    methods:    [POST]

5. 配置安全防火墙

编辑config/packages/security.yaml,添加refresh_jwt认证器:

security:
    firewalls:
        api:
            pattern: ^/api/
            stateless: true
            entry_point: jwt
            jwt: ~
            refresh_jwt:
                check_path: /api/token/refresh
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure

核心功能详解

令牌生命周期管理

JWTRefreshTokenBundle提供了灵活的令牌生命周期管理功能,主要通过以下配置实现:

设置令牌过期时间

默认令牌有效期为1个月(2592000秒),可在配置文件中自定义:

gesdinet_jwt_refresh_token:
    ttl: 604800  # 7天,单位:秒
启用令牌使用时刷新TTL

默认情况下,令牌使用时不会刷新过期时间,可通过以下配置启用:

gesdinet_jwt_refresh_token:
    ttl_update: true  # 使用令牌时自动延长有效期
启用单用途令牌

启用后,每个令牌只能使用一次,使用后会生成新的令牌:

gesdinet_jwt_refresh_token:
    single_use: true  # 启用单用途令牌

令牌提取方式配置

bundle支持多种令牌提取方式,默认从请求参数中提取,可通过配置自定义:

修改请求参数名称

默认参数名为refresh_token,可通过以下配置修改:

gesdinet_jwt_refresh_token:
    token_parameter_name: my_refresh_token  # 自定义参数名
使用Cookie存储令牌

可配置将令牌存储在HttpOnly cookie中,提高安全性:

gesdinet_jwt_refresh_token:
    cookie:
        enabled: true
        name: refresh_token
        path: /
        domain: ~
        secure: false  # 生产环境建议设为true
        http_only: true
        same_site: lax

实用命令行工具

清除过期令牌

定期清理过期令牌是保持系统性能的重要措施,可通过以下命令实现:

# 清除所有过期令牌
php bin/console gesdinet:jwt:clear

# 清除指定日期前过期的令牌
php bin/console gesdinet:jwt:clear 2023-01-01

# 批量清除,每次处理2500条记录
php bin/console gesdinet:jwt:clear --batch-size=2500

建议将此命令添加到crontab中定期执行:

# 每天凌晨2点执行
0 2 * * * php /path/to/project/bin/console gesdinet:jwt:clear >> /var/log/jwt-clear.log 2>&1

手动撤销令牌

当需要立即撤销某个令牌时,可使用以下命令:

php bin/console gesdinet:jwt:revoke TOKEN_VALUE

执行成功后会显示:Revoked refresh token "TOKEN_VALUE"

高级配置选项

自定义对象管理器

默认情况下,bundle会自动检测使用的对象管理器,也可手动指定:

gesdinet_jwt_refresh_token:
    # 使用ORM(默认)
    manager_type: orm
    # 或使用ODM
    # manager_type: mongodb
    # 或直接指定服务ID
    # object_manager: doctrine.orm.entity_manager

配置登出行为

可配置登出时自动使令牌失效并清除cookie:

gesdinet_jwt_refresh_token:
    logout:
        invalidate_token_on_logout: true
        delete_cookies:
            - refresh_token
        clear_site_data:
            - cookies

自定义令牌提取器

bundle支持自定义令牌提取逻辑,只需创建实现ExtractorInterface的类并添加标签:

<?php

namespace App\Request\Extractor;

use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\ExtractorInterface;
use Symfony\Component\HttpFoundation\Request;

class CustomExtractor implements ExtractorInterface
{
    public function extract(Request $request): ?string
    {
        // 自定义提取逻辑
        return $request->headers->get('X-Refresh-Token');
    }
}

在服务配置中添加标签:

services:
    App\Request\Extractor\CustomExtractor:
        tags:
            - { name: gesdinet_jwt_refresh_token.request_extractor, priority: 25 }

常见问题解决

令牌刷新失败

  1. 检查令牌是否过期
  2. 确认请求参数名称是否与配置一致
  3. 检查防火墙配置是否正确包含refresh_jwt
  4. 查看日志文件获取详细错误信息

数据库表未创建

  1. 确认实体类路径配置正确
  2. 确保已执行迁移命令
  3. 检查数据库连接是否正常

令牌存储在Cookie中但无法提取

  1. 确认http_only设置为true时只能通过服务器端访问
  2. 检查pathdomain配置是否与请求匹配
  3. 生产环境需设置secure: true并使用HTTPS

最佳实践总结

  1. 安全存储令牌:优先使用HttpOnly cookie存储令牌,避免JavaScript访问
  2. 合理设置TTL:根据应用安全需求设置令牌有效期,建议不超过30天
  3. 定期清理过期令牌:配置cron任务定期执行清除命令
  4. 启用单用途令牌:在敏感应用中启用single_use提高安全性
  5. 监控令牌使用:通过事件监听记录令牌使用情况,及时发现异常

通过本文的指南,你已经掌握了JWTRefreshTokenBundle的核心功能和配置方法。这个强大的工具能够帮助你构建安全、高效的JWT认证系统,为Symfony应用提供可靠的令牌刷新机制。无论是小型项目还是大型应用,都能从中受益。

【免费下载链接】JWTRefreshTokenBundle Implements a Refresh Token system over Json Web Tokens in Symfony 【免费下载链接】JWTRefreshTokenBundle 项目地址: https://gitcode.com/gh_mirrors/jw/JWTRefreshTokenBundle

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐