Bototeka orqali kirishni ulang

OpenID Connect va PKCE ishlating. Kodni tokenlarga almashtiring va profilni UserInfo orqali oling.

openid-configuration
{
  "issuer": "https://bototeka.com/api",
  "authorization_endpoint": "https://bototeka.com/api/oauth/authorize",
  "token_endpoint": "https://bototeka.com/api/oauth/token",
  "userinfo_endpoint": "https://bototeka.com/api/oauth/userinfo",
  "scopes_supported": ["openid", "email", "profile", "offline_access"]
}

Tezkor boshlash

Bototeka Authorization Code va PKCE S256-ni qoʻllaydigan istalgan OpenID Connect kutubxonasi bilan ishlaydi.

  1. Ilova yarating

    Xizmat nomi, qaytish manzili va kerak boʻlsa logotipni kiriting. Google, Apple va Yandex qaytishlarini Bototeka boshqaradi.

  2. Kirish maʼlumotlarini saqlang

    Client ID va Client Secret-ni nusxalang. Maxfiy kalit faqat bir marta koʻrsatiladi.

  3. OIDC-ni sozlang

    Kutubxonaga issuer manzilini bering. U boshqa endpoint-larni avtomatik topadi.

  4. 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 ochish

Kirish va tokenlar

Serveringiz PKCE, state va nonce yaratadi, foydalanuvchini Bototeka-ga yuboradi va faqat qisqa muddatli avtorizatsiya kodini oladi.

Avtorizatsiya URL-ini yaratish
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());
Kodni tokenlarga almashtirish
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'
Profilni olish
curl 'https://bototeka.com/api/oauth/userinfo' \
  --header 'Authorization: Bearer ACCESS_TOKEN'
Qaytgandan keyin: state-ni solishtiring, kodni bir marta almashtiring, ID Token imzosini JWKS orqali, soʻng issuer, audience, amal qilish muddati va nonce-ni tekshiring. Foydalanuvchini email bilan emas, iss + sub juftligi bilan saqlang.

Roʻyxatdan oʻtish maʼlumotlari API orqali

Kompaniya sozlamalarida API kaliti yarating. Kompaniyangiz ilovalari uchun mijozlar yoki hodisalarni soʻrang.

GET/applications/{applicationId}/customers

sub, tasdiqlangan email, ism va faollik vaqtlarini qaytaradi.

GET/applications/{applicationId}/events

Roʻyxatdan oʻtish yoki kirish, summa, valyuta, holat va hodisa vaqtini qaytaradi.

Ilova mijozlarini olish
curl 'https://api.bototeka.com/api/identity/v1/applications/APPLICATION_ID/customers?limit=50' \
  --header 'Authorization: Bearer btk_v1_YOUR_API_KEY'
Roʻyxatdan oʻtish va kirish hodisalarini olish
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.v1

Roʻyxatdan oʻtish yakunlandi va foydalanish jurnaliga yozildi.

identity.login.completed.v1

Takroriy 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.

Vebhuk imzosini tekshirish
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_request

Nima boʻldi

Majburiy parametr yoʻq yoki notoʻgʻri.

Nima qilish kerak

Redirect URI, PKCE, state, nonce va Content-Type-ni tekshiring.

invalid_grant

Nima boʻldi

Kodning muddati tugagan, ishlatilgan yoki verifier-ga mos emas.

Nima qilish kerak

Yangi kirishni boshlang. Bir kodni qayta almashtirmang.

temporarily_unavailable

Nima boʻldi

Ilova balansida mablagʻ yetarli emas.

Nima qilish kerak

OAuth balansini toʻldiring va yangi kirishni boshlang.

429

Nima 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.

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.

Xizmatingizga kirishni ulang

OAuth sozlamalarini ochish