如何在 PHP 中生成 JWT
How to generate JWT in PHP
如何使用以下参数在 php 中生成 JWT 令牌
< PAYLOAD > 标签中的主题、发行者、到期时间和负载。
- Id可以是任意长度的任意随机数。
- 主题 是 TestService
- 发行人是Baguma Inc
- 到期时间 将从当前时间算起 30 秒(理想情况下)。
- Payload 是来自第三方的请求
- SigningKEY 是 fcvxcnfrhrtghkfghgwerikdf
- 签名算法将是HS512。
来自第三方的示例请求如下所示
<COMMAND><TYPE>REQUEST</TYPE><INTERFACE>TESTACCOUNT</INTERFACE> <REQUESTID>123</REQUESTID></COMMAND
借助 DZone Security 中的一篇文章,我通过执行以下操作成功生成了 JWT 令牌
- 定义 base64UrlEncode 函数,它将 + 替换为 -,/ 替换为 _,= 替换为 ''。
function base64UrlEncode($text)
{
return str_replace(
['+', '/', '='],
['-', '_', ''],
base64_encode($text)
);
}
- 使用 base64UrlEncode
对 headers 进行编码
$headers = [ "alg" => "HS512"];
$headers_encoded = $this->base64url_encode(json_encode($headers));
- 使用 Base64 对 Payload 进行编码URL 也进行编码
$issuedAt = time();
$payload = [
"id" =>$this->gen_uuid(), // .setId(UUID.randomUUID().toString())
"sub"=> "TestService", //Subject
"exp"=> $issuedAt+30,
"iss"=> "Baguma Inc", //issuer
"iat"=> $issuedAt, //issued at
"PAYLOAD"=> "<COMMAND><TYPE>REQUEST</TYPE><INTERFACE>TESTACCOUNT</INTERFACE> <REQUESTID>123</REQUESTID></COMMAND"];
$payload_encoded = $this->base64url_encode(json_encode($payload));
- 使用Key/secret构建签名
$key = "fcvxcnfrhrtghkfghgwerikdf"
$signature = hash_hmac('sha512',"$headers_encoded.$payload_encoded",$key,true);
- 构建并return令牌
$token = "$headers_encoded.$payload_encoded.$signature_encoded";
如何使用以下参数在 php 中生成 JWT 令牌 < PAYLOAD > 标签中的主题、发行者、到期时间和负载。
- Id可以是任意长度的任意随机数。
- 主题 是 TestService
- 发行人是Baguma Inc
- 到期时间 将从当前时间算起 30 秒(理想情况下)。
- Payload 是来自第三方的请求
- SigningKEY 是 fcvxcnfrhrtghkfghgwerikdf
- 签名算法将是HS512。
来自第三方的示例请求如下所示
<COMMAND><TYPE>REQUEST</TYPE><INTERFACE>TESTACCOUNT</INTERFACE> <REQUESTID>123</REQUESTID></COMMAND
借助 DZone Security 中的一篇文章,我通过执行以下操作成功生成了 JWT 令牌
- 定义 base64UrlEncode 函数,它将 + 替换为 -,/ 替换为 _,= 替换为 ''。
function base64UrlEncode($text)
{
return str_replace(
['+', '/', '='],
['-', '_', ''],
base64_encode($text)
);
}
- 使用 base64UrlEncode 对 headers 进行编码
$headers = [ "alg" => "HS512"];
$headers_encoded = $this->base64url_encode(json_encode($headers));
- 使用 Base64 对 Payload 进行编码URL 也进行编码
$issuedAt = time();
$payload = [
"id" =>$this->gen_uuid(), // .setId(UUID.randomUUID().toString())
"sub"=> "TestService", //Subject
"exp"=> $issuedAt+30,
"iss"=> "Baguma Inc", //issuer
"iat"=> $issuedAt, //issued at
"PAYLOAD"=> "<COMMAND><TYPE>REQUEST</TYPE><INTERFACE>TESTACCOUNT</INTERFACE> <REQUESTID>123</REQUESTID></COMMAND"];
$payload_encoded = $this->base64url_encode(json_encode($payload));
- 使用Key/secret构建签名
$key = "fcvxcnfrhrtghkfghgwerikdf"
$signature = hash_hmac('sha512',"$headers_encoded.$payload_encoded",$key,true);
- 构建并return令牌
$token = "$headers_encoded.$payload_encoded.$signature_encoded";