Asosiy mazmunga o'tish
Socialift
Xavfsizlik

Ijtimoiy tarmoq OAuth tokenlarini xavfsiz saqlash va yangilash

OAuth tokenni faqat serverda, shifrlangan holda (Fernet yoki KMS) va har bir mijoz hamda akkaunt uchun alohida qatorda saqlang. Muddatini expires_at bo'yicha kuzating va tugashidan oldin fon ishchisi bilan yangilang. Platformalar farq qiladi: TikTok access token 24 soat, Instagram Login va LinkedIn 60 kun yashaydi, Facebook Page token esa muddatsiz. Bekor qilinganini AuthError va webhooklar ko'rsatadi.

Yangilangan:

OAuth tokenni qayerda va qanday saqlash kerak?

Token — parolga teng. Uni brauzer, mobil ilova yoki log'ga chiqarmang: bazada shifrlangan ustunda, shifrlash kaliti esa alohida (muhit o'zgaruvchisi, secret manager yoki KMS) tursin. Har tokenning expires_at, haqiqatda berilgan scope'lar va holatini saqlang. Yangilashni rejalashtiruvchi bajaradi, bekor qilish esa AuthError va platforma webhooklari orqali aniqlanadi.

Socialift SDK hech narsa saqlamaydi: exchange_code() va refresh_token() TokenBundle qaytaradi (access_token, refresh_token, expires_in, expires_at), qayerga yozish esa sizning ilovangiz ishi. Socialift kabinetining Ulanishlar bo'limida tokenlar serverda shifrlanadi va brauzerga yuborilmaydi — o'z backend'ingizda ham xuddi shu qoidaga amal qiling.

Access token qancha amal qiladi: platformalar jadvali

Rasmiy hujjatlar bo'yicha (2026-09-17). Muddatni doim javobdagi expires_in dan hisoblang — jadvaldagi raqamni kodga qattiq yozmang.

