Asosiy kontentga o‘tish
Innovialabs

Next.js’da avtorizatsiya: Auth.js, Clerk yoki o‘z yechimingiz

Amaliyot4 daq

Qisqacha

Clerk eng tez ishga tushadi, lekin foydalanuvchi ma’lumotlarini uchinchi tomon xizmatida saqlaydi va o‘sish bilan qimmatlashadi; Auth.js bepul va foydalanuvchilarni sizning bazangizda saqlaydi; o‘z yechimingiz to‘liq nazorat beradi. Har qanday holatda sessiyani faqat middleware’da emas, har bir server komponent va server action ichida tekshiring.

Qisqacha javob

  • Clerk — tayyor kirish ekranlari, foydalanuvchilar va tashkilotlarni boshqarishga ega bulutli xizmat. Eng tez ishga tushadi; o‘sish bilan faol foydalanuvchilar uchun to‘laysiz, ma’lumotlar esa provayder serverlarida saqlanadi.
  • Auth.js (avvalgi NextAuth) — open-source kutubxona. Bepul, foydalanuvchilar adapterlar orqali sizning bazangizda saqlanadi, ko‘plab OAuth provayderlar qutidan tayyor. Interfeysni o‘zingiz qilasiz.
  • O‘z yechimingiz — o‘z sessiyalaringiz, parollarni xeshlash va OTP. Maksimal nazorat va vendorga bog‘liqlik yo‘q, lekin xavfsizlik uchun butun javobgarlik sizda.

Taqqoslash

MezonClerkAuth.jsO‘z yechimingiz
NarxBepul tarif, keyin faol foydalanuvchilar uchun to‘lovBepul, faqat hosting uchun to‘laysizIshlab chiqish va qo‘llab-quvvatlash vaqti
Ishga tushirish tezligiEng tezO‘rtachaEng uzoq
NazoratProvayder imkoniyatlari doirasidaYuqoriTo‘liq
Foydalanuvchi ma’lumotlari qayerdaProvayder infratuzilmasiSizning bazangizSizning bazangiz
InterfeysTayyor komponentlarO‘zingiznikiO‘zingizniki

O‘zbekistonda ma’lumot saqlanadigan joy muhim. Shaxsga doir ma’lumotlar to‘g‘risidagi qonun O‘zbekiston fuqarolarining shaxsiy ma’lumotlarini mamlakatda joylashgan serverlarda saqlashni talab qiladi. Agar bu loyihangizga tegishli bo‘lsa, xorijiy bulutli xizmat mos kelmasligi mumkin; mahalliy bazali Auth.js yoki o‘z yechimingiz ishonchliroq. Talablarni o‘z holatingiz uchun yurist bilan aniqlashtiring.

Marshrutlarni himoyalash: uch daraja

Middleware mehmonlarni yo‘naltirish uchun qulay, lekin u yagona tekshiruv bo‘lmasligi kerak. Uni birinchi filtr deb hisoblang, kirish huquqini esa ma’lumotlarga yaqin joyda tekshiring.

  1. Middleware (yoki Next.js’ning yangi versiyalarida proxy) — avtorizatsiyadan o‘tmaganlarni /dashboard dan /login ga yo‘naltiradi. U tez bo‘lishi kerak: sessiya cookie’si borligini tekshirish, og‘ir hech narsa yo‘q.
  2. Server komponentlar — ma’lumot yuklashdan oldin sessiyani tekshiradi.
  3. Server actions va route handlers — har bir amal ichida sessiya va huquqlarni tekshiradi.
// app/dashboard/page.tsx
import { auth } from '@/auth'
import { redirect } from 'next/navigation'

export default async function Dashboard() {
  const session = await auth()
  if (!session?.user) redirect('/login')
  const projects = await getProjects(session.user.id)
  // render projects
}

Server actions — bu ochiq endpointlar

Server action’ni interfeysda tugma yashirilgan bo‘lsa ham to‘g‘ridan-to‘g‘ri POST so‘rov bilan chaqirish mumkin. Doim autentifikatsiya va egalik huquqini tekshiring:

'use server'
import { auth } from '@/auth'

export async function deleteProject(id: string) {
  const session = await auth()
  if (!session?.user) throw new Error('Unauthorized')
  const project = await db.project.findUnique({ where: { id } })
  if (project?.ownerId !== session.user.id) throw new Error('Forbidden')
  await db.project.delete({ where: { id } })
}

Yaxshi pattern — ma’lumotlarga kirish qatlami: getProjects kabi funksiyalar sessiyani o‘zi tekshiradi, shunda hech bir sahifa buni unutolmaydi.

Telefon raqami va SMS orqali kirish

O‘zbekistonda ko‘p foydalanuvchilar email emas, telefon raqamini afzal ko‘radi. Odatiy ssenariy:

  1. Raqamni yagona formatga keltirish, masalan +998XXXXXXXXX.
  2. Qisqa tasodifiy kod yaratish va faqat uning xeshini amal qilish muddati bilan saqlash.
  3. Kodni mahalliy SMS-shlyuz orqali yuborish.
  4. Tekshirishda xeshlarni solishtirish, urinishlar sonini cheklash va sessiya yaratish.

Majburiy: raqam va IP bo‘yicha rate limiting (SMS pul turadi va suiiste’mollarni jalb qiladi), kodning qisqa amal qilish muddati va bir necha noto‘g‘ri urinishdan keyin bloklash. Auth.js’da bu ssenariy Credentials provayderi orqali amalga oshiriladi; Clerk telefon orqali kirishni qo‘llab-quvvatlaydi, lekin mamlakatingiz uchun tariflar va yetkazib berishni tekshiring.

Telegram orqali kirish

Telegram mahalliy auditoriya uchun tabiiy kirish usuli. Ikkita keng tarqalgan variant:

  • Saytdagi Telegram Login Widget: Telegram foydalanuvchi ma’lumotlarini hash maydoni bilan qaytaradi. Uni serverda HMAC-SHA256 orqali tekshiring, bunda kalit — botingiz tokenining SHA-256 qiymati, va auth_date yangi ekanini tekshiring.
  • Telegram Mini App: initData ni serverda Telegram hujjatlaridagi algoritm bo‘yicha tekshiring, so‘ng o‘z sessiyangizni yarating.
import crypto from 'node:crypto'

export function verifyTelegramLogin(data: Record<string, string>, botToken: string) {
  const { hash, ...fields } = data
  const checkString = Object.keys(fields).sort().map((k) => `${k}=${fields[k]}`).join('\n')
  const secret = crypto.createHash('sha256').update(botToken).digest()
  const expected = crypto.createHmac('sha256', secret).update(checkString).digest('hex')
  const fresh = Date.now() / 1000 - Number(fields.auth_date) < 86400
  return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(hash ?? ''))
}

Mijozdan kelgan Telegram ma’lumotlariga bu tekshiruvsiz hech qachon ishonmang.

Ko‘p uchraydigan xatolar

  • Faqat middleware’ga tayanib, server actions’ni himoyasiz qoldirish.
  • Sessiya yoki tokenlarni httpOnly cookie o‘rniga localStorage da saqlash.
  • OTP kodlarni ochiq matnda va urinishlar cheklovisiz saqlash.
  • Ma’lumot saqlash joyi talablarini tekshirmasdan bulutli provayderni tanlash.

Ko‘p beriladigan savollar

Ha, lekin buni rejalashtirish kerak. Foydalanuvchilarni eksport qilish, ularning ID’larini bazangiz bilan moslashtirish va parollar masalasini hal qilish kerak bo‘ladi — odatda ularni yaroqli ko‘rinishda yuklab bo‘lmaydi, shuning uchun foydalanuvchilarga kod orqali kirish yoki parolni tiklash kerak bo‘lishi mumkin.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.