base commit
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
DATABASE_URL="file:./dev.db"
|
||||
ADMIN_EMAIL=admin@example.com
|
||||
# Default code for login
|
||||
DEFAULT_CODE=123456
|
||||
IS_DEFAULT_CODE_ENABLED=true
|
||||
PORT=3333
|
||||
# Токен для админ-запросов с фронта: Authorization: Bearer <значение>
|
||||
ADMIN_API_TOKEN=dev-secret-change-me
|
||||
# JWT для пользовательской авторизации (замени в проде)
|
||||
JWT_SECRET=dev-jwt-secret-change-me
|
||||
# Опционально: список origin для CORS через запятую (в dev можно не задавать)
|
||||
# CORS_ORIGIN=http://localhost:5173
|
||||
|
||||
# SMTP для отправки кода (если не задано — код логируется в консоль как [DEV])
|
||||
# SMTP_HOST=smtp.example.com
|
||||
# SMTP_PORT=587
|
||||
# SMTP_SECURE=false
|
||||
# SMTP_USER=user@example.com
|
||||
# SMTP_PASS=password
|
||||
# MAIL_FROM="Craftshop <no-reply@example.com>"
|
||||
@@ -3,6 +3,10 @@ PORT=3333
|
||||
ADMIN_EMAIL=admin@example.com
|
||||
JWT_SECRET=замените-на-секрет-jwt
|
||||
|
||||
# Только приватный стенд: фиксированный код входа (без письма), см. server/.dev_env и npm run dev/start:dev_env
|
||||
# IS_DEFAULT_CODE_ENABLED=true
|
||||
# DEFAULT_CODE=123456
|
||||
|
||||
# Разрешённый Origin фронта (через запятую при нескольких)
|
||||
# CORS_ORIGIN=http://127.0.0.1:5173
|
||||
|
||||
|
||||
+8
-2
@@ -4,11 +4,17 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "node --watch src/index.js",
|
||||
"dev": "node --env-file=.dev_env --watch src/index.js",
|
||||
"dev:classic": "node --watch src/index.js",
|
||||
"start": "node src/index.js",
|
||||
"start:dev_env": "node --env-file=.dev_env src/index.js",
|
||||
"db:migrate": "prisma migrate dev",
|
||||
"db:migrate:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js migrate deploy",
|
||||
"db:seed": "prisma db seed",
|
||||
"db:studio": "prisma studio"
|
||||
"db:seed:test": "node --env-file=.dev_env prisma/seed.js",
|
||||
"db:reset:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js migrate reset --force",
|
||||
"db:studio": "prisma studio",
|
||||
"db:studio:test": "node --env-file=.dev_env ./node_modules/prisma/build/index.js studio"
|
||||
},
|
||||
"prisma": {
|
||||
"seed": "node prisma/seed.js"
|
||||
|
||||
@@ -29,7 +29,22 @@ export async function issueEmailCode({ email, purpose, userId = null }) {
|
||||
await sendLoginCodeEmail({ to: email, code })
|
||||
}
|
||||
|
||||
function parseEnvBool(raw) {
|
||||
const v = String(raw ?? '').trim().toLowerCase()
|
||||
return v === 'true' || v === '1' || v === 'yes'
|
||||
}
|
||||
|
||||
/** Тестовые стенды: принять код из переменной DEFAULT_CODE без записи в БД. */
|
||||
export function isDefaultLoginCodeAccepted(codeInput) {
|
||||
if (!parseEnvBool(process.env.IS_DEFAULT_CODE_ENABLED)) return false
|
||||
const expected = String(process.env.DEFAULT_CODE ?? '').trim()
|
||||
if (!expected || expected.length < 4) return false
|
||||
return String(codeInput ?? '').trim() === expected
|
||||
}
|
||||
|
||||
export async function verifyEmailCode({ email, purpose, code, userId = null }) {
|
||||
if (purpose === 'login' && isDefaultLoginCodeAccepted(code)) return true
|
||||
|
||||
const now = new Date()
|
||||
const codeHash = sha256(`${email}:${purpose}:${code}:${userId ?? ''}`)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user