5分钟部署MixNet:从环境搭建到图像分类全流程实战指南
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 }
常见问题解决
令牌刷新失败
- 检查令牌是否过期
- 确认请求参数名称是否与配置一致
- 检查防火墙配置是否正确包含
refresh_jwt - 查看日志文件获取详细错误信息
数据库表未创建
- 确认实体类路径配置正确
- 确保已执行迁移命令
- 检查数据库连接是否正常
令牌存储在Cookie中但无法提取
- 确认
http_only设置为true时只能通过服务器端访问 - 检查
path和domain配置是否与请求匹配 - 生产环境需设置
secure: true并使用HTTPS
最佳实践总结
- 安全存储令牌:优先使用HttpOnly cookie存储令牌,避免JavaScript访问
- 合理设置TTL:根据应用安全需求设置令牌有效期,建议不超过30天
- 定期清理过期令牌:配置cron任务定期执行清除命令
- 启用单用途令牌:在敏感应用中启用
single_use提高安全性 - 监控令牌使用:通过事件监听记录令牌使用情况,及时发现异常
通过本文的指南,你已经掌握了JWTRefreshTokenBundle的核心功能和配置方法。这个强大的工具能够帮助你构建安全、高效的JWT认证系统,为Symfony应用提供可靠的令牌刷新机制。无论是小型项目还是大型应用,都能从中受益。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)