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