Skip to main content

Пишете аутентификацию сами?

// auth.ts - DIY Authentication (good luck)
import bcrypt from 'bcrypt'
import jwt from 'jsonwebtoken'
import { randomBytes } from 'crypto'

const SALT_ROUNDS = 12
const JWT_SECRET = process.env.JWT_SECRET!
const CSRF_SECRET = process.env.CSRF_SECRET!

async function hashPassword(password: string) {
  return bcrypt.hash(password, SALT_ROUNDS)
}

async function verifyPassword(password: string, hash: string) {
  return bcrypt.compare(password, hash)
}

function generateSessionToken() {
  return randomBytes(32).toString('hex')
}

function generateCSRFToken(sessionId: string) {
  return jwt.sign({ sessionId }, CSRF_SECRET, { expiresIn: '1h' })
}

// Rate limiting - you'll need Redis for this
const rateLimiter = new Map<string, number[]>()

function checkRateLimit(ip: string): boolean {
  const now = Date.now()
  const windowMs = 15 * 60 * 1000
  const maxRequests = 100
  // ... this gets complicated fast
  const requests = rateLimiter.get(ip) || []
  const filtered = requests.filter(t => t > now - windowMs)
  if (filtered.length >= maxRequests) return false
  filtered.push(now)
  rateLimiter.set(ip, filtered)
  return true
}

// Don't forget: email verification, password reset,
// MFA, OAuth, session invalidation, account lockout,
// audit logging, webhook events, RBAC...
// Are you sure you want to build all this?
// auth.ts - DIY Authentication (good luck)
import bcrypt from 'bcrypt'
import jwt from 'jsonwebtoken'
import { randomBytes } from 'crypto'

const SALT_ROUNDS = 12
const JWT_SECRET = process.env.JWT_SECRET!
const CSRF_SECRET = process.env.CSRF_SECRET!

async function hashPassword(password: string) {
  return bcrypt.hash(password, SALT_ROUNDS)
}

async function verifyPassword(password: string, hash: string) {
  return bcrypt.compare(password, hash)
}

function generateSessionToken() {
  return randomBytes(32).toString('hex')
}

function generateCSRFToken(sessionId: string) {
  return jwt.sign({ sessionId }, CSRF_SECRET, { expiresIn: '1h' })
}

// Rate limiting - you'll need Redis for this
const rateLimiter = new Map<string, number[]>()

function checkRateLimit(ip: string): boolean {
  const now = Date.now()
  const windowMs = 15 * 60 * 1000
  const maxRequests = 100
  // ... this gets complicated fast
  const requests = rateLimiter.get(ip) || []
  const filtered = requests.filter(t => t > now - windowMs)
  if (filtered.length >= maxRequests) return false
  filtered.push(now)
  rateLimiter.set(ip, filtered)
  return true
}

// Don't forget: email verification, password reset,
// MFA, OAuth, session invalidation, account lockout,
// audit logging, webhook events, RBAC...
// Are you sure you want to build all this?
Хеширование и соление паролей
Управление сессионными токенами
Защита от CSRF
Ограничение частоты запросов
Обработка OAuth-потоков
Верификация email
Сброс пароля
Реализация MFA
Логика блокировки аккаунта
Инвалидация сессий

Или просто используйте Blindgate.

middleware.ts
import { withAuth } from '@blindgate/next'export default withAuth({  publicRoutes: ['/login', '/signup']})
Всё вышеперечисленное — уже готово.

От нуля до продакшена

Общее время: менее 10 минут

0 мин

Установка

Добавьте SDK в ваш проект

$ bun add @blindgate/next
2 мин

Настройка

Добавьте middleware аутентификации

middleware.ts
import { withAuth } from '@blindgate/next'export default withAuth({  publicRoutes: ['/login', '/signup']})
5 мин

Защита

Получите доступ к данным пользователя на страницах

app/dashboard/page.tsx
import { currentUser } from '@blindgate/next/server'export default async function Dashboard() {  const user = await currentUser()  return <h1>Welcome, {user.name}</h1>}
5 мин

Управление

Ваша панель управления готова

blindgate.dev/dashboard
Blindgate
VP
Обзор
Пользователи
Организации
Приглашения
Настройки

Пользователи

Управление пользователями в этом окружении

Имя
AJ
Alice Johnson
alice@example.com
BS
Bob Smith
bob@example.com
CW
Carol White
carol@example.com
DB
David Brown
david@example.com
Показано 1 — 4 из 4
Строк на странице 10Страница 1 из 1
10 мин

Деплой

Разверните в продакшен

$ git push origin main
Продакшен: Запущено

Своими руками vs Blindgate

Зачем тратить месяцы, если можно запустить за минуты?

ФункцияСвоими рукамиBlindgate
Аутентификация~2 дня
Включено
Управление сессиями~3 дня
Включено
Интеграция OAuth~1 неделя
Включено
Многофакторная аутентификация~1 неделя
Включено
Сброс пароля~2 дня
Включено
Верификация email~2 дня
Включено
Ограничение частоты запросов~3 дня
Включено
Роли и разрешения~2 недели
Включено
Журнал аудита~1 неделя
Включено
Вебхуки~3 дня
Включено
~3 месяца
Своими руками
~10 минут
С Blindgate

Панель управления, которую не пришлось создавать

blindgate.dev/dashboard
Blindgate
VP
Обзор
Пользователи
Организации
Приглашения
Настройки

Пользователи

Управление пользователями в этом окружении

Имя
AJ
Alice Johnson
alice@example.com
BS
Bob Smith
bob@example.com
CW
Carol White
carol@example.com
DB
David Brown
david@example.com
Показано 1 — 4 из 4
Строк на странице 10Страница 1 из 1

И это безопасно

Каждый запрос проходит через несколько уровней защиты

Запрос
Входящий запрос аутентификации
Rate Limiting
Интеллектуальное ограничение частоты и фильтрация IP
Аутентификация
Безопасная проверка учётных данных
Авторизация
Проверка ролей и разрешений
Ответ
Выдача безопасного сессионного токена

Работает с тем, что вы уже используете

Три пакета. Любой фреймворк. Готово к продакшену.

app.tsx
import { BlindgateProvider, useAuth, SignIn } from '@blindgate/react'function App() {  return (    <BlindgateProvider publishableKey="pk_live_...">      <Dashboard />    </BlindgateProvider>  )}function Dashboard() {  const { user, signOut } = useAuth()  if (!user) return <SignIn />  return (    <div>      <h1>Welcome, {user.name}</h1>      <button type="button" onClick={signOut}>Sign Out</button>    </div>  )}

API на хуках с BlindgateProvider контекстом для React-приложений

И это не ударит по бюджету

Двигайте ползунок, чтобы увидеть цены для вашего масштаба

Активных пользователей в месяц1 тыс.
1 тыс.2 тыс.5 тыс.10 тыс.25 тыс.50 тыс.100 тыс.

Бесплатно

Рекомендуемый
$0/мес
  • До 1 000 MAU
  • Аутентификация по email и паролю
  • Поддержка сообщества
  • 1 проект

Pro

$49/мес
  • До 10 000 MAU
  • Все методы аутентификации
  • Приоритетная поддержка
  • Неограниченно проектов
  • Пользовательские домены

Enterprise

Индивидуально
  • Неограниченно MAU
  • SSO и SAML
  • Выделенная поддержка
  • Гарантия SLA
  • Пользовательские интеграции
  • On-premise размещение

Хватит писать аутентификацию. Пора создавать продукт.

Каждый час на аутентификацию — это час, не потраченный на ваш продукт.