ЦЗ Цахим Засаг
GitHub Нэвтрэх

SSO-д холбогдох

Шинэ апп sso.dgov.mn-ээр хүн таниулах гэж байвал энэ хуудас. Гурван алхам: клиент бүртгүүлэх, redirect host зөвшөөрөх, аппаа тохируулах.

Провайдер юу зарлаж байна

https://sso.dgov.mn/.well-known/openid-configuration
issuer https://sso.dgov.mn
authorization_endpoint https://sso.dgov.mn/oauth2/auth
token_endpoint https://sso.dgov.mn/oauth2/token
end_session_endpoint https://sso.dgov.mn/oauth2/logout
introspection_endpoint https://sso.dgov.mn/oauth2/introspect
revocation_endpoint https://sso.dgov.mn/oauth2/revoke
jwks_uri https://sso.dgov.mn/.well-known/jwks.json
response_types_supported code
grant_types_supported authorization_code, refresh_token, client_credentials
code_challenge_methods_supported S256
id_token_signing_alg_values_supported RS256
scopes_supported openid, profile, email, phone, offline_access, erp.read, erp.write
claims_supported iss, sub, aud, exp, iat, nonce, auth_time, email, email_verified, name, tenant_id

implicit ба password grant зарлагдаагүй. Хэрэв тэдгээрийг хайж байгаа бол холболтын загвараа өөрчил, провайдерийг биш.

tenant_id claim нь энэ экосистемийн онцлог: хүн зөвхөн хэн бэ гэдгээрээ биш, аль байгууллагын хүн бэ гэдгээрээ ирнэ.

1. Клиент бүртгүүлэх

sso-clients аппаар, эсвэл API-аар:

POST /api/v1/sso-clients/apps

client_id-г гараар сонгодоггүй: handleCreateApp нь app_ + нэрний slug + санамсаргүй найм гэж өөрөө гаргана (жишээ нь app_opendgovmn_28426259). Нууцыг үүсгэсэн тэр нэг хариунд л буцаана — сан digest хадгалдаг тул алдвал rotate-secret, сэргээх зам байхгүй.

Бүртгэлд заах зүйлс:

Талбар Утга
redirect_uris Аппын callback хаяг, бүтнээр нь
post_logout_redirect_uris Гарсны дараа хаашаа
grant_types authorization_code
scopes openid profile email
client_type confidential (нууц хадгалж чадах сервер талтай бол)

2. Redirect host зөвшөөрөх {#хостын-жагсаалт}

Аппын хостыг провайдерийн OAUTH_REDIRECT_HOSTS жагсаалтад нэмнэ. Тэр мөр нь sso-dgov-mn-ийн deploy/docker-compose.yml дотор — серверийн .env дотор биш: аль системүүд энэ нэвтрэлтээр ордог вэ гэдэг нь нууц биш, бүртгэл бөгөөд түүхтэйгээ хамт репод байх ёстой. Нэмээд push хийхэд роллаут өөрөө явна.

Энэ жагсаалт дэд домэйныг өвлүүлдэггүй. dgov.mn бичсэн нь open.dgov.mn-ийг зөвшөөрөхгүй; хост бүр яг таг бичигдэнэ. Одоогийн утга:

OAUTH_REDIRECT_HOSTS: ${OAUTH_REDIRECT_HOSTS:-open.dgov.mn,fuelnet.dgov.mn}

Мартвал шинж тэмдэг нь хоёр: консол дээр клиент бүртгэхэд «redirect URI host is not allowed» гэж татгалзана, эсвэл (аль хэдийн бүртгэгдсэн бол) нэвтрэлт эхэлж, нууц үг зөв, буцах агшинд провайдер redirect-ийг татгалзана. Бүртгэлийн redirect_uris зөв байсан ч энэ жагсаалт тусдаа шалгагддаг — хоёр газарт бичигдэх нь давхардал биш: нэг нь клиентийн зарласан зүйл, нөгөө нь суулгацын зөвшөөрсөн зүйл.

3. Аппаа тохируулах

Gerege Nexus дээр суурилсан апп бол дөрвөн мөр:

SSO_CLIENT_ISSUER=https://sso.dgov.mn
SSO_CLIENT_ID=app_…
SSO_CLIENT_SECRET=…              # хоосон бол public клиент, PKCE дангаараа барина
SSO_CLIENT_TENANT=dgov           # хоосон бол танихгүй хүнийг татгалзана

Callback нь цөмийн өгөгдмөл зам: /api/v1/auth/sso/callback.

Өөр стектэй апп бол ердийн OIDC: authorization_code + PKCE (S256), state ба nonce заавал, id_token-ыг jwks_uri-аас авсан түлхүүрээр шалгах, iss ба aud-ыг харьцуулах.

SSO_CLIENT_LOCAL_LOGIN

Клиент тал дээрх энэ тохируулга нь «эндэх нууц үг, eID-ийн нэвтрэлт мөн ажиллах уу» гэсэн асуулт.

open.dgov.mn дээр 2026-08-17-ноос false. Энэ нь аюулгүй байдлын хувьд зөв — нэг л газар нууц үг шалгагдана — гэхдээ sso.dgov.mn унавал шинэ нэвтрэлт бүхэлдээ зогсоно гэсэн үг. Буцах зам Runbook-ууд-д.

Иргэн юу хардаг вэ

Клиент анх хандахад sso.dgov.mn/oauth/consent дэлгэц гарч, аль scope-ыг өгөхийг хүний хэлээр жагсаана — openid нь «Таныг нэвтрүүлж, хэн болохыг баталгаажуулна», erp.read нь эмзэг гэж тэмдэглэгдэнэ. Иргэн зөвшөөрсний дараа тэр шийдвэр хадгалагдаж, дараагийн удаа асуухгүй; клиент илүү өргөн scope хүсэх өдөр л дахин асууна.

Шалгах

# discovery ирж байна уу
curl -s https://sso.dgov.mn/.well-known/openid-configuration | jq .issuer

# түлхүүрүүд ирж байна уу
curl -s https://sso.dgov.mn/.well-known/jwks.json | jq '.keys | length'

Хөтчөөр бүтэн урсгалыг өнгөрөөх нь эцсийн шалгалт: клиентээс эхэлж, sso.dgov.mn дээр нэвтэрч, буцаж ирээд сесстэй болсон эсэх.