php - 生成 JWT 的正确方法
问题描述
我是 JWT 的新手,所以我使用了一篇文章告诉我生成这样的 JWT:
// Create token header as a JSON string
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
// Create token payload as a JSON string
$payload = json_encode(['userId' => $userId, 'exp' => time()+60*60*24*30]);
// Encode Header to Base64Url String
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
// Encode Payload to Base64Url String
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
// Create Signature Hash
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, 'mySecret', true);
// Encode Signature to Base64Url String
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
// Create JWT
$jwt = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
我想知道这str_replace
是否有必要,因为我认为它会干扰 JWT 的验证?
谢谢。
解决方案
这是正确且必要的,除非你可以直接base64url编码,因为它将编码从base64更改为base64url,这是JWT使用的编码格式。
Base64和 Base64Url 编码几乎相同,只有 2 个字符,'+' 和 '/' 需要替换为 '-' 和 '_' 以及从字符串中删除的填充。str_replace 正是这样做的。
签名的内容不受此影响,它只是与验证相关的解码值。
关于“正确方式”的一般性问题:从技术上讲,您的方式是正确的并且有利于教育目的。很高兴知道事情是如何运作的。对于任何现实生活中的应用程序,都有许多库可以为您完成这项工作。
推荐阅读
- javascript - lint-staged 失败,并显示“找不到 npm。请尝试 `npm install npm`。”
- scikit-learn - ValueError:分类报告的未知标签类型
- node.js - 使用 MongoDB 和 Node.js 查询不返回任何结果
- xamarin - 将 OnAppearing 传递给 Xamarin Forms MVVM 中的 ViewModel?
- flutter-layout - Container within a Container size
- latex - 使用外语的乳胶导致引用错误
- javascript - Ionic 3:单击按钮时增加项目数
- jenkins - Jenkins Pipeline - 重新启动时如何获取内部版本号?
- python - 在我的网络抓取中,一些 div 没有出现
- django - Django 无法显示保存在数据库中的图片