Библиотека jose полностью поддерживает современный Node.js через
нативные криптографические API и ESM-модули. Начиная с Node.js 16+ и
особенно в версиях 18+, где стабилизирован Web Crypto API
(globalThis.crypto), библиотека работает без дополнительных
полифиллов.
Ключевая особенность интеграции — опора на стандарт Web
Crypto API, а не на устаревший crypto из Node.js в
синхронном стиле.
Основные моменты использования:
import вместо
require)Uint8Array для всех криптографических
операцийcrypto.subtleПример базового использования:
import { SignJWT, jwtVerify } from 'jose'
const secret = new TextEncoder().encode('super-secret-key')
const jwt = await new SignJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(secret)
const { payload } = await jwtVerify(jwt, secret)
В Node.js важно учитывать:
crypto.webcrypto:import { webcrypto } from 'node:crypto'
globalThis.crypto = webcrypto
(async () => {
const { jwtVerify } = await import('jose')
})()
Node.js обеспечивает наиболее полную поддержку алгоритмов (HS256, RS256, ES256, EdDSA), включая работу с ключами в формате PEM и JWK.
Deno изначально ориентирован на Web API-совместимость, поэтому jose интегрируется с ним практически без адаптаций.
Особенности:
Пример импорта:
import { createRemoteJWKSet, jwtVerify } from 'https://deno.land/x/jose/index.ts'
Работа с JWT:
const JWKS = createRemoteJWKSet(
new URL('https://example.com/.well-known/jwks.json')
)
const { payload } = await jwtVerify(token, JWKS)
Важные особенности Deno:
cryptocrypto.subtledeno run --allow-net app.ts
Deno является одной из самых “чистых” сред для jose, так как отсутствуют расхождения между Web Crypto API и runtime.
В браузерной среде jose использует нативный Web Crypto API, доступный
через window.crypto.subtle.
Поддерживаются современные браузеры:
Ключевая особенность — работа строго в асинхронном режиме, так как криптографические операции основаны на Promise API.
Пример:
import { SignJWT, jwtVerify } from 'jose'
const secret = new TextEncoder().encode('browser-secret')
const token = await new SignJWT({ user: 'alice' })
.setProtectedHeader({ alg: 'HS256' })
.sign(secret)
const { payload } = await jwtVerify(token, secret)
Ограничения браузера:
Uint8ArrayТипичный подход в браузере:
Пример загрузки JWKS:
import { createRemoteJWKSet, jwtVerify } from 'jose'
const JWKS = createRemoteJWKSet(
new URL('https://auth.example.com/.well-known/jwks.json')
)
const { payload } = await jwtVerify(token, JWKS)
Браузерная среда делает jose особенно удобным для SPA и фронтенд-аутентификации.
Edge Runtime (например, Vercel Edge, Cloudflare Workers, Deno Deploy-подобные среды) представляет собой ограниченную, но высокопроизводительную среду, основанную на Web API.
Jose изначально хорошо подходит для edge-окружений благодаря отсутствию зависимости от Node.js встроенных модулей.
Особенности:
fs, net, tlsПример для edge-функции:
import { jwtVerify } from 'jose'
export default async function handler(req) {
const token = req.headers.get('authorization')?.replace('Bearer ', '')
const secret = new TextEncoder().encode('edge-secret')
const { payload } = await jwtVerify(token, secret)
return new Response(JSON.stringify(payload), {
headers: { 'content-type': 'application/json' }
})
}
Использование JWKS на edge:
import { createRemoteJWKSet, jwtVerify } from 'jose'
const JWKS = createRemoteJWKSet(
new URL('https://auth.example.com/jwks.json')
)
export default async function handler(req) {
const token = req.headers.get('authorization')?.slice(7)
const { payload } = await jwtVerify(token, JWKS)
return new Response(payload.sub)
}
Ключевые ограничения Edge Runtime:
Преимущество jose в этом контексте — минимальный overhead и отсутствие необходимости в нативных бинарных зависимостях.
Внутренняя модель работы jose унифицирована, но поведение зависит от доступного криптографического backend:
Общий контракт библиотеки остаётся одинаковым:
CryptoKey или
Uint8ArrayТакая унификация позволяет переносить один и тот же код между backend, frontend и edge-средами без изменения логики криптографии.