Access token qancha amal qiladi: platformalar jadvali — Platformalar bo'yicha imkoniyatlar jadvali
Platforma / tokenMuddatYangilashSDK
Facebook user token (qisqa)Bir necha soatServerda fb_exchange_token bilan uzoq muddatliga almashtiriladifb.exchange_code(...) uzoq muddatli token qaytaradi
Facebook user token (uzoq)Taxminan 60 kunMuddati o'tgan token bilan yangisini olib bo'lmaydi — foydalanuvchi qayta login qiladifb.granted_scopes(token)
Facebook Page token (uzoq muddatli user token'dan)Tugash sanasi yo'qKerak emas; ma'lum holatlarda bekor bo'ladifb.pages(token)
Meta system user tokenMuddatsiz yoki 60 kunMeta 60 kunlikni tavsiya qiladi: yangisini yarating, joylang, eskisini bekor qilingyo'q
Instagram LoginQisqa — 1 soat, uzoq — 60 kunKamida 24 soatlik va hali tugamagan token yangilanadi — yana 60 kunig.refresh_token(token)
TikTokAccess — 24 soat, refresh — 365 kunJavobdagi refresh token boshqacha bo'lishi mumkin — faqat yangisini ishlatingtt.refresh_token(refresh_token)
LinkedInAccess — 60 kunRefresh token faqat tasdiqlangan MDP hamkorlariga: 365 kun, yangilash bu muddatni uzaytirmaydili.refresh(...), li.introspect(token)
Telegram bot tokenHujjatda muddat ko'rsatilmaganBotFather'da istalgan vaqt bekor qilinadi va yangisi olinadiyo'q
Telegram akkaunt (MTProto)Seans faol seanslar ro'yxatidan tugatilgunchaQayta login (telefon → kod → 2FA)export_session() satri parolga teng
amoCRM OAuthAccess — hujjat namunasida 24 soat; refresh — 3 oyRefresh token bir marta almashtiriladiyo'q
Bitrix24 OAuthAccess — 1 soat, refresh — 180 kunrefresh_token bilanyo'q

boryo'qJadvalni yon tomonga suring

Izohlar va cheklovlar

Meta'da alohida "ma'lumotga kirish muddati" ham bor: foydalanuvchi 90 kun faol bo'lmasa token yaroqli bo'lsa ham ma'lumot olinmaydi (ba'zi biznes ruxsatlari bundan mustasno). Holatini debug_token ko'rsatadi.

Refresh strategiyasi: tokenlarni qachon va qanday yangilash

  1. Muddatni saqlang

    Har yangilashda expires_at va (bo'lsa) refresh_expires_at ni yozing. Ular TokenBundle da tayyor.

  2. Oyna bo'yicha rejalashtiring

    Masalan, har soatda: TikTok — 4 soatdan kam qolganlar, Instagram Login — 10 kundan kam qolganlar (token kamida 24 soatlik bo'lsin), LinkedIn — refresh token bo'lsa 7 kundan kam qolganlar.

  3. Bitta token — bitta yangilovchi

    Qator darajasida qulf qo'ying. TikTok va amoCRM'da refresh token almashadi: ikki ishchi parallel yangilasa, ikkinchisi eskirgan token bilan xato oladi.

  4. Atomar yozing

    Yangi access va refresh tokenni bitta tranzaksiyada saqlang. Yozish muvaffaqiyatsiz bo'lsa, yangi refresh token yo'qoladi va akkaunt uziladi.

  5. Xatoni ajrating

    AuthError — holatni reauth_required qiling va foydalanuvchiga qayta ulash havolasini yuboring. RateLimitError yoki TransportError — keyinroq qayta urining.

  6. Refresh yo'q joyda oldindan ogohlantiring

    Facebook user token yoki refresh'siz LinkedIn uchun tugashidan 7–14 kun oldin foydalanuvchiga qayta ulash haqida xabar bering.

Yangilash ishchisi (Socialift SDK)

Bir provayder uchun bitta klient yetadi: token har metodga argument sifatida beriladi, klientda saqlanmaydi.

refresh_worker.py
from socialift import ApiError, AuthError, Instagram, LinkedIn, RateLimitError, TikTok

async def refresh_row(row, tt: TikTok, ig: Instagram, li: LinkedIn) -> None:
    try:
        if row.provider == "tiktok":
            bundle = await tt.refresh_token(decrypt(row.refresh_token_enc))
        elif row.provider == "instagram":
            bundle = await ig.refresh_token(decrypt(row.access_token_enc))
        else:
            bundle = await li.refresh(decrypt(row.refresh_token_enc))
    except RateLimitError:
        raise  # keyinroq qayta
    except ApiError as exc:
        if not isinstance(exc, AuthError) and exc.status != 400:
            raise
        await db.set_status(row.id, "reauth_required")
        return
    await db.save_bundle(  # bitta tranzaksiya
        row.id,
        access_token_enc=encrypt(bundle.access_token),
        refresh_token_enc=encrypt(bundle.refresh_token) if bundle.refresh_token else None,
        expires_at=bundle.expires_at,
    )

OAuth standartiga ko'ra rad etilgan refresh token (invalid_grant) odatda HTTP 400 bilan qaytadi, 401 emas — shuning uchun u ham qayta ulashga yuboriladi.

db.save_bundle refresh token None bo'lsa eskisini qoldirsin: Instagram yangilash javobida refresh token yo'q. encrypt/decrypt — quyidagi Fernet funksiyalari.

Tokenlarni shifrlash: Fernet va kalit almashtirish

cryptography — SDK'ning o'z bog'liqligi. Fernet AES-128-CBC va HMAC-SHA256 bilan autentifikatsiyalangan shifrlash beradi; MultiFernet kalitni almashtirishga imkon beradi.

token_crypto.py
import os
from cryptography.fernet import Fernet, MultiFernet

# TOKEN_KEYS="yangi_kalit,eski_kalit" — birinchisi bilan shifrlanadi
_keys = MultiFernet([Fernet(k) for k in os.environ["TOKEN_KEYS"].split(",")])

def encrypt(token: str) -> bytes:
    return _keys.encrypt(token.encode())

def decrypt(blob: bytes) -> str:
    return _keys.decrypt(blob).decode()

def reencrypt(blob: bytes) -> bytes:
    """Kalit almashtirilgach fon migratsiyasida: eski yozuvni yangi kalitga o'tkazadi."""
    return _keys.rotate(blob)

Kalitni almashtirish: yangi kalitni ro'yxat boshiga qo'shing, barcha qatorlarni reencrypt bilan o'tkazing, keyin eski kalitni olib tashlang. KMS ishlatsangiz — envelope encryption: ma'lumot kaliti KMS bilan shifrlanadi, tokenlar ma'lumot kaliti bilan.

Multi-tenant token jadvali qanday tuziladi?

Multi-tenant token jadvali qanday tuziladi? — Platformalar bo'yicha imkoniyatlar jadvali
UstunTurNega kerak
tenant_iduuidHar so'rovda filtr; mijozlar tokenlari aralashmasin (row-level security)
providertextfacebook, instagram, tiktok, linkedin, telegram_bot, telegram_account
account_idtextPage ID, IG user ID, TikTok open_id, LinkedIn sub; UNIQUE (tenant_id, provider, account_id)
token_kindtextuser, page, system_user, bot, session — yangilash qoidasi shunga bog'liq
access_token_enc, refresh_token_encbyteaFaqat shifrlangan qiymat
key_versionintQaysi kalit bilan shifrlangani — rotatsiya uchun
expires_at, refresh_expires_attimestamptzRejalashtiruvchi indeks bo'yicha tanlaydi
scopestext[]Haqiqatda berilgan ruxsatlar (so'ralgani emas)
statustextactive, reauth_required, revoked
last_refreshed_at, last_errortimestamptz, textDiagnostika va ogohlantirish (tokenning o'zisiz)

App secret, client secret va shifrlash kalitlari bu jadvalga yozilmaydi — ular secret manager yoki muhit o'zgaruvchilarida turadi.

appsecret_proof nima va nega kerak?

appsecret_proof — access token'ning app secret kaliti bilan hisoblangan HMAC-SHA256 xeshi. U Graph API so'roviga parametr sifatida qo'shiladi. Token o'g'irlansa ham, app secret'siz proof yasab bo'lmaydi.

Meta App Dashboard'da App Settings → Advanced → Security bo'limida "Require App Secret" yoqilsa, proof'siz chaqiruvlar rad etiladi — ya'ni mijoz tomonidagi so'rovlar backend orqali o'tishi shart. Socialift SDK Meta so'rovlariga (Facebook, Instagram, Ads) proof'ni avtomatik qo'shadi; SDK'siz ishlasangiz socialift.crypto.appsecret_proof(access_token, app_secret) yoki hmac bilan hisoblang.

Token bekor qilinganini qanday aniqlash mumkin?

Meta: kod 190 (muddati o'tgan yoki bekor qilingan token) SDK'da AuthError bo'lib keladi. Subkodlar sababni aytadi: 458 — app o'chirilgan, 460 — parol o'zgargan, 463 — muddati tugagan, 467 — yaroqsiz token. Foydalanuvchi app'ni Facebook'ning o'zida o'chirsa, App Dashboard'da ko'rsatilgan deauthorize callback URL chaqiriladi; undagi signed_request ni parse_signed_request(signed_request, app_secret) tekshiradi.

TikTok ruxsat olib tashlanganda authorization.removed webhook hodisasini yuboradi (verify_tiktok_request bilan tekshiring). LinkedIn'da li.introspect(token) token holatini (active, expired, revoked) qaytaradi, 401 esa AuthError bo'ladi. Telegram bot token'i BotFather'da bekor qilinsa, eski token ishlamay qoladi — SDK "Unauthorized" javobini AuthError qilib beradi.

Foydalanuvchi sizning ilovangizda "uzish" tugmasini bossa, avval provayderda bekor qiling (fb.revoke(token), tt.revoke(token)), keyin qatorni o'chiring. Faqat bazadan o'chirish yetarli emas: Meta token'i amal qilishda davom etadi.

Minimal ruxsatlar va sirlarni boshqarish

  • Faqat funksiyaga kerakli scope'larni so'rang; App Review va audit ham shuni tekshiradi.
  • Foydalanuvchi ba'zi ruxsatlarni rad etishi mumkin — haqiqatda berilganini saqlang: fb.granted_scopes(token), LinkedIn'da li.introspect(token).
  • Har muhit (dev, staging, prod) uchun alohida app va kalitlar; prod tokenlari dev bazaga tushmasin.
  • App secret'ni almashtirish rejasini oldindan tuzing: appsecret_proof va webhook imzosi tekshiruvi unga bog'liq — barcha servislarni bir vaqtda yangilang.
  • Tokenlarni log, Sentry va analitikaga yozmang; xato matnlarida ham maskalang.
  • Telegram akkaunt seans satrini (export_session()) ham token kabi shifrlab saqlang.
  • Shifrlash kalitini yiliga kamida bir marta yoki xodim ketganda almashtiring (MultiFernet yoki KMS).
  • Qayta ulash kerak bo'lgan akkauntlarni kabinetda ko'rsating — jim uzilish eng qimmat xato.

← Blogga qaytish

Ko'p so'raladigan savollar

OAuth tokenni bazada ochiq saqlasa bo'ladimi?

Tavsiya etilmaydi. Baza zaxirasi yoki SQL-in'ektsiya orqali sizib chiqqan token darhol ishlatiladi. Tokenni shifrlangan ustunda, kalitni esa bazadan tashqarida saqlang — shunda bazaning o'zi yetarli bo'lmaydi.

Instagram tokenni qachon yangilash kerak?

Instagram Login uzoq muddatli tokeni 60 kun amal qiladi va kamida 24 soatlik, hali tugamagan bo'lsa yangilanadi — yana 60 kunga. Amalda tugashiga 7–10 kun qolganda fon ishchisi bilan yangilash qulay. Facebook Login orqali olingan Page token'ni yangilash shart emas.

TikTok refresh token nega xato beradi?

Ko'pincha eski refresh token qayta ishlatilgani uchun. TikTok hujjatiga ko'ra yangilash javobidagi refresh token boshqacha bo'lishi mumkin va yangisini ishlatish kerak. Yangi tokenni atomar saqlang va bir token'ni ikki ishchi parallel yangilamasin.

LinkedIn'da nega refresh token kelmaydi?

LinkedIn dasturiy refresh tokenlarni faqat tasdiqlangan Marketing Developer Platform hamkorlariga beradi. Qolgan ilovalarda access token 60 kun amal qiladi, keyin foydalanuvchi qayta avtorizatsiyadan o'tadi — tugashidan oldin ogohlantiring.

Facebook Page access token muddati tugaydimi?

Uzoq muddatli user token'dan olingan Page token'ning tugash sanasi yo'q, lekin u ma'lum holatlarda bekor bo'ladi — masalan, foydalanuvchi parolini o'zgartirsa yoki app'ni o'chirsa. Shuning uchun AuthError ni kuzating va holatni saqlang.

appsecret_proof majburiymi?

App Dashboard'da "Require App Secret" yoqilgan bo'lsa — ha, proof'siz chaqiruvlar rad etiladi. Yoqilmagan bo'lsa ham server so'rovlariga qo'shish tavsiya etiladi. Socialift SDK uni Meta so'rovlariga avtomatik qo'shadi.

Manbalar

  1. Meta — Long-Lived Access Tokens
  2. Meta — Securing Graph API Requests
  3. Meta — Refresh Instagram Access Token
  4. TikTok — Manage User Access Tokens
  5. LinkedIn — Programmatic Refresh Tokens
  6. cryptography — Fernet

Bog'liq sahifalar