DAN Gateway-р дамжуулан sso.gov.mn-аас иргэний мэдээлэл авах
Admin-аас client_id болон client_secret авна. /admin хуудаснаас бүртгүүлнэ.
dan.gerege.mn/verify?client_id=YOUR_ID&callback_url=YOUR_CALLBACK
Gateway автоматаар sso.gov.mn руу redirect хийнэ.
Citizen data + timestamp + HMAC signature query param-аар дамжина.
| Параметр | Тайлбар |
|---|---|
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
| Параметр | Тайлбар |
|---|---|
reg_no | Регистрийн дугаар |
given_name | Нэр |
family_name | Овог |
civil_id | Иргэний ID |
gender | Хүйс |
birth_date | Төрсөн огноо |
aimag_name | Аймаг/Хот |
sum_name | Сум/Дүүрэг |
timestamp | Unix timestamp |
client_id | Таны client ID |
signature | HMAC-SHA256 signature |
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-аас хамгаалах).