OAuth برای CLI

فلوی OAuth 2.0 با PKCE که AiraCode CLI برای ورود استفاده می‌کنه.

aira login از OAuth 2.0 با PKCE استفاده می‌کنه. CLI یک مرورگر باز می‌کنه، authorization code رو روی یک callback از نوع loopback می‌گیره، اون رو با توکن‌ها exchange می‌کنه، و نتیجه رو توی credential store امن محلی ذخیره می‌کنه.

فلو

  1. CLI یک listener از نوع loopback روی http://localhost:<PORT>/callback راه می‌اندازه.
  2. یک code_verifier تصادفی و یک code_challenge از نوع SHA-256 می‌سازه.
  3. مرورگر https://app.airachat.ir/api/auth/oauth/authorize رو باز می‌کنه.
  4. کاربر درخواست AiraCode CLI رو توی آیراچت تأیید می‌کنه.
  5. مرورگر با code و state برمی‌گرده.
  6. CLI مقدار code به‌همراه code_verifier رو به /auth/oauth/token می‌فرسته.
  7. سرور PKCE رو verify می‌کنه و یک access token به‌همراه refresh token برمی‌گردونه.

Endpoint‌ها

GET /auth/oauth/authorize

  • client_id=airacode-cli
  • response_type=code
  • redirect_uri=http://localhost:<PORT>/callback or https://airacode.ir/oauth/manual-redirect
  • code_challenge=<base64url(sha256(code_verifier))>
  • code_challenge_method=S256
  • state=<random>
  • scope=user:inference user:profile user:sessions:airacode

POST /auth/oauth/token

POST /auth/oauth/token
Content-Type: application/json

{
  "grant_type": "authorization_code",
  "code": "<code from redirect>",
  "code_verifier": "<original PKCE verifier>",
  "redirect_uri": "http://localhost:9876/callback",
  "client_id": "airacode-cli"
}

refresh token‌ها از همین endpoint استفاده می‌کنن:

POST /auth/oauth/token
Content-Type: application/json

{
  "grant_type": "refresh_token",
  "refresh_token": "<previous refresh>",
  "client_id": "airacode-cli"
}

GET /auth/oauth/profile

curl -H "Authorization: Bearer $AIRA_API_KEY" \
  https://app.airachat.ir/api/auth/oauth/profile

POST /auth/oauth/revoke

curl -X POST \
  -d "token=<refresh-token>" \
  https://app.airachat.ir/api/auth/oauth/revoke

استفاده از این توی اپ خودت

فعلاً client‌های OAuth جدید باید دستی ثبت بشن. با نام اپت، redirect URI‌ها، و scope‌های موردنیاز به info@airachat.ir ایمیل بزن.