Библиотека jose реализует современные стандарты работы с
JSON Web Token (JWT), JSON Web Signature (JWS) и JSON Web Encryption
(JWE). Она ориентирована на строгую поддержку спецификаций JOSE и
активно используется в серверных и клиентских JavaScript-приложениях,
где требуется криптографическая подпись, верификация и шифрование
данных.
Перед установкой необходимо учитывать базовые требования к среде выполнения:
async/await)Библиотека не поддерживает устаревшие версии Node.js без ESM и современных криптографических API.
npm install jose
yarn add jose
pnpm add jose
После установки пакет становится доступен как модуль ES:
import { jwtVerify, SignJWT } from 'jose'
Библиотека jose распространяется исключительно как
ESM-модуль. Это означает:
import вместо requirepackage.jsonПример минимальной конфигурации:
{
"type": "module"
}
Без этого параметра Node.js может не распознать ESM-синтаксис.
npm init -y
npm install jose
В package.json необходимо указать:
{
"type": "module"
}
После этого можно использовать import в любом
.js файле.
Создаётся файл index.js:
import { generateSecret } from 'jose'
console.log('jose установлен корректно')
Запуск:
node index.js
Если ошибок нет — окружение настроено правильно.
Библиотека полностью поддерживает TypeScript без необходимости дополнительных типов.
npm install typescript --save-dev
Инициализация конфигурации:
npx tsc --init
tsconfig.json{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true
}
}
import { SignJWT } from 'jose'
const secret = new TextEncoder().encode('secret-key')
const token = await new SignJWT({ userId: 123 })
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(secret)
console.log(token)
Библиотека активно использует Web Crypto API, который встроен в Node.js:
crypto.subtlecrypto.randomUUIDcrypto.getRandomValuesЕсли среда не поддерживает Web Crypto API (например, старые версии Node.js или специфические окружения), потребуется полифилл.
Пример проверки доступности:
if (!globalThis.crypto?.subtle) {
throw new Error('Web Crypto API недоступен')
}
Библиотека может использоваться в браузере без дополнительных зависимостей.
Однако важно учитывать:
crypto.subtleПример импорта:
import { jwtVerify } from 'jose'
Vite корректно работает с jose без дополнительных
плагинов.
Пример использования:
import { decodeJwt } from 'jose'
const token = 'eyJhbGciOi...'
const payload = decodeJwt(token)
console.log(payload)
Для Webpack важно убедиться, что используется ESM-сборка.
export default {
experiments: {
outputModule: true
},
output: {
module: true
}
}
Также необходимо:
type: module в package.jsonПри использовании jose часто требуется хранить
секреты:
.envJWT_SECRET=super-secret-key
Загрузка:
import 'dotenv/config'
const secret = new TextEncoder().encode(process.env.JWT_SECRET)
Библиотека предоставляет инструменты для создания ключей:
import { generateSecret } from 'jose'
const secret = await generateSecret('HS256')
console.log(secret)
Для асимметричных алгоритмов:
import { generateKeyPair } from 'jose'
const { publicKey, privateKey } = await generateKeyPair('RS256')
Ошибка:
Error [ERR_REQUIRE_ESM]: require() of ES Module
Решение:
require на import"type": "module"Ошибка:
crypto.subtle is undefined
Решение:
Частая проблема — использование строк вместо
Uint8Array:
const secret = new TextEncoder().encode('key')
Рекомендуемая структура:
project/
├── src/
│ ├── auth/
│ │ ├── jwt.js
│ │ ├── keys.js
│ ├── utils/
│ ├── app.js
├── package.json
├── .env
import { jwtVerify, SignJWT } from 'jose'
const secret = new TextEncoder().encode(process.env.JWT_SECRET)
export async function createToken(payload) {
return await new SignJWT(payload)
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('1h')
.sign(secret)
}
export async function verifyToken(token) {
const { payload } = await jwtVerify(token, secret)
return payload
}
В пайплайнах (GitHub Actions, GitLab CI, Jenkins) важно:
jose в lock-файлахКорректно настроенное окружение характеризуется следующими признаками:
crypto.subtleSignJWT и
jwtVerifyjose