@gerege-systems/eid-mongolia-sdk 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -3
- package/dist/{browser-BU9ShPWO.d.cts → browser-Db82DlYN.d.cts} +80 -3
- package/dist/{browser-BU9ShPWO.d.ts → browser-Db82DlYN.d.ts} +80 -3
- package/dist/browser.d.cts +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-Q5TQMCJC.js → chunk-NXDKQZIW.js} +18 -1
- package/dist/index.cjs +451 -10
- package/dist/index.d.cts +215 -4
- package/dist/index.d.ts +215 -4
- package/dist/index.js +427 -10
- package/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, A as AcspContext, F as FlowType } from './browser-
|
|
2
|
-
export {
|
|
1
|
+
import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, b as RepresentationsResponse, A as AcspContext, F as FlowType, E as EidError } from './browser-Db82DlYN.cjs';
|
|
2
|
+
export { c as ApiError, d as AuthenticationError, e as DeviceLinkError, f as DeviceLinkInput, g as EndResult, h as ForbiddenError, i as NavigatorLike, j as NetworkError, O as ON_BEHALF_ERROR_CODES, k as OnBehalfErrorCode, l as OpenOrShowQROptions, m as OrgResult, P as PdfDocumentStatus, n as PdfSessionBlock, o as PdfSigner, p as Representation, q as SessionFailedError, r as SessionState, s as SignatureAlgorithmParameters, t as SignatureProtocol, V as ValidationError, u as deviceLink, v as isMobileUserAgent, w as openOrShowQR } from './browser-Db82DlYN.cjs';
|
|
3
3
|
import { X509Certificate, KeyObject } from 'node:crypto';
|
|
4
4
|
|
|
5
5
|
interface HttpConfig {
|
|
@@ -23,7 +23,12 @@ declare class Http {
|
|
|
23
23
|
constructor(cfg: HttpConfig);
|
|
24
24
|
post(path: string, body: unknown, timeoutMs?: number): Promise<unknown>;
|
|
25
25
|
get(path: string, timeoutMs?: number): Promise<unknown>;
|
|
26
|
-
|
|
26
|
+
/** multipart/form-data POST (Content-Type-ийг boundary-тай нь fetch тавина). JSON хариу. */
|
|
27
|
+
postMultipart(path: string, form: FormData, timeoutMs?: number): Promise<unknown>;
|
|
28
|
+
/** GET — хариуг байтаар (ж: гарын үсэгтэй PDF). */
|
|
29
|
+
getBytes(path: string, timeoutMs?: number): Promise<Uint8Array>;
|
|
30
|
+
private json;
|
|
31
|
+
private send;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
interface AuthDefaults {
|
|
@@ -131,6 +136,73 @@ declare class SessionApi {
|
|
|
131
136
|
}): Promise<SessionResult>;
|
|
132
137
|
}
|
|
133
138
|
|
|
139
|
+
interface PdfDefaults {
|
|
140
|
+
certificateLevel: CertificateLevel;
|
|
141
|
+
}
|
|
142
|
+
/** Гарын үсэг зурагч — яг нэг нь. */
|
|
143
|
+
type PdfSignerRef = {
|
|
144
|
+
etsi: string;
|
|
145
|
+
} | {
|
|
146
|
+
documentNumber: string;
|
|
147
|
+
} | {
|
|
148
|
+
certificateChoiceSessionId: string;
|
|
149
|
+
};
|
|
150
|
+
interface PdfPrepareInput {
|
|
151
|
+
/** Эх PDF (≤ 10 223 616 байт — `/.well-known/eid` `pdfSigning.maxInputBytes`). */
|
|
152
|
+
pdf: Uint8Array;
|
|
153
|
+
/** Баримтын нэр (≤ 120 тэмдэгт) — /verify хуудас, иргэний түүхэнд харагдана. */
|
|
154
|
+
fileName: string;
|
|
155
|
+
signer: PdfSignerRef;
|
|
156
|
+
/** `notification` (push) эсвэл `device-link` (QR/Web2App/App2App). Анхдагч notification. */
|
|
157
|
+
flow?: "notification" | "device-link";
|
|
158
|
+
certificateLevel?: CertificateLevel;
|
|
159
|
+
/** device-link Web2App/App2App буцах URL. */
|
|
160
|
+
initialCallbackUrl?: string;
|
|
161
|
+
/** Олон гарын үсэгтэй баримтад хүлээж буй docID (заавал биш — CA өөрөө олно). */
|
|
162
|
+
docID?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Байгууллагын нэрийн өмнөөс: байгууллагын ETSI (`NTRMN-<бүртгэл>`). Сервер төлөөллийг prepare-д ба баримт
|
|
165
|
+
* угсрахын өмнө дахин шалгана; татгалзвал `ForbiddenError`/`ApiError` `.code` ({@link OnBehalfErrorCode}).
|
|
166
|
+
*/
|
|
167
|
+
onBehalfOf?: string;
|
|
168
|
+
}
|
|
169
|
+
/** prepare-ийн хариу. device-link-д `deviceLink` (digest/interactions-ийг authCode-д ЯГ ХЭВЭЭР). */
|
|
170
|
+
interface PdfPrepareSession {
|
|
171
|
+
sessionId: string;
|
|
172
|
+
docId: string;
|
|
173
|
+
/** Иргэнд ХАРУУЛАХ баталгаажуулах код (ПИН биш). */
|
|
174
|
+
vc: string | null;
|
|
175
|
+
deviceLink: {
|
|
176
|
+
sessionToken: string;
|
|
177
|
+
sessionSecret: string;
|
|
178
|
+
deviceLinkBase: string;
|
|
179
|
+
digest: string;
|
|
180
|
+
interactions: string;
|
|
181
|
+
} | null;
|
|
182
|
+
/** SDK хариу хүлээн авсан мөч (ms epoch) — QR-ийн `receivedAt` ({@link buildDeviceLink}). */
|
|
183
|
+
receivedAt: number;
|
|
184
|
+
}
|
|
185
|
+
declare class PdfApi {
|
|
186
|
+
private readonly http;
|
|
187
|
+
private readonly creds;
|
|
188
|
+
private readonly defaults;
|
|
189
|
+
constructor(http: Http, creds: RpCredentials, defaults: PdfDefaults);
|
|
190
|
+
/** POST /pdf/sign/prepare — multipart (`request` JSON + `pdf`). SIGN эрх шаардана. */
|
|
191
|
+
prepare(input: PdfPrepareInput): Promise<PdfPrepareSession>;
|
|
192
|
+
/**
|
|
193
|
+
* GET /pdf/sign/{sessionID}/document — гарын үсэгтэй PDF (READY-ээс хойш 30 мин). Татсан байтын SHA-256-ийг
|
|
194
|
+
* session-ий `pdf.outSha256`-тай тулга. Эрх хасагдсан бол `ForbiddenError` `.code = "REPRESENTATION_REVOKED"`.
|
|
195
|
+
*/
|
|
196
|
+
document(sessionId: string): Promise<Uint8Array>;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
declare class OrganizationApi {
|
|
200
|
+
private readonly http;
|
|
201
|
+
constructor(http: Http);
|
|
202
|
+
/** GET /organization/representations/etsi/{personEtsi}. Сонголт нь итгэх эх биш — сервер дахин шалгана. */
|
|
203
|
+
getRepresentations(personEtsi: string): Promise<RepresentationsResponse>;
|
|
204
|
+
}
|
|
205
|
+
|
|
134
206
|
/**
|
|
135
207
|
* validateAuth-ийн нэмэлт шалгалт — RP ЯМАР урсгал эхлүүлснээ мэддэг тул түүнийг тулгана
|
|
136
208
|
* (device-link relay хаалт).
|
|
@@ -283,6 +355,8 @@ declare function resolveBaseUrl(baseUrl: string | undefined): string;
|
|
|
283
355
|
declare class EidClient {
|
|
284
356
|
readonly auth: AuthApi;
|
|
285
357
|
readonly sign: SignApi;
|
|
358
|
+
readonly pdf: PdfApi;
|
|
359
|
+
readonly organization: OrganizationApi;
|
|
286
360
|
readonly session: SessionApi;
|
|
287
361
|
readonly validator: ResponseValidator;
|
|
288
362
|
constructor(cfg: ClientConfig);
|
|
@@ -383,4 +457,141 @@ interface QrDeviceLinkTickerOptions {
|
|
|
383
457
|
*/
|
|
384
458
|
declare function qrDeviceLinkTicker(input: Omit<BuildDeviceLinkInput, "deviceLinkType" | "now">, onLink: (link: string) => void, opts?: QrDeviceLinkTickerOptions): () => void;
|
|
385
459
|
|
|
386
|
-
|
|
460
|
+
/** eID-ийн OIDC issuer (төгсгөлд `/` байхгүй). */
|
|
461
|
+
declare const EID_OIDC_ISSUER = "https://login.eidmongolia.mn";
|
|
462
|
+
/** `acr` утгууд — иргэний гэрчилгээний бодит түвшин. */
|
|
463
|
+
declare const EID_ACR_QUALIFIED = "urn:eidmongolia:loa:qualified";
|
|
464
|
+
declare const EID_ACR_ADVANCED = "urn:eidmongolia:loa:advanced";
|
|
465
|
+
/**
|
|
466
|
+
* OIDC алдааны код. Authorize redirect (RFC 6749 §4.1.2.1) ба token endpoint (§5.2)-ийн стандарт кодууд, мөн
|
|
467
|
+
* SDK-ийн өөрийн шалгалтын кодууд:
|
|
468
|
+
* - `state_mismatch` — callback-ийн `state` хадгалсантай таарсангүй (CSRF / өөр tab / cookie дууссан) → дахин эхлүүл;
|
|
469
|
+
* - `invalid_callback` — `code` алга / хэт урт, эсвэл `iss` параметр өөр;
|
|
470
|
+
* - `invalid_id_token` — id_token-ий гарын үсэг / iss / aud / exp / iat / nonce шалгалт унасан (ИТГЭХГҮЙ);
|
|
471
|
+
* - `discovery_failed` — discovery/JWKS буруу эсвэл issuer таарахгүй.
|
|
472
|
+
*
|
|
473
|
+
* `access_denied` = иргэн татгалзсан, нэвтрэлтийн хугацаа дууссан, эсвэл гэрчилгээний шалгалт унасан → «дахин оролд».
|
|
474
|
+
*/
|
|
475
|
+
type EidOidcErrorCode = "access_denied" | "login_required" | "invalid_request" | "invalid_scope" | "unauthorized_client" | "unsupported_response_type" | "request_not_supported" | "temporarily_unavailable" | "server_error" | "invalid_client" | "invalid_grant" | "unsupported_grant_type" | "state_mismatch" | "invalid_callback" | "invalid_id_token" | "discovery_failed";
|
|
476
|
+
/**
|
|
477
|
+
* OIDC урсгалын алдаа. `code`-оор салгана. `description` нь серверийн `error_description` — логт л,
|
|
478
|
+
* хэрэглэгчид шууд харуулахгүй.
|
|
479
|
+
*/
|
|
480
|
+
declare class EidOidcError extends EidError {
|
|
481
|
+
readonly code: EidOidcErrorCode;
|
|
482
|
+
readonly description?: string | undefined;
|
|
483
|
+
constructor(code: EidOidcErrorCode, message: string, description?: string | undefined);
|
|
484
|
+
}
|
|
485
|
+
interface EidOidcClientConfig {
|
|
486
|
+
/** RP UUID (`relyingPartyUUID`). */
|
|
487
|
+
clientId: string;
|
|
488
|
+
/** RP API secret (`rp_sk_…`) — зөвхөн backend-д. */
|
|
489
|
+
clientSecret: string;
|
|
490
|
+
/** Бүртгэлтэй redirect URI — тэмдэгт бүрээрээ таарах ёстой. */
|
|
491
|
+
redirectUri: string;
|
|
492
|
+
/** Анхдагч {@link EID_OIDC_ISSUER}. */
|
|
493
|
+
issuer?: string;
|
|
494
|
+
/** Анхдагч `"openid"`. Иргэний ETSI дугаар хэрэгтэй бол `"openid pnomn"` (RP-д `PNOMN` эрх). */
|
|
495
|
+
scope?: string;
|
|
496
|
+
/** HTTP timeout (мс), анхдагч 10000. */
|
|
497
|
+
timeoutMs?: number;
|
|
498
|
+
/** fetch орлуулагч (тест). */
|
|
499
|
+
fetchImpl?: typeof fetch;
|
|
500
|
+
}
|
|
501
|
+
interface EidOidcDiscovery {
|
|
502
|
+
issuer: string;
|
|
503
|
+
authorization_endpoint: string;
|
|
504
|
+
token_endpoint: string;
|
|
505
|
+
jwks_uri: string;
|
|
506
|
+
[k: string]: unknown;
|
|
507
|
+
}
|
|
508
|
+
interface CreateAuthorizationOptions {
|
|
509
|
+
/** Энэ хүсэлтэд scope-ыг дарна. */
|
|
510
|
+
scope?: string;
|
|
511
|
+
/**
|
|
512
|
+
* `touch` (анхдагч) — утасны хөтчөөс шууд eID апп; `page` — үргэлж нэвтрэх хуудас (QR / push), ж: таблет киоск.
|
|
513
|
+
*/
|
|
514
|
+
display?: "page" | "touch";
|
|
515
|
+
}
|
|
516
|
+
/** RP-ийн хадгалах ёстой гүйлгээ — httpOnly cookie / server session-д (браузерийн JS-д биш). */
|
|
517
|
+
interface EidAuthorization {
|
|
518
|
+
/** Хөтчийг энэ рүү 302. */
|
|
519
|
+
url: string;
|
|
520
|
+
state: string;
|
|
521
|
+
nonce: string;
|
|
522
|
+
codeVerifier: string;
|
|
523
|
+
}
|
|
524
|
+
/** createAuthorization-аас хадгалсан утгууд. */
|
|
525
|
+
interface EidCallbackChecks {
|
|
526
|
+
state: string;
|
|
527
|
+
nonce: string;
|
|
528
|
+
codeVerifier: string;
|
|
529
|
+
}
|
|
530
|
+
/** id_token-ий claim-ууд (`docs/OIDC.md` §4). */
|
|
531
|
+
interface EidIdTokenClaims {
|
|
532
|
+
iss: string;
|
|
533
|
+
aud: string | string[];
|
|
534
|
+
azp?: string;
|
|
535
|
+
/** Pairwise — RP тус бүрд өөр, иргэнд тогтмол. Хэрэглэгчийг ҮҮГЭЭР таньна. */
|
|
536
|
+
sub: string;
|
|
537
|
+
exp: number;
|
|
538
|
+
iat: number;
|
|
539
|
+
nonce: string;
|
|
540
|
+
/** Иргэн баталгаажуулсан мөч (Unix сек). */
|
|
541
|
+
auth_time: number;
|
|
542
|
+
/** {@link EID_ACR_QUALIFIED} эсвэл {@link EID_ACR_ADVANCED}. */
|
|
543
|
+
acr: string;
|
|
544
|
+
/** Гэрчилгээний GIVENNAME — латин (ICAO, том үсэг). */
|
|
545
|
+
given_name: string;
|
|
546
|
+
/** Гэрчилгээний SURNAME (эцэг/эхийн нэр) — латин. */
|
|
547
|
+
family_name: string;
|
|
548
|
+
/** Нэр — кирилл (бүртгэлд байхгүй бол алга). */
|
|
549
|
+
given_name_mn?: string;
|
|
550
|
+
/** Эцэг/эхийн нэр — кирилл (бүртгэлд байхгүй бол алга). */
|
|
551
|
+
family_name_mn?: string;
|
|
552
|
+
/** `PNOMN-<иргэний дугаар>` — зөвхөн `pnomn` scope + `PNOMN` эрхтэй үед. */
|
|
553
|
+
pnomn?: string;
|
|
554
|
+
[k: string]: unknown;
|
|
555
|
+
}
|
|
556
|
+
interface EidCallbackResult {
|
|
557
|
+
claims: EidIdTokenClaims;
|
|
558
|
+
idToken: string;
|
|
559
|
+
}
|
|
560
|
+
declare class EidOidcClient {
|
|
561
|
+
private readonly cfg;
|
|
562
|
+
readonly issuer: string;
|
|
563
|
+
private readonly scope;
|
|
564
|
+
private discovery?;
|
|
565
|
+
private jwks?;
|
|
566
|
+
constructor(cfg: EidOidcClientConfig);
|
|
567
|
+
/** Discovery document (1 цаг cache). `issuer` нь тохиргоотой яг таарах ёстой (OIDC Discovery §4.3). */
|
|
568
|
+
discover(): Promise<EidOidcDiscovery>;
|
|
569
|
+
private fetchDiscovery;
|
|
570
|
+
/**
|
|
571
|
+
* Authorize URL + санамсаргүй state / nonce / PKCE codeVerifier. RP буцаасан `state`, `nonce`, `codeVerifier`-ийг
|
|
572
|
+
* хөтчийн session-тэй холбож (httpOnly cookie эсвэл server session) хадгалаад хөтчийг `url` руу 302 хийнэ.
|
|
573
|
+
*/
|
|
574
|
+
createAuthorization(opts?: CreateAuthorizationOptions): Promise<EidAuthorization>;
|
|
575
|
+
/**
|
|
576
|
+
* redirect_uri руу ирсэн callback-ийг шийднэ: state тулгах → `error` бол {@link EidOidcError} → code солих →
|
|
577
|
+
* id_token шалгах. `input` — бүтэн callback URL, харьцангуй зам (`/cb?code=…`) эсвэл query (`URLSearchParams` / `code=…&state=…`); зөвхөн query-г уншина.
|
|
578
|
+
* Амжилтгүй бүх тохиолдолд {@link EidOidcError} (эсвэл {@link NetworkError}) шиднэ.
|
|
579
|
+
*/
|
|
580
|
+
handleCallback(input: string | URL | URLSearchParams, checks: EidCallbackChecks): Promise<EidCallbackResult>;
|
|
581
|
+
/** `POST token_endpoint` (client_secret_basic, RFC 6749 §2.3.1) → id_token. */
|
|
582
|
+
private exchangeCode;
|
|
583
|
+
/**
|
|
584
|
+
* id_token шалгана: JWKS (`kid`, cache; танихгүй kid → нэг удаа дахин татна) ES256 гарын үсэг, `iss`, `aud`
|
|
585
|
+
* (= clientId; олон aud бол `azp`), `exp`/`iat` (±60 сек), `nonce`. Амжилтгүй бол `invalid_id_token`.
|
|
586
|
+
*/
|
|
587
|
+
verifyIdToken(idToken: string, opts: {
|
|
588
|
+
nonce: string;
|
|
589
|
+
}): Promise<EidIdTokenClaims>;
|
|
590
|
+
private keys;
|
|
591
|
+
private getJson;
|
|
592
|
+
private fetch;
|
|
593
|
+
}
|
|
594
|
+
/** PKCE S256: `BASE64URL(SHA-256(ASCII(code_verifier)))` (RFC 7636 §4.2). */
|
|
595
|
+
declare function pkceChallenge(codeVerifier: string): Promise<string>;
|
|
596
|
+
|
|
597
|
+
export { AcspContext, type AcspV2Params, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CertificateLevel, type ClientConfig, type CreateAuthorizationOptions, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EID_ACR_ADVANCED, EID_ACR_QUALIFIED, EID_OIDC_ISSUER, type EidAuthorization, type EidCallbackChecks, type EidCallbackResult, EidClient, EidError, type EidIdTokenClaims, EidOidcClient, type EidOidcClientConfig, type EidOidcDiscovery, EidOidcError, type EidOidcErrorCode, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PdfApi, type PdfDefaults, type PdfPrepareInput, type PdfPrepareSession, type PdfSignerRef, type QrDeviceLinkTickerOptions, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type TrustConfig, type ValidateAuthOptions, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, buildDeviceLink, interactionsToBase64, parseSessionResult, pkceChallenge, qrDeviceLinkTicker, randomChallenge, resolveBaseUrl, sha256Base64, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, A as AcspContext, F as FlowType } from './browser-
|
|
2
|
-
export {
|
|
1
|
+
import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, b as RepresentationsResponse, A as AcspContext, F as FlowType, E as EidError } from './browser-Db82DlYN.js';
|
|
2
|
+
export { c as ApiError, d as AuthenticationError, e as DeviceLinkError, f as DeviceLinkInput, g as EndResult, h as ForbiddenError, i as NavigatorLike, j as NetworkError, O as ON_BEHALF_ERROR_CODES, k as OnBehalfErrorCode, l as OpenOrShowQROptions, m as OrgResult, P as PdfDocumentStatus, n as PdfSessionBlock, o as PdfSigner, p as Representation, q as SessionFailedError, r as SessionState, s as SignatureAlgorithmParameters, t as SignatureProtocol, V as ValidationError, u as deviceLink, v as isMobileUserAgent, w as openOrShowQR } from './browser-Db82DlYN.js';
|
|
3
3
|
import { X509Certificate, KeyObject } from 'node:crypto';
|
|
4
4
|
|
|
5
5
|
interface HttpConfig {
|
|
@@ -23,7 +23,12 @@ declare class Http {
|
|
|
23
23
|
constructor(cfg: HttpConfig);
|
|
24
24
|
post(path: string, body: unknown, timeoutMs?: number): Promise<unknown>;
|
|
25
25
|
get(path: string, timeoutMs?: number): Promise<unknown>;
|
|
26
|
-
|
|
26
|
+
/** multipart/form-data POST (Content-Type-ийг boundary-тай нь fetch тавина). JSON хариу. */
|
|
27
|
+
postMultipart(path: string, form: FormData, timeoutMs?: number): Promise<unknown>;
|
|
28
|
+
/** GET — хариуг байтаар (ж: гарын үсэгтэй PDF). */
|
|
29
|
+
getBytes(path: string, timeoutMs?: number): Promise<Uint8Array>;
|
|
30
|
+
private json;
|
|
31
|
+
private send;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
interface AuthDefaults {
|
|
@@ -131,6 +136,73 @@ declare class SessionApi {
|
|
|
131
136
|
}): Promise<SessionResult>;
|
|
132
137
|
}
|
|
133
138
|
|
|
139
|
+
interface PdfDefaults {
|
|
140
|
+
certificateLevel: CertificateLevel;
|
|
141
|
+
}
|
|
142
|
+
/** Гарын үсэг зурагч — яг нэг нь. */
|
|
143
|
+
type PdfSignerRef = {
|
|
144
|
+
etsi: string;
|
|
145
|
+
} | {
|
|
146
|
+
documentNumber: string;
|
|
147
|
+
} | {
|
|
148
|
+
certificateChoiceSessionId: string;
|
|
149
|
+
};
|
|
150
|
+
interface PdfPrepareInput {
|
|
151
|
+
/** Эх PDF (≤ 10 223 616 байт — `/.well-known/eid` `pdfSigning.maxInputBytes`). */
|
|
152
|
+
pdf: Uint8Array;
|
|
153
|
+
/** Баримтын нэр (≤ 120 тэмдэгт) — /verify хуудас, иргэний түүхэнд харагдана. */
|
|
154
|
+
fileName: string;
|
|
155
|
+
signer: PdfSignerRef;
|
|
156
|
+
/** `notification` (push) эсвэл `device-link` (QR/Web2App/App2App). Анхдагч notification. */
|
|
157
|
+
flow?: "notification" | "device-link";
|
|
158
|
+
certificateLevel?: CertificateLevel;
|
|
159
|
+
/** device-link Web2App/App2App буцах URL. */
|
|
160
|
+
initialCallbackUrl?: string;
|
|
161
|
+
/** Олон гарын үсэгтэй баримтад хүлээж буй docID (заавал биш — CA өөрөө олно). */
|
|
162
|
+
docID?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Байгууллагын нэрийн өмнөөс: байгууллагын ETSI (`NTRMN-<бүртгэл>`). Сервер төлөөллийг prepare-д ба баримт
|
|
165
|
+
* угсрахын өмнө дахин шалгана; татгалзвал `ForbiddenError`/`ApiError` `.code` ({@link OnBehalfErrorCode}).
|
|
166
|
+
*/
|
|
167
|
+
onBehalfOf?: string;
|
|
168
|
+
}
|
|
169
|
+
/** prepare-ийн хариу. device-link-д `deviceLink` (digest/interactions-ийг authCode-д ЯГ ХЭВЭЭР). */
|
|
170
|
+
interface PdfPrepareSession {
|
|
171
|
+
sessionId: string;
|
|
172
|
+
docId: string;
|
|
173
|
+
/** Иргэнд ХАРУУЛАХ баталгаажуулах код (ПИН биш). */
|
|
174
|
+
vc: string | null;
|
|
175
|
+
deviceLink: {
|
|
176
|
+
sessionToken: string;
|
|
177
|
+
sessionSecret: string;
|
|
178
|
+
deviceLinkBase: string;
|
|
179
|
+
digest: string;
|
|
180
|
+
interactions: string;
|
|
181
|
+
} | null;
|
|
182
|
+
/** SDK хариу хүлээн авсан мөч (ms epoch) — QR-ийн `receivedAt` ({@link buildDeviceLink}). */
|
|
183
|
+
receivedAt: number;
|
|
184
|
+
}
|
|
185
|
+
declare class PdfApi {
|
|
186
|
+
private readonly http;
|
|
187
|
+
private readonly creds;
|
|
188
|
+
private readonly defaults;
|
|
189
|
+
constructor(http: Http, creds: RpCredentials, defaults: PdfDefaults);
|
|
190
|
+
/** POST /pdf/sign/prepare — multipart (`request` JSON + `pdf`). SIGN эрх шаардана. */
|
|
191
|
+
prepare(input: PdfPrepareInput): Promise<PdfPrepareSession>;
|
|
192
|
+
/**
|
|
193
|
+
* GET /pdf/sign/{sessionID}/document — гарын үсэгтэй PDF (READY-ээс хойш 30 мин). Татсан байтын SHA-256-ийг
|
|
194
|
+
* session-ий `pdf.outSha256`-тай тулга. Эрх хасагдсан бол `ForbiddenError` `.code = "REPRESENTATION_REVOKED"`.
|
|
195
|
+
*/
|
|
196
|
+
document(sessionId: string): Promise<Uint8Array>;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
declare class OrganizationApi {
|
|
200
|
+
private readonly http;
|
|
201
|
+
constructor(http: Http);
|
|
202
|
+
/** GET /organization/representations/etsi/{personEtsi}. Сонголт нь итгэх эх биш — сервер дахин шалгана. */
|
|
203
|
+
getRepresentations(personEtsi: string): Promise<RepresentationsResponse>;
|
|
204
|
+
}
|
|
205
|
+
|
|
134
206
|
/**
|
|
135
207
|
* validateAuth-ийн нэмэлт шалгалт — RP ЯМАР урсгал эхлүүлснээ мэддэг тул түүнийг тулгана
|
|
136
208
|
* (device-link relay хаалт).
|
|
@@ -283,6 +355,8 @@ declare function resolveBaseUrl(baseUrl: string | undefined): string;
|
|
|
283
355
|
declare class EidClient {
|
|
284
356
|
readonly auth: AuthApi;
|
|
285
357
|
readonly sign: SignApi;
|
|
358
|
+
readonly pdf: PdfApi;
|
|
359
|
+
readonly organization: OrganizationApi;
|
|
286
360
|
readonly session: SessionApi;
|
|
287
361
|
readonly validator: ResponseValidator;
|
|
288
362
|
constructor(cfg: ClientConfig);
|
|
@@ -383,4 +457,141 @@ interface QrDeviceLinkTickerOptions {
|
|
|
383
457
|
*/
|
|
384
458
|
declare function qrDeviceLinkTicker(input: Omit<BuildDeviceLinkInput, "deviceLinkType" | "now">, onLink: (link: string) => void, opts?: QrDeviceLinkTickerOptions): () => void;
|
|
385
459
|
|
|
386
|
-
|
|
460
|
+
/** eID-ийн OIDC issuer (төгсгөлд `/` байхгүй). */
|
|
461
|
+
declare const EID_OIDC_ISSUER = "https://login.eidmongolia.mn";
|
|
462
|
+
/** `acr` утгууд — иргэний гэрчилгээний бодит түвшин. */
|
|
463
|
+
declare const EID_ACR_QUALIFIED = "urn:eidmongolia:loa:qualified";
|
|
464
|
+
declare const EID_ACR_ADVANCED = "urn:eidmongolia:loa:advanced";
|
|
465
|
+
/**
|
|
466
|
+
* OIDC алдааны код. Authorize redirect (RFC 6749 §4.1.2.1) ба token endpoint (§5.2)-ийн стандарт кодууд, мөн
|
|
467
|
+
* SDK-ийн өөрийн шалгалтын кодууд:
|
|
468
|
+
* - `state_mismatch` — callback-ийн `state` хадгалсантай таарсангүй (CSRF / өөр tab / cookie дууссан) → дахин эхлүүл;
|
|
469
|
+
* - `invalid_callback` — `code` алга / хэт урт, эсвэл `iss` параметр өөр;
|
|
470
|
+
* - `invalid_id_token` — id_token-ий гарын үсэг / iss / aud / exp / iat / nonce шалгалт унасан (ИТГЭХГҮЙ);
|
|
471
|
+
* - `discovery_failed` — discovery/JWKS буруу эсвэл issuer таарахгүй.
|
|
472
|
+
*
|
|
473
|
+
* `access_denied` = иргэн татгалзсан, нэвтрэлтийн хугацаа дууссан, эсвэл гэрчилгээний шалгалт унасан → «дахин оролд».
|
|
474
|
+
*/
|
|
475
|
+
type EidOidcErrorCode = "access_denied" | "login_required" | "invalid_request" | "invalid_scope" | "unauthorized_client" | "unsupported_response_type" | "request_not_supported" | "temporarily_unavailable" | "server_error" | "invalid_client" | "invalid_grant" | "unsupported_grant_type" | "state_mismatch" | "invalid_callback" | "invalid_id_token" | "discovery_failed";
|
|
476
|
+
/**
|
|
477
|
+
* OIDC урсгалын алдаа. `code`-оор салгана. `description` нь серверийн `error_description` — логт л,
|
|
478
|
+
* хэрэглэгчид шууд харуулахгүй.
|
|
479
|
+
*/
|
|
480
|
+
declare class EidOidcError extends EidError {
|
|
481
|
+
readonly code: EidOidcErrorCode;
|
|
482
|
+
readonly description?: string | undefined;
|
|
483
|
+
constructor(code: EidOidcErrorCode, message: string, description?: string | undefined);
|
|
484
|
+
}
|
|
485
|
+
interface EidOidcClientConfig {
|
|
486
|
+
/** RP UUID (`relyingPartyUUID`). */
|
|
487
|
+
clientId: string;
|
|
488
|
+
/** RP API secret (`rp_sk_…`) — зөвхөн backend-д. */
|
|
489
|
+
clientSecret: string;
|
|
490
|
+
/** Бүртгэлтэй redirect URI — тэмдэгт бүрээрээ таарах ёстой. */
|
|
491
|
+
redirectUri: string;
|
|
492
|
+
/** Анхдагч {@link EID_OIDC_ISSUER}. */
|
|
493
|
+
issuer?: string;
|
|
494
|
+
/** Анхдагч `"openid"`. Иргэний ETSI дугаар хэрэгтэй бол `"openid pnomn"` (RP-д `PNOMN` эрх). */
|
|
495
|
+
scope?: string;
|
|
496
|
+
/** HTTP timeout (мс), анхдагч 10000. */
|
|
497
|
+
timeoutMs?: number;
|
|
498
|
+
/** fetch орлуулагч (тест). */
|
|
499
|
+
fetchImpl?: typeof fetch;
|
|
500
|
+
}
|
|
501
|
+
interface EidOidcDiscovery {
|
|
502
|
+
issuer: string;
|
|
503
|
+
authorization_endpoint: string;
|
|
504
|
+
token_endpoint: string;
|
|
505
|
+
jwks_uri: string;
|
|
506
|
+
[k: string]: unknown;
|
|
507
|
+
}
|
|
508
|
+
interface CreateAuthorizationOptions {
|
|
509
|
+
/** Энэ хүсэлтэд scope-ыг дарна. */
|
|
510
|
+
scope?: string;
|
|
511
|
+
/**
|
|
512
|
+
* `touch` (анхдагч) — утасны хөтчөөс шууд eID апп; `page` — үргэлж нэвтрэх хуудас (QR / push), ж: таблет киоск.
|
|
513
|
+
*/
|
|
514
|
+
display?: "page" | "touch";
|
|
515
|
+
}
|
|
516
|
+
/** RP-ийн хадгалах ёстой гүйлгээ — httpOnly cookie / server session-д (браузерийн JS-д биш). */
|
|
517
|
+
interface EidAuthorization {
|
|
518
|
+
/** Хөтчийг энэ рүү 302. */
|
|
519
|
+
url: string;
|
|
520
|
+
state: string;
|
|
521
|
+
nonce: string;
|
|
522
|
+
codeVerifier: string;
|
|
523
|
+
}
|
|
524
|
+
/** createAuthorization-аас хадгалсан утгууд. */
|
|
525
|
+
interface EidCallbackChecks {
|
|
526
|
+
state: string;
|
|
527
|
+
nonce: string;
|
|
528
|
+
codeVerifier: string;
|
|
529
|
+
}
|
|
530
|
+
/** id_token-ий claim-ууд (`docs/OIDC.md` §4). */
|
|
531
|
+
interface EidIdTokenClaims {
|
|
532
|
+
iss: string;
|
|
533
|
+
aud: string | string[];
|
|
534
|
+
azp?: string;
|
|
535
|
+
/** Pairwise — RP тус бүрд өөр, иргэнд тогтмол. Хэрэглэгчийг ҮҮГЭЭР таньна. */
|
|
536
|
+
sub: string;
|
|
537
|
+
exp: number;
|
|
538
|
+
iat: number;
|
|
539
|
+
nonce: string;
|
|
540
|
+
/** Иргэн баталгаажуулсан мөч (Unix сек). */
|
|
541
|
+
auth_time: number;
|
|
542
|
+
/** {@link EID_ACR_QUALIFIED} эсвэл {@link EID_ACR_ADVANCED}. */
|
|
543
|
+
acr: string;
|
|
544
|
+
/** Гэрчилгээний GIVENNAME — латин (ICAO, том үсэг). */
|
|
545
|
+
given_name: string;
|
|
546
|
+
/** Гэрчилгээний SURNAME (эцэг/эхийн нэр) — латин. */
|
|
547
|
+
family_name: string;
|
|
548
|
+
/** Нэр — кирилл (бүртгэлд байхгүй бол алга). */
|
|
549
|
+
given_name_mn?: string;
|
|
550
|
+
/** Эцэг/эхийн нэр — кирилл (бүртгэлд байхгүй бол алга). */
|
|
551
|
+
family_name_mn?: string;
|
|
552
|
+
/** `PNOMN-<иргэний дугаар>` — зөвхөн `pnomn` scope + `PNOMN` эрхтэй үед. */
|
|
553
|
+
pnomn?: string;
|
|
554
|
+
[k: string]: unknown;
|
|
555
|
+
}
|
|
556
|
+
interface EidCallbackResult {
|
|
557
|
+
claims: EidIdTokenClaims;
|
|
558
|
+
idToken: string;
|
|
559
|
+
}
|
|
560
|
+
declare class EidOidcClient {
|
|
561
|
+
private readonly cfg;
|
|
562
|
+
readonly issuer: string;
|
|
563
|
+
private readonly scope;
|
|
564
|
+
private discovery?;
|
|
565
|
+
private jwks?;
|
|
566
|
+
constructor(cfg: EidOidcClientConfig);
|
|
567
|
+
/** Discovery document (1 цаг cache). `issuer` нь тохиргоотой яг таарах ёстой (OIDC Discovery §4.3). */
|
|
568
|
+
discover(): Promise<EidOidcDiscovery>;
|
|
569
|
+
private fetchDiscovery;
|
|
570
|
+
/**
|
|
571
|
+
* Authorize URL + санамсаргүй state / nonce / PKCE codeVerifier. RP буцаасан `state`, `nonce`, `codeVerifier`-ийг
|
|
572
|
+
* хөтчийн session-тэй холбож (httpOnly cookie эсвэл server session) хадгалаад хөтчийг `url` руу 302 хийнэ.
|
|
573
|
+
*/
|
|
574
|
+
createAuthorization(opts?: CreateAuthorizationOptions): Promise<EidAuthorization>;
|
|
575
|
+
/**
|
|
576
|
+
* redirect_uri руу ирсэн callback-ийг шийднэ: state тулгах → `error` бол {@link EidOidcError} → code солих →
|
|
577
|
+
* id_token шалгах. `input` — бүтэн callback URL, харьцангуй зам (`/cb?code=…`) эсвэл query (`URLSearchParams` / `code=…&state=…`); зөвхөн query-г уншина.
|
|
578
|
+
* Амжилтгүй бүх тохиолдолд {@link EidOidcError} (эсвэл {@link NetworkError}) шиднэ.
|
|
579
|
+
*/
|
|
580
|
+
handleCallback(input: string | URL | URLSearchParams, checks: EidCallbackChecks): Promise<EidCallbackResult>;
|
|
581
|
+
/** `POST token_endpoint` (client_secret_basic, RFC 6749 §2.3.1) → id_token. */
|
|
582
|
+
private exchangeCode;
|
|
583
|
+
/**
|
|
584
|
+
* id_token шалгана: JWKS (`kid`, cache; танихгүй kid → нэг удаа дахин татна) ES256 гарын үсэг, `iss`, `aud`
|
|
585
|
+
* (= clientId; олон aud бол `azp`), `exp`/`iat` (±60 сек), `nonce`. Амжилтгүй бол `invalid_id_token`.
|
|
586
|
+
*/
|
|
587
|
+
verifyIdToken(idToken: string, opts: {
|
|
588
|
+
nonce: string;
|
|
589
|
+
}): Promise<EidIdTokenClaims>;
|
|
590
|
+
private keys;
|
|
591
|
+
private getJson;
|
|
592
|
+
private fetch;
|
|
593
|
+
}
|
|
594
|
+
/** PKCE S256: `BASE64URL(SHA-256(ASCII(code_verifier)))` (RFC 7636 §4.2). */
|
|
595
|
+
declare function pkceChallenge(codeVerifier: string): Promise<string>;
|
|
596
|
+
|
|
597
|
+
export { AcspContext, type AcspV2Params, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CertificateLevel, type ClientConfig, type CreateAuthorizationOptions, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EID_ACR_ADVANCED, EID_ACR_QUALIFIED, EID_OIDC_ISSUER, type EidAuthorization, type EidCallbackChecks, type EidCallbackResult, EidClient, EidError, type EidIdTokenClaims, EidOidcClient, type EidOidcClientConfig, type EidOidcDiscovery, EidOidcError, type EidOidcErrorCode, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PdfApi, type PdfDefaults, type PdfPrepareInput, type PdfPrepareSession, type PdfSignerRef, type QrDeviceLinkTickerOptions, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type TrustConfig, type ValidateAuthOptions, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, buildDeviceLink, interactionsToBase64, parseSessionResult, pkceChallenge, qrDeviceLinkTicker, randomChallenge, resolveBaseUrl, sha256Base64, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature };
|