如何在 PHP 中生成 JWT

How to generate JWT in PHP

如何使用以下参数在 php 中生成 JWT 令牌 < PAYLOAD > 标签中的主题、发行者、到期时间和负载。

来自第三方的示例请求如下所示

<COMMAND><TYPE>REQUEST</TYPE><INTERFACE>TESTACCOUNT</INTERFACE> <REQUESTID>123</REQUESTID></COMMAND

借助 DZone Security 中的一篇文章,我通过执行以下操作成功生成了 JWT 令牌

  1. 定义 base64UrlEncode 函数,它将 + 替换为 -,/ 替换为 _,= 替换为 ''。
function base64UrlEncode($text)
{
    return str_replace(
        ['+', '/', '='],
        ['-', '_', ''],
        base64_encode($text)
    );
}

  1. 使用 base64UrlEncode
  2. 对 headers 进行编码
$headers = [ "alg" => "HS512"];

$headers_encoded = $this->base64url_encode(json_encode($headers));
  1. 使用 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));
  1. 使用Key/secret构建签名
$key = "fcvxcnfrhrtghkfghgwerikdf"  
$signature = hash_hmac('sha512',"$headers_encoded.$payload_encoded",$key,true);
  1. 构建并return令牌
$token = "$headers_encoded.$payload_encoded.$signature_encoded";