maaarghk / magento-jwt-refresh-service
添加一个API服务用于刷新Magento JWTs
1.0.0
2023-07-14 16:51 UTC
Requires
- magento/module-jwt-framework-adapter: ^100.4.2
- magento/module-jwt-user-token: ^100.4.1
README
添加一个API端点 POST /V1/integration/admin/token/refresh 用于从授权头刷新JWT。目前不支持客户令牌,但欢迎PR。
例如:
$ curl --json '{"username": "username", "password": "password"}' http://mysite.docker/rest/V1/integration/admin/token/
"eyJraWQiOiIxIiwiYWxnIjoiSFMyNTYifQ.eyJ1aWQiOjY4LCJ1dHlwaWQiOjIsImlhdCI6MTY4OTM1MDYxOCwiZXhwIjoxNjg5MzU0MjE4fQ.Y2J6BVDFzBjSWP8MtfEievFplU21YyG40h56CLDIo9c"
$ curl -XPOST --data "" -H "Authorization: Bearer eyJraWQiO<etc>" http://mysite.docker/rest/V1/integration/admin/token/refresh/
"eyJraWQiOiIxIiwiYWxnIjoiSFMyNTYifQ.eyJ1aWQiOjY4LCJ1dHlwaWQiOjIsImlhdCI6MTY4OTM1MDYxOCwiZXhwIjoxNjg5MzU0MjQ3fQ.7TM1LlZ-1ONAQroFO_HVJWCqdl-ig8CCV1Sl-D3eCoA"
JWT不应该是短生命周期的,并且只能使用刷新令牌进行扩展吗?
我想是的。一个典型的建议是刷新令牌应该有效期为七天,因此我将接受一个PR,该PR验证提供的JWT不是在7天前签发的。这个模块会努力确保刷新令牌不会更新问题日期,因此强制最大年龄应该不会太难。
(您可以使用上面的curl示例中的base64 -d来验证两个令牌的iat声明相同,但exp声明被扩展了。)
BYOT
如果您不是使用Bearer令牌,但正在使用JWT,您可以提供以下这样的刷新令牌
class Whatever { public function __construct( private \FTS\JwtRefreshService\Api\JwtRefreshServiceInterfaceFactory $jwtRefreshServiceFactory ) {} public function refreshToken(string $token) { $jwtRefreshService = $this->jwtRefreshServiceFactory->create([ 'token' => $token ]); return $jwtRefreshService->refreshAdminToken(); } }
为什么这么复杂?
magento-jwt-refresh-service/src/Model/Api/JwtRefreshService.php
第48至58行在 7827d6b
| // 我们不希望新令牌的“签发时间”与原始令牌相比发生变化 | |
| // 因为新令牌应该 | |
| // 受初始登录时间的撤销影响。 | |
| // | |
| // 尽管UserTokenParameters类接受一个“签发”参数, | |
| // 我们不能简单地使用它,因为它总是用来计算 | |
| // 过期日期(即如果我们将其设置为原始签发时间,那么 | |
| // 令牌就没有其过期时间刷新。) | |
| // | |
| // 因此,我们使用JWT管理器类的插件来重写它 | |
| // 接收到的JWT有效载荷。 |
帮助
我不太可能满足任何功能请求,因此请提供与您拥有的任何请求一起的合并请求。
欢迎带有测试的MRs - 应该足够简单,可以验证返回的令牌具有相同的声明和用户上下文,并且刷新的令牌仍然有效。