advanced
JWT, OAuth, OpenID Connect и SSO
Отделяйте token formats от auth protocols, проверяйте issuer/audience/expiry/signature и интегрируйте OAuth/OIDC/SSO без слепого доверия client claims.
JWT — формат подписанного (или зашифрованного) токена, не протокол auth сам по себе. OAuth 2.0 делегирует authorization; OpenID Connect добавляет identity (ID token, UserInfo). SSO — центральный IdP, один вход в несколько apps.
import { createRemoteJWKSet, jwtVerify } from 'jose';
const JWKS = createRemoteJWKSet(new URL('https://idp.example.com/.well-known/jwks.json'));
async function authenticateBearer(req) {
const token = req.headers.authorization?.replace(/^Bearer /, '');
const { payload } = await jwtVerify(token, JWKS, {
issuer: 'https://idp.example.com',
audience: 'api.example.com',
});
return payload;
}
Всегда проверяйте `iss`, `aud`, `exp` и подпись — не доверяйте claims, декодированным на клиенте. Короткоживущие access tokens + refresh в безопасном хранилище. Opaque tokens — introspection у authorization server.
На интервью: OAuth flows (authorization code + PKCE для SPA); access vs ID tokens; почему logout JWT сложен без blocklist или короткого TTL.
Типовые ошибки: `alg: none`; refresh в localStorage; путаница OAuth scopes и app permissions.
Чеклист:
- Проверка signature, issuer, audience, expiry.
- Authorization code + PKCE для public clients.
- Короткий access; безопасный refresh.
- Внешняя identity отдельно от internal authorization.