Tezkor boshlash
Bototeka Authorization Code va PKCE S256-ni qoʻllaydigan istalgan OpenID Connect kutubxonasi bilan ishlaydi.
Ilova yarating
Xizmat nomi, qaytish manzili va kerak boʻlsa logotipni kiriting. Google, Apple va Yandex qaytishlarini Bototeka boshqaradi.
Kirish maʼlumotlarini saqlang
Client ID va Client Secret-ni nusxalang. Maxfiy kalit faqat bir marta koʻrsatiladi.
OIDC-ni sozlang
Kutubxonaga issuer manzilini bering. U boshqa endpoint-larni avtomatik topadi.
Kirishni sinang
Kirishni boshlang, state va nonce-ni tekshiring, kodni almashtiring va mahalliy sessiya yarating.
- Issuer
- https://bototeka.com/api
- Discovery URL
- https://bototeka.com/api/.well-known/openid-configuration
- Service API
- https://api.bototeka.com/api/identity/v1
- Redirect URI namunasi
- https://service.example/auth/callback
Ulanishni tekshirish
Egasi va administrator uchun balanssiz mavjud
Bu test Bototeka sozlamalarini va provayder endpoint-ining mavjudligini tekshiradi. Foydalanuvchining interaktiv kirishi alohida sinovdan oʻtkaziladi.
OAuth sozlamalarini ochishKirish va tokenlar
Serveringiz PKCE, state va nonce yaratadi, foydalanuvchini Bototeka-ga yuboradi va faqat qisqa muddatli avtorizatsiya kodini oladi.
import { createHash, randomBytes } from "node:crypto";
const clientId = process.env.BOTOTEKA_CLIENT_ID;
if (!clientId) throw new Error("BOTOTEKA_CLIENT_ID is required");
const verifier = randomBytes(32).toString("base64url");
const challenge = createHash("sha256").update(verifier).digest("base64url");
const state = randomBytes(24).toString("base64url");
const nonce = randomBytes(24).toString("base64url");
const authorize = new URL("https://bototeka.com/api/oauth/authorize");
authorize.search = new URLSearchParams({
client_id: clientId,
redirect_uri: "https://service.example/auth/callback",
response_type: "code",
scope: "openid email profile",
code_challenge: challenge,
code_challenge_method: "S256",
state,
nonce,
}).toString();
// Save verifier, state and nonce in the user's server-side session.
console.log(authorize.toString());curl --request POST 'https://bototeka.com/api/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=YOUR_CLIENT_ID' \
--data-urlencode 'client_secret=YOUR_CLIENT_SECRET' \
--data-urlencode 'code=CODE_FROM_CALLBACK' \
--data-urlencode 'redirect_uri=https://service.example/auth/callback' \
--data-urlencode 'code_verifier=SAVED_PKCE_VERIFIER'curl 'https://bototeka.com/api/oauth/userinfo' \
--header 'Authorization: Bearer ACCESS_TOKEN'Roʻyxatdan oʻtish maʼlumotlari API orqali
Kompaniya sozlamalarida API kaliti yarating. Kompaniyangiz ilovalari uchun mijozlar yoki hodisalarni soʻrang.
/applications/{applicationId}/customerssub, tasdiqlangan email, ism va faollik vaqtlarini qaytaradi.
/applications/{applicationId}/eventsRoʻyxatdan oʻtish yoki kirish, summa, valyuta, holat va hodisa vaqtini qaytaradi.
curl 'https://api.bototeka.com/api/identity/v1/applications/APPLICATION_ID/customers?limit=50' \
--header 'Authorization: Bearer btk_v1_YOUR_API_KEY'curl 'https://api.bototeka.com/api/identity/v1/applications/APPLICATION_ID/events?limit=50' \
--header 'Authorization: Bearer btk_v1_YOUR_API_KEY'Oʻqish uchun identity:read kerak. Kalitni Bearer tokeni sifatida yuboring va serverda saqlang.
Vebhuklar
Kompaniya sozlamalarida hodisalarga obuna boʻling. Manzil HTTPS ishlatishi kerak. Imzo uchun maxfiy kalit faqat bir marta koʻrsatiladi.
identity.registration.completed.v1Roʻyxatdan oʻtish yakunlandi va foydalanish jurnaliga yozildi.
identity.login.completed.v1Takroriy kirish yakunlandi va foydalanish jurnaliga yozildi.
Yetkazish kamida bir marta bajariladi. Takrorlarni event ID orqali ajrating, hodisalarni istalgan tartibda qabul qiling va saqlagandan keyingina 2xx qaytaring.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyBototekaWebhook(rawBody, headers, secret) {
const timestamp = headers["x-bototeka-webhook-timestamp"];
const received = headers["x-bototeka-webhook-signature"];
if (!timestamp || !received) return false;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = "v1=" + createHmac("sha256", secret)
.update(timestamp + "." + rawBody)
.digest("hex");
const left = Buffer.from(expected);
const right = Buffer.from(received);
return left.length === right.length && timingSafeEqual(left, right);
}Ishga tushirishdan oldingi tekshiruvlar
- Aniq HTTPS Redirect URI ishlating. Ixtiyoriy manzilga qaytishni qabul qilmang.
- Har bir urinish uchun yangi state, nonce va PKCE verifier yarating va server sessiyasida saqlang.
- Client Secret, API kalitlari, access token va refresh token-ni brauzer yoki mobil tahlil tizimida saqlamang.
- offline_access-ni faqat serverga uzoq sessiya kerak boʻlganda soʻrang.
- Vebhuk imzosini soʻrovning ishlov berilmagan tanasi orqali tekshiring va takroriy yetkazishni xavfsiz qayta ishlang.
Xatolar va tiklash
invalid_requestNima boʻldi
Majburiy parametr yoʻq yoki notoʻgʻri.
Nima qilish kerak
Redirect URI, PKCE, state, nonce va Content-Type-ni tekshiring.
invalid_grantNima boʻldi
Kodning muddati tugagan, ishlatilgan yoki verifier-ga mos emas.
Nima qilish kerak
Yangi kirishni boshlang. Bir kodni qayta almashtirmang.
temporarily_unavailableNima boʻldi
Ilova balansida mablagʻ yetarli emas.
Nima qilish kerak
OAuth balansini toʻldiring va yangi kirishni boshlang.
429Nima boʻldi
Soʻrov yoki tasdiqlash urinishlari chegarasi oshib ketdi.
Nima qilish kerak
Retry-After-ga amal qiling va tasodifiy qoʻshimcha kutish bilan qayta urining.
| Kod | Nima boʻldi | Nima qilish kerak |
|---|---|---|
| invalid_request | Majburiy parametr yoʻq yoki notoʻgʻri. | Redirect URI, PKCE, state, nonce va Content-Type-ni tekshiring. |
| invalid_grant | Kodning muddati tugagan, ishlatilgan yoki verifier-ga mos emas. | Yangi kirishni boshlang. Bir kodni qayta almashtirmang. |
| temporarily_unavailable | Ilova balansida mablagʻ yetarli emas. | OAuth balansini toʻldiring va yangi kirishni boshlang. |
| 429 | Soʻrov yoki tasdiqlash urinishlari chegarasi oshib ketdi. | Retry-After-ga amal qiling va tasodifiy qoʻshimcha kutish bilan qayta urining. |
Savollar va javoblar
Toʻlov qachon olinadi?
Token muvaffaqiyatli berilgandan keyin. Birinchi sessiya roʻyxatdan oʻtish, keyingilari kirish hisoblanadi. Muvaffaqiyatsiz va bekor qilingan urinishlar, refresh, UserInfo va logout bepul.
Faqat email ishlatish mumkinmi?
Ha. Bototeka ijtimoiy provayderlarsiz email orqali roʻyxatdan oʻtish, bir martalik kodlar, manzilni tasdiqlash va parolni tiklashni qoʻllaydi.
SPA ulash mumkinmi?
Ha, PKCE va xotirada saqlanadigan qisqa muddatli access token bilan public client sifatida. Haqiqiy ish uchun server yoki HttpOnly sessiyali BFF tavsiya etiladi.
Mijoz ID-si sifatida nimani saqlash kerak?
issuer va sub juftligini saqlang. Email oʻzgarishi mumkin va doimiy identifikator emas.
Maxfiy kalitni qanday almashtiraman?
Kompaniya sozlamalarida API kaliti yarating yoki yangilang. Yangi maxfiy kalitni darhol nusxalang, server sozlamalarini yangilang va eski ruxsatni bekor qiling.