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.