3-р талын систем холбох

DAN Gateway-р дамжуулан sso.gov.mn-аас иргэний мэдээлэл авах

1. Client бүртгүүлэх

Admin-аас client_id болон client_secret авна. /admin хуудаснаас бүртгүүлнэ.

2. Flow

1

Хэрэглэгчийг DAN Gateway руу чиглүүлэх

dan.gerege.mn/verify?client_id=YOUR_ID&callback_url=YOUR_CALLBACK

2

sso.gov.mn-р нэвтрэх

Gateway автоматаар sso.gov.mn руу redirect хийнэ.

3

Callback URL руу мэдээлэл буцна

Citizen data + timestamp + HMAC signature query param-аар дамжина.

3. API

GET /verify

ПараметрТайлбар
client_idБүртгэлтэй client ID
callback_urlБүртгэлтэй callback URL
https://dan.gerege.mn/verify?client_id=dan_abc123&callback_url=https://myapp.mn/api/dan/callback

4. Callback параметрүүд

ПараметрТайлбар
reg_noРегистрийн дугаар
given_nameНэр
family_nameОвог
civil_idИргэний ID
genderХүйс
birth_dateТөрсөн огноо
aimag_nameАймаг/Хот
sum_nameСум/Дүүрэг
timestampUnix timestamp
client_idТаны client ID
signatureHMAC-SHA256 signature

5. HMAC шалгалт

Signature-г client_secret ашиглан шалгана:

// Go жишээ
func verifySignature(params url.Values, secret string) bool {
    expected := params.Get("signature")
    keys := []string{}
    for k := range params {
        if k != "signature" { keys = append(keys, k) }
    }
    sort.Strings(keys)
    var buf strings.Builder
    for i, k := range keys {
        if i > 0 { buf.WriteByte('&') }
        buf.WriteString(url.QueryEscape(k) + "=" + url.QueryEscape(params.Get(k)))
    }
    mac := hmac.New(sha256.New, []byte(secret))
    mac.Write([]byte(buf.String()))
    return hex.EncodeToString(mac.Sum(nil)) == expected
}
// Python жишээ
import hmac, hashlib, urllib.parse
def verify(params, secret):
    sig = params.pop('signature', '')
    canonical = '&'.join(f'{urllib.parse.quote(k)}={urllib.parse.quote(params[k])}'
                         for k in sorted(params))
    expected = hmac.new(secret.encode(), canonical.encode(), hashlib.sha256).hexdigest()
    return sig == expected
Анхааруулга: timestamp 5 минутаас хэтэрсэн бол хүлээж авахгүй байхыг зөвлөж байна (replay attack-аас хамгаалах).