生成 JWT 的正确方法
Correct way to generate JWTs
我是 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,也就是encoding format that JWT uses.
Base64和Base64Url编码几乎一样,只有'+'和'/'这2个字符需要用'-'和'_'替换,以及删除的padding字符串。 str_replace 正是这样做的。
签名的内容不受此影响,与验证相关的只是解码后的值。
关于“正确方法”的一般性问题:从技术上讲,您的方法是正确的,并且适合教育目的。很高兴知道事情是如何运作的。对于任何现实生活中的应用程序,有许多 libraries 可以为您完成这项工作。
我是 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,也就是encoding format that JWT uses.
Base64和Base64Url编码几乎一样,只有'+'和'/'这2个字符需要用'-'和'_'替换,以及删除的padding字符串。 str_replace 正是这样做的。
签名的内容不受此影响,与验证相关的只是解码后的值。
关于“正确方法”的一般性问题:从技术上讲,您的方法是正确的,并且适合教育目的。很高兴知道事情是如何运作的。对于任何现实生活中的应用程序,有许多 libraries 可以为您完成这项工作。