Info
Content

JWT (JSON Web Token) / JWS (JSON Web Signature) / JWE (JSON Web Encryption) / JWK (JSON Web Key) / JWA (JSON Web Algorithms)

JWS - https://datatracker.ietf.org/doc/html/rfc7515
JWE - https://datatracker.ietf.org/doc/html/rfc7516
JWK - https://datatracker.ietf.org/doc/html/rfc7517
JWA - https://datatracker.ietf.org/doc/html/rfc7518
JWT - https://datatracker.ietf.org/doc/html/rfc7519
JOSE Examples - https://datatracker.ietf.org/doc/html/rfc7520


Что-то что я узнал из статьи https://ru.wikipedia.org/wiki/JSON_Web_Token:

Буду разбираться на примере jwt-токена который мне сгенерила центрифуга

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjU0MTc5MDg3fQ.xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8

Токен состоит из трех частей: заголовок, пейлоад и подпись
Первые две представлены в виде json'а, закодированы в base64 и разделены точками

# echo 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjU0MTc5MDg3fQ.xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8' | sed 's/\./\n/g'
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJzdWIiOiIxIiwiZXhwIjoxNjU0MTc5MDg3fQ
xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8
# echo 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjU0MTc5MDg3fQ.xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8' | sed 's/\./\n/g' | head -n 2 | base64 -d - 2>/dev/null | jq
{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "1",
  "exp": 1654179087
}

Header:

  • alg - алгоритм подписи (если токен не подписанный то в значении ставится none)(это единственный обязательный ключ)
  • typ - тип токена (JWT)
  • cty - content type (JWT)

Payload:

  • iss - issuer - идентификатор стороны выдавшей токен
  • sub - subject - идентификатор стороны которой выдан токен (должен быть уникальным в рамках одного issuer)
  • aud - audience - список получателей токена
  • exp - expiration - время когда токен протухнет в unixtime
  • nbf - not before - время когда токен станет валидным
  • jti - jwt id - айди токена
  • iat - issued at - когда токен был выдан

Чтобы получить подпись, нужно взять первые две за'base64'ные части, закодировать их с использованием ключа и пропустить через base64
В моем случае ключ был такой:

# grep token_hmac_secret_key /etc/centrifugo/config.yaml
token_hmac_secret_key: "b06abc67-5044-415e-afff-843be892519c"

Пробуем сгенерить подпись:

# echo -n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjU0MTc5MDg3fQ' | openssl dgst -sha256 -hmac 'b06abc67-5044-415e-afff-843be892519c' -binary | openssl base64 -e -A
xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8=

Получается вот такая штука - xy8L4IQO1NsehSN2mkgSeLE2n6QxiTByZ7XHuWFmQh8=

Если выкинуть = то получается третья часть изначального токена

No Comments
Back to top