Как сгенерировать JWT в PHP

#php #jwt-auth

#php #jwt-auth

Вопрос:

Как сгенерировать токен JWT в php, используя следующие параметры Subject, Issuer, время истечения срока действия и полезная нагрузка в теге < ПОЛЕЗНАЯ НАГРУЗКА>.

  • Id может быть любым случайным числом любой длины.
  • темаTestService
  • Эмитентом является Baguma Inc
  • Время истечения будет составлять 30 секунд с текущего времени (в идеале).
  • Полезная нагрузка — это запрос от третьей стороны
  • Ключ входа — fcvxcnfrhrtghkfghgwerikdf
  • Алгоритм подписи будет HS512.

Пример запроса от третьей стороны показан ниже

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

Комментарии:

1. Добро пожаловать в Stack Overflow. Пожалуйста, покажите, что вы пробовали до сих пор.

2. @Connell. О’Доннелл, я наконец нашел решение. Я поделился этим в разделе ответов. Надеюсь, это будет полезно другим разработчикам

Ответ №1:

С помощью статьи из DZone Security мне удалось сгенерировать токен JWT, выполнив следующие действия

  1. Определите функцию base64UrlEncode, которая заменяет на -, / на _ и = на «.
 function base64UrlEncode($text)
{
    return str_replace(
        [' ', '/', '='],
        ['-', '_', ''],
        base64_encode($text)
    );
}

 
  1. Кодируйте заголовки с помощью base64UrlEncode
 $headers = [ "alg" => "HS512"];

$headers_encoded = $this->base64url_encode(json_encode($headers));
 
  1. Кодируйте полезную нагрузку, используя кодирование URL-адреса Base64
 $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 = "fcvxcnfrhrtghkfghgwerikdf"  
$signature = hash_hmac('sha512',"$headers_encoded.$payload_encoded",$key,true);
 
  1. Создайте и верните токен
 $token = "$headers_encoded.$payload_encoded.$signature_encoded";