/
lex87
/
p08-echo-platform
Обзор
Документация
Войти
/
lex87
/
p08-echo-platform
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
apps/web/src/lib/auth.ts
63 строки
2 KB
Axentra
fix: make Secure cookie flag explicit via COOKIE_SECURE env var
30 июн 2026, 02:04
30 июн 2026, 02:04
d4c5c51
Код
Авторство
О чём код?
import { SignJWT, jwtVerify } from "jose"; import bcrypt from "bcryptjs"; import { cookies } from "next/headers"; const SECRET = new TextEncoder().encode( process.env["AUTH_SECRET"] ?? "dev-secret-change-in-prod" ); const COOKIE = "echo_session"; const EXPIRES_IN = 60 * 60 * 24 * 30; // 30 дней export type SessionPayload = { userId: string; role: "parent" | "doctor"; }; export async function hashPassword(password: string) { return bcrypt.hash(password, 12); } export async function verifyPassword(password: string, hash: string) { return bcrypt.compare(password, hash); } export async function signToken(payload: SessionPayload) { return new SignJWT(payload) .setProtectedHeader({ alg: "HS256" }) .setIssuedAt() .setExpirationTime(`${EXPIRES_IN}s`) .sign(SECRET); } export async function verifyToken(token: string): Promise<SessionPayload | null> { try { const { payload } = await jwtVerify(token, SECRET); return payload as unknown as SessionPayload; } catch { return null; } } export async function getSession(): Promise<SessionPayload | null> { const cookieStore = await cookies(); const token = cookieStore.get(COOKIE)?.value; if (!token) return null; return verifyToken(token); } export async function setSessionCookie(payload: SessionPayload) { const token = await signToken(payload); const cookieStore = await cookies(); cookieStore.set(COOKIE, token, { httpOnly: true, secure: process.env["COOKIE_SECURE"] === "true", sameSite: "lax", maxAge: EXPIRES_IN, path: "/", }); } export async function clearSessionCookie() { const cookieStore = await cookies(); cookieStore.delete(COOKIE); }