Нэг удаагийн код (Session)

5 минут хүчинтэй 6 оронтой код үүсгэж, хэрэглэгч түүнийг нэг товшилтоор 150073 руу илгээнэ.

Сесс (session) бол нэг удаагийн баталгаажуулалт. Таны сервер session үүсгэхэд 2fa.mn 6 оронтой код олгоно. Хэрэглэгч тэр кодыг 150073 руу илгээхэд session баталгаажиж, таны сервер webhook хүлээн авна.

Бүртгэл, нэвтрэлт, гүйлгээ баталгаажуулах, үйлчилгээ идэвхжүүлэхэд ашиглана.

Жишээ. Энд SMS илгээгдэхгүй.

Код үүсгэх

curl -X POST https://api.2fa.mn/v1/sessions \
  -H "Authorization: Bearer $TWOFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phone": "99112233", "metadata": { "user_id": "u_42" } }'
const res = await fetch('https://api.2fa.mn/v1/sessions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.TWOFA_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ phone: '99112233', metadata: { user_id: 'u_42' } }),
});
const session = await res.json(); // session.sms_uri, session.code
body := strings.NewReader(`{"phone": "99112233", "metadata": {"user_id": "u_42"}}`)
req, _ := http.NewRequest("POST", "https://api.2fa.mn/v1/sessions", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("TWOFA_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
<?php
$ch = curl_init('https://api.2fa.mn/v1/sessions');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('TWOFA_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['phone' => '99112233', 'metadata' => ['user_id' => 'u_42']]),
]);
$session = json_decode(curl_exec($ch), true);
import os, requests

res = requests.post(
    "https://api.2fa.mn/v1/sessions",
    headers={"Authorization": f"Bearer {os.environ['TWOFA_KEY']}"},
    json={"phone": "99112233", "metadata": {"user_id": "u_42"}},
)
session = res.json()  # session["sms_uri"], session["code"]
ТалбарТөрөлТайлбар
phonestring, заавал биш8 оронтой дугаар. +976, 976 угтвартай ч хүлээн авна. Заасан бол зөвхөн энэ дугаараас ирсэн SMS баталгаажуулна.
metadataobject, заавал бишДурын JSON. Webhook-д өөрчлөгдөлгүй буцаж ирнэ.

Хариу 201 Created:

{
  "id": "ses_8f3k2m",
  "mode": "test",
  "code": "482913",
  "short_code": "150073",
  "sms_uri": "sms:150073?body=482913",
  "qr_svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 33 33\" shape-rendering=\"crispEdges\">…</svg>",
  "status": "pending",
  "phone": "99112233",
  "metadata": { "user_id": "u_42" },
  "expires_at": "2026-12-01T10:05:00Z",
  "created_at": "2026-12-01T10:00:00Z"
}

qr_svg нь sms_uri-г агуулсан QR кодын бүрэн SVG. Зөвхөн pending төлөвтэй session-д ирнэ. Баталгаажсан эсвэл хугацаа нь дууссан session-д энэ талбар байхгүй. SVG-г 2fa.mn тогтмол тэмдэгтүүдээс үүсгэдэг тул хуудсандаа шууд (inline) оруулж болно.

phone заах уу, үгүй юу

  • Заасан үед: хэрэглэгч дугаараа аль хэдийн оруулсан бол (жишээ нь бүртгэлийн маягтад) заана. Өөр дугаараас ирсэн SMS тэр session-ийг баталгаажуулахгүй.
  • Заагаагүй үед: хэрэглэгчээс дугаар асуухгүйгээр шууд товч харуулж болно. Аль дугаараас илгээснийг webhook-ийн phone талбараас мэднэ. Энэ нь бүртгэлийн урсгалыг богиносгодог.

Зөвлөмж

Дугаарыг мэддэг бол (нэвтрэх, төлбөр батлах) phone-ийг заавал дамжуулна уу. Дугаартай холбосон session-ийг өөр дугаараас баталгаажуулах боломжгүй. Баталгаажсаны дараа дугаарыг хэрэглэгчид буцааж харуулна уу: «Таны дугаар 9911••33 мөн үү?»

Хэрэглэгчид харуулах

Хэрэглэгчид үнийг харуулж, sms_uri руу холбосон товч гаргана. Утсан дээр товчийг дарахад SMS апп 150073 дугаар болон кодтойгоо бэлэн нээгдэнэ.

<p>Үнэ: 150₮</p>
<a href="sms:150073?body=482913">SMS илгээх</a>

SMS товч эсвэл QR

  • Утсан дээр: sms_uri руу холбосон SMS товч харуулна.
  • Компьютер дээр: qr_svg-г харуулна. Хэрэглэгч утасныхаа камераар уншуулж SMS-ээ илгээнэ. Кодыг болон 150073 дугаарыг текстээр мөн харуулж, гараар илгээх боломж үлдээнэ үү.

Аль ч хэлбэрт үнийг товч эсвэл QR-ын өмнө харуулж, баталгаажмагц нууна.

<p>Үнэ: 150₮</p>
<div class="qr"><!-- session.qr_svg --></div>
<p>Утасныхаа камераар уншуулна уу</p>

SVG-д width, height байхгүй тул хэмжээг түүнийг агуулсан элементийн CSS-ээр заана (жишээ нь .qr svg { width: 200px; height: 200px; }).

Үнийг заавал харуулна

Үйлчилгээний нөхцөлөөр SMS товчийн өмнө 150₮ үнийг харуулж, баталгаажсаны дараа товчийг нуух ёстой. Бэлэн компонентыг Үнийн UI хэсгээс аваарай.

Төлөв

ТөлөвУтга
pendingКод олгогдсон, SMS хүлээж байна
verifiedТохирох SMS ирж, баталгаажсан
expired5 минут өнгөрсөн, SMS ирээгүй

Session нэг л удаа ашиглагдана. Баталгаажсан эсвэл хугацаа нь дууссан session-д дахин SMS ирвэл юу ч өөрчлөгдөхгүй. Хэрэглэгч дахин оролдохоор бол шинэ session үүсгэнэ.

Төлөв шалгах

Үндсэн суваг нь webhook. Хөтөч дээр төлөв харуулах бол өөрийн серверээр дамжуулан GET /v1/sessions/{id} дуудна.

curl https://api.2fa.mn/v1/sessions/ses_8f3k2m \
  -H "Authorization: Bearer sk_test_..."

Баталгаажсан session-д verified_phone, verified_at, operator талбарууд нэмэгдэнэ:

{
  "id": "ses_8f3k2m",
  "mode": "test",
  "code": "482913",
  "short_code": "150073",
  "sms_uri": "sms:150073?body=482913",
  "status": "verified",
  "phone": "99112233",
  "metadata": { "user_id": "u_42" },
  "expires_at": "2026-12-01T10:05:00Z",
  "created_at": "2026-12-01T10:00:00Z",
  "verified_phone": "99112233",
  "verified_at": "2026-12-01T10:00:41Z",
  "operator": "unitel"
}

Алдаа

КодХэзээ
400 invalid_phonephone 8 оронтой Монгол дугаар биш
400 invalid_requestmetadata JSON объект биш эсвэл 4 KB-аас их
429 rate_limitedSession үүсгэх хязгаар хэтэрсэн: Хязгаар
403 client_suspendedТаны эрх түр хаагдсан

Бүх кодыг Алдааны кодууд хэсгээс үзнэ үү.

Webhook

Баталгаажихад verification.succeeded, хугацаа дуусахад session.expired үйл явдал ирнэ.

{
  "id": "evt_2k9d7x",
  "type": "verification.succeeded",
  "mode": "test",
  "created_at": "2026-12-01T10:00:41Z",
  "data": {
    "session_id": "ses_8f3k2m",
    "phone": "99112233",
    "operator": "unitel",
    "verified_at": "2026-12-01T10:00:41Z",
    "metadata": { "user_id": "u_42" }
  }
}

Signature-ийг хэрхэн шалгахыг Webhook ба signature хэсгээс үзнэ үү.

Дараагийн алхам

Энэ хуудас тус болсон уу?