ID Token представляет собой JSON Web Token, используемый в протоколе OpenID Connect для передачи информации об аутентифицированном пользователе. Он всегда подписан, а в некоторых случаях может быть дополнительно зашифрован. В экосистеме JavaScript для работы с такими токенами широко применяется библиотека jose, реализующая стандарты JOSE (JSON Object Signing and Encryption).
ID Token отличается от Access Token тем, что его основная задача — идентификация пользователя, а не авторизация доступа к ресурсам. Его структура строго регламентирована спецификацией JWT (RFC 7519) и OpenID Connect Core.
ID Token всегда представляет собой JWT, состоящий из трёх частей:
header.payload.signature
Каждая часть закодирована в Base64URL.
Содержит метаданные о токене и алгоритме подписи:
{
"alg": "RS256",
"typ": "JWT",
"kid": "abc123"
}
Ключевые поля:
Содержит утверждения (claims), описывающие пользователя и контекст аутентификации:
{
"iss": "https://auth.example.com",
"sub": "248289761001",
"aud": "client_id_123",
"exp": 1714750000,
"iat": 1714746400,
"nonce": "n-0S6_WzA2Mj",
"email": "user@example.com",
"email_verified": true
}
Основные стандартные claims:
Дополнительные claims могут включать:
namepreferred_usernamepictureauth_timeПодпись формируется на основе header и payload с использованием приватного ключа провайдера идентификации. Она гарантирует:
JOSE (JSON Object Signing and Encryption) — семейство стандартов:
Библиотека jose реализует эти стандарты в JavaScript и предоставляет инструменты для:
Верификация ID Token включает несколько обязательных этапов:
Токен должен быть проверен с использованием публичного ключа, полученного из JWKS endpoint провайдера.
Значение iss должно строго совпадать с ожидаемым URL
провайдера.
Поле aud должно содержать идентификатор клиентского
приложения.
exp должен быть больше текущего времениiat не должен быть в будущемИспользуется для предотвращения повторного использования токена.
import { createRemoteJWKSet, jwtVerify } from 'jose'
const JWKS = createRemoteJWKSet(
new URL('https://auth.example.com/.well-known/jwks.json')
)
JWKS содержит публичные ключи, соответствующие приватным ключам, которыми подписываются токены.
const { payload, protectedHeader } = await jwtVerify(token, JWKS, {
issuer: 'https://auth.example.com',
audience: 'client_id_123'
})
После успешной проверки:
payload содержит claims ID TokenprotectedHeader содержит данные заголовкаkid из headerkidАлгоритмы:
Проверка выполняется автоматически через jose:
После успешной криптографической проверки выполняется логическая валидация:
if (payload.iss !== expectedIssuer) throw new Error('Invalid issuer')
if (!payload.aud.includes(expectedAudience)) throw new Error('Invalid audience')
if (payload.exp < Math.floor(Date.now() / 1000)) throw new Error('Token expired')
ID Token не предназначен для авторизации API-запросов. Его использование ограничивается:
Ключевые требования безопасности:
Провайдеры OpenID Connect регулярно обновляют ключи подписи. JWKS endpoint позволяет:
Библиотека jose кэширует JWKS и обновляет его при необходимости.
Часто возникает при неправильной конфигурации окружений (dev/prod).
Появляется, если токен выдан другому клиенту.
Возникает при длительном хранении ID Token.
Создаёт уязвимость к replay-атакам.
После успешной верификации payload может использоваться для:
sub)Структура sub остаётся стабильной и используется как
основной ключ идентификации.
Библиотека обеспечивает:
Работа с JWT через jose сводится к одной операции —
jwtVerify, которая объединяет: