Mars ID'ni o'z
loyihangizga ulash
O'z ro'yxatdan o'tish formangiz o'rniga Telegram orqali kirish. Bizning hostingda ham, sizniki'da ham ishlaydi — Vercel, Render, VPS, farqi yo'q. Bepul, kalitlarni bir soatda beramiz.
O'z holatingizni tanlang
Usul loyihangiz qayerda joylashganiga bog'liq. Keyingisi — faqat sizning yo'lingiz, qolganini o'qimasangiz ham bo'ladi.
Tayyor saytga qulf
*.marshub.uz dagi statika yoki pages.marshub.uz dagi sahifa. Faqat o'zimiznikilarni kiritamiz — backendsiz.
Bizning domendagi backendingiz
sizniki.marshub.uz dagi Node, Python, PHP, Go. Cookie o'zi keladi — uni tekshirish qoladi, xolos.
O'z hostingingiz, o'z domeningiz
Vercel, Render, Railway, VPS, localhost. Standart OAuth2 / OpenID Connect — uni istalgan framework tushunadi.
Telegram Mini App
Telegram ichidagi ilova: foydalanuvchi allaqachon tanilgan, login umuman ko'rsatilmaydi.
Tayyor saytga qulf
Sayt deploy qilingan, kodga tegishni istamaysiz, lekin uni hamma ko'rmasligi kerak. Tekshiruvni so'rov sizning fayllaringizga yetib borgunicha bizning proksi bajaradi.
Butun sayt nom.marshub.uz
Bizga subdomen nomini va kimlarni kiritish kerakligini — Telegram ID ro'yxatini yozing. Qulfni bazada yoqamiz: restart ham, kodni o'zgartirish ham shart emas.
- → ro'yxat bo'sh = Mars ID'ga kirgan har kimni kiritamiz
- → ID ro'yxati = faqat o'shalarni kiritamiz, qolganlarga 403
- → qulfsiz sayt avvalgidek ochiq qoladi
Kirmagan mehmonni id.marshub.uz/login ga o'zi olib o'tadi va sahifangizga qaytaradi.
Bitta sahifa pages.marshub.uz
Bu yerda hammasini o'zingiz qilasiz, bizsiz. Har bir chop etilgan sahifaning kirish sozlamasi bor:
- → public — hammaga ochiq
- → password — umumiy parol, akkaunt kerak emas
- → marsid — Telegram orqali kirish, ID ro'yxati bilan ham bo'ladi
marshub_set_page_access MCP-vositasi orqali buni sizning AI-agentingiz ham qiladi.
Bu nimani uddalay olmaydi: qulf faqat «kiritish kerakmi yoki yo'qmi» degan savolga javob beradi. Agar ichkarida rollar, shaxsiy kabinet yoki «bu buyurtma meniki» kerak bo'lsa — backend kerak, bu 2-yo'l.
O'z hostingingiz, istalgan domen
Cookie faqat .marshub.uz da yashaydi — tashqarida u yo'q. Shuning uchun Vercel, Render,
o'z VPS'ingiz yoki localhost'dagi loyiha uchun standart OpenID Connect ishlaydi. Mars ID — to'liq huquqli OIDC-provayder,
uni deyarli har qanday avtorizatsiya kutubxonasi qutidan chiqqan holda tushunadi.
1-qadam — kalitlarni olish
@marvinaka ga yozing va uchta narsani yuboring:
Loyiha nomi
Mijozlar ro'yxatida qanday nomlanadi
Callback URL
Foydalanuvchini qaytaradigan aniq manzil. Bir nechta bo'lishi mumkin: prod, staging, localhost
Kimga ruxsat
Mars ID'si borlarning hammasiga / faqat o'quvchilarga / faqat xodimlarga
Javobiga client_id va client_secret keladi.
Callback harfma-harf solishtiriladi — niqob ham, «shu bilan boshlanadi» ham yo'q: oxiridagi ortiqcha slash ham boshqa manzil hisoblanadi.
2-qadam — kutubxona uchun sozlamalar
Agar frameworkingiz OIDC'ni bilsa (NextAuth/Auth.js, Passport, Authlib, Spring Security, Keycloak-adapter, Grafana, Forgejo, GlitchTip…) — shu qiymatlarni qo'ying, kod deyarli kerak bo'lmaydi.
| Parametr | Qiymat |
|---|---|
| Issuer | https://id.marshub.uz |
| Discovery / well-known | https://id.marshub.uz/.well-known/openid-configuration |
| Authorization URL | https://id.marshub.uz/oauth/authorize |
| Token URL | https://id.marshub.uz/oauth/token |
| UserInfo URL | https://id.marshub.uz/oauth/userinfo |
| Scopes | openid profile email |
| Response type | code |
| id_token algoritmi | HS256 (imzo — sizning client_secret bilan) |
| Mijoz autentifikatsiyasi | client_secret_post yoki client_secret_basic |
Bizda nima yo'q: PKCE, refresh-tokenlar va RS256/JWKS. Tokenlar bir soat yashaydi, kod 5 daqiqa ichida bir marta almashtiriladi.
Backendsiz SPA uchun bu shuni anglatadi: kodni server almashtirishi kerak, client_secret ni brauzerga qo'yish mumkin emas.
3-qadam — qo'lda yozsangiz
// 1. Foydalanuvchini Mars ID'ga yuboramiz app.get('/login', (req, res) => { const state = crypto.randomBytes(16).toString('hex'); req.session.state = state; // qaytganda tekshiramiz const u = new URL('https://id.marshub.uz/oauth/authorize'); u.searchParams.set('client_id', process.env.MARS_CLIENT_ID); u.searchParams.set('redirect_uri', 'https://myapp.uz/callback'); u.searchParams.set('response_type', 'code'); u.searchParams.set('scope', 'openid profile email'); u.searchParams.set('state', state); res.redirect(u.toString()); }); // 2. Foydalanuvchi kod bilan qaytdi — kodni tokenlarga almashtiramiz app.get('/callback', async (req, res) => { if (req.query.state !== req.session.state) return res.status(400).send('bad state'); const tokens = await fetch('https://id.marshub.uz/oauth/token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ grant_type: 'authorization_code', code: req.query.code, redirect_uri: 'https://myapp.uz/callback', // 1-qadamdagining aynan o'zi client_id: process.env.MARS_CLIENT_ID, client_secret: process.env.MARS_CLIENT_SECRET, }), }).then(r => r.json()); // 3. Bu kim — id_token'dan (sizning client_secret bilan imzolangan) yoki so'rov orqali: const user = await fetch('https://id.marshub.uz/oauth/userinfo', { headers: { Authorization: `Bearer ${tokens.access_token}` }, }).then(r => r.json()); // user = { sub, name, preferred_username, handle, email, // role, tg, is_staff, is_student, core_id } req.session.user = user; res.redirect('/'); });
Telegram Mini App
Telegram ichida odam allaqachon tanilgan — kirish tugmasini ko'rsatish ortiqcha. Telegram imzolangan
initData qatorini beradi, siz uni bizga yuborasiz, biz imzoni tekshirib, o'sha __mars_id cookie'sini qo'yamiz.
// Mini App'da, ishga tushishi bilanoq const tg = window.Telegram.WebApp; const me = await fetch('https://id.marshub.uz/api/auth/telegram-webapp', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', // aks holda cookie saqlanmaydi body: JSON.stringify({ initData: tg.initData }), }).then(r => r.json()); // me = { id, name, handle, role, tg, needs_handle } // needs_handle: true → odam hali o'ziga nom tanlamagan
So'rov begona domendan keladi, shuning uchun Mini App'ingiz origin'ini oq ro'yxatga kiritish kerak —
bizga manzilni yozing. initData imzosi bir kun davomida amal qiladi.
Nima qayerda
Manzillar
| Endpoint | Metod | Nima qiladi |
|---|---|---|
| /login?next=URL | GET | Kirish sahifasi, muvaffaqiyatdan keyin URL'ga qaytaradi |
| /logout | GET | Cookie'ni o'chirish |
| /api/verify | GET | Authorization: Bearer dagi yoki cookie'dagi tokenni tekshirish → { id, name, role, tg } |
| /api/me | GET | Xuddi shu, lekin faqat cookie bo'yicha. Boshqa domendagi brauzerdan — origin'lar oq ro'yxati kerak |
| /api/auth/telegram-webapp | POST | Mini App initData → cookie |
| /.well-known/openid-configuration | GET | OIDC Discovery |
| /oauth/authorize | GET | OAuth-oqimning boshlanishi |
| /oauth/token | POST | code → access_token + id_token |
| /oauth/userinfo | GET | Bearer access_token bo'yicha ma'lumotlar |
| /health | GET | Xizmat tirikmi |
Hammasi https://id.marshub.uz ga nisbatan
Token ichida nima bor
| Maydon | Bu nima |
|---|---|
| sub | Foydalanuvchi UUID'si, o'zgarmaydi |
| name | Telegram'dagi ism |
| handle | Nik (aziz), onboardinggacha null bo'lishi mumkin |
| role | member · student · intern · tutor · mentor · team · admin |
| tg | Telegram ID, son |
| handle@marshub.uz | |
| is_staff | Maktab xodimi (HR-bazadan) |
| is_student | Amaldagi o'quvchi (Core'dan) |
| core_id | Maktabning asosiy bazasidagi ID, agar bog'langan bo'lsa |
| exp | 30 kun yashaydi |
role — bu «odam kim», «unga nima mumkin» emas.
Huquqlarni o'zingizda saqlang: qo'pol ajratish uchun is_staff/is_student, aniq ajratish uchun — o'z ro'yxatingiz.
Hamma qoqiladigan tirmalar
- 01Cookie httpOnly. Uni JavaScript'dan o'qib bo'lmaydi — kerak ham emas. Tekshiruv faqat serverda.
- 02Localhost'ga cookie kelmaydi. U .marshub.uz ga bog'langan. Lokal ishlab chiqish uchun callback'i localhost'da bo'lgan OIDC oling — shundayini ro'yxatdan o'tkazamiz.
- 03Algoritmni tekshiring. Imzoni o'zingiz tekshirsangiz — har doim
HS256ni aniq ko'rsating, aks holda kutubxona imzosiz tokenni ham qabul qilishi mumkin. - 04Frontendga ishonmang. Rol, id va «men adminman» tokendan, serverda olinadi. Brauzer so'rov tanasida yuborgan hamma narsa — dalil emas.
- 05Huquqlar bir zumda o'zgarmaydi. Token 30 kun yashaydi: rolni olib tashladingiz — eski tokenda u hali bor. Muhim bo'lsa,
/api/verifyni chaqiring yoki bekor qilishni o'zingizda saqlang. - 06next'ni kodlang. Qaytish manzilini
encodeURIComponentorqali bering, aks holda ? dan keyingi parametrlar yo'qoladi.
Vazifani agentga bering
Claude Code, Cursor, Mars Code — istalgan agentga bitta faktlar sahifasi yetadi. Unga havola va vazifani tashlang, qolganini o'zi qiladi.
marshub.uz/id/llms.txt
Shu sahifaning butunlay mashina uchun ko'rinishi: endpointlar, token maydonlari, oqimlar, cheklovlar.
marshub.uz/llms.txt
Xuddi shu, lekin hosting haqida: agent saytni qanday deploy qilishi va qulf qo'yishi.
Borligicha nusxalasa bo'ladigan prompt:
Loyihamga Mars ID orqali kirishni ulab ber. Faktlar va endpointlarni shu yerdan ol: https://marshub.uz/id/llms.txt Loyiham: <stek, framework> Joylashgan: <nom.marshub.uz | tashqi hosting | Telegram Mini App> Talablar: - agar loyiha *.marshub.uz da bo'lsa — __mars_id cookie'sini o'qish va uni https://id.marshub.uz/api/verify ga so'rov bilan tekshirish (Authorization: Bearer), umumiy AUTH_SECRET ishlatilmasin; - agar loyiha tashqi domenda bo'lsa — OAuth2 authorization code (issuer https://id.marshub.uz), client_id/secret muhit o'zgaruvchilaridan, PKCE va refresh-tokensiz — provayderda ular yo'q; - avtorizatsiyadan o'tmaganni https://id.marshub.uz/login?next=<url-encoded qaytish manzili> ga yo'naltirish; - rol va huquqlar faqat serverda tekshirilsin, frontendga ishonilmasin; - https://id.marshub.uz/logout ga chiqish havolasi qo'shilsin.
Kalitlar yoki maslahat kerakmi?
OIDC-mijozni ro'yxatdan o'tkazish, saytga qulf, o'z subdomeningiz, Mini App uchun oq ro'yxat — bularning hammasini qo'lda va tez qilamiz. Nimani ulayotganingizni yozing.