auth-mn 1.2.0 → 1.3.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 CHANGED
@@ -1,236 +1,240 @@
1
- # auth-mn
2
-
3
- **Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
4
- (утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
5
- хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
6
- асууна.
7
-
8
- Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
9
-
10
- | Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
11
- |---|---|---|
12
- | Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
13
- | user_id / утас / имэйлээр нэг хэрэглэгч авах | `user.find({...})` | `user.read` |
14
- | Олон хэрэглэгч (өөрийн апп-ийн хэрэглэгчид, ID жагсаалт, хайлт) | `user.list({...})` / `user.listAll({...})` | `user.read` |
15
- | Push мэдэгдэл, SMS, имэйл илгээх | `notification.push / sms / mail` | `notification.*` |
16
- | Хэрэглэгчийн нээлттэй апп дээр realtime toast / төлөв харуулах | `socket.toast / status / orderStatus / emit` | `socket.*` |
17
-
18
- Frontend дээр нэвтрэх товч, QR нэвтрэлт хэрэгтэй бол **[auth-mn-react](https://www.npmjs.com/package/auth-mn-react)** санг хэрэглэнэ.
19
-
20
- ```bash
21
- npm i auth-mn
22
- ```
23
-
24
- ---
25
-
26
- ## 1. Client бүртгүүлэх
27
-
28
- Auth.mn **admin panel → Апп-ууд (Client)** дээр апп-аа бүртгэхэд `client_id` (`cl_…`) болон
29
- `client_secret` (`sk_…`) олгоно. Secret **нэг л удаа** харагдана — `.env`-дээ хадгална.
30
- Тухайн апп ямар API дуудаж болохыг (эрхүүдийг) admin тэндээ сонгоно; эрхгүй API дуудвал
31
- `403` + ямар эрх дутууг хэлсэн message ирнэ.
32
-
33
- ```env
34
- AUTH_MN_CLIENT_ID=cl_xxxxxxxxxxxxxxxx
35
- AUTH_MN_CLIENT_SECRET=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
36
- ```
37
-
38
- ## 2. Тохиргоо
39
-
40
- ```ts
41
- import authMn, { setAuth, setHost } from "auth-mn";
42
-
43
- setHost("prod"); // "staging" эсвэл setHost({ MAIN: "https://api.auth.mn" })
44
- setAuth({
45
- client_id: process.env.AUTH_MN_CLIENT_ID!,
46
- client_secret: process.env.AUTH_MN_CLIENT_SECRET!
47
- });
48
- ```
49
-
50
- Үүний дараа юу ч хийх шаардлагагүй: сан `client_id + secret`-ээр access token (1 цаг) болон
51
- refresh token (30 хоног) авч, хугацаа дуусахаас өмнө өөрөө сунгана. 401 ирвэл token-оо
52
- сэргээж нэг удаа дахин оролдоно. **Бүх функц `{ success, message, data, status }` буцна, throw хийхгүй.**
53
-
54
- ## 3. Хэрэглэгч нэвтрүүлэх (гол урсгал)
55
-
56
- ```
57
- [Frontend] auth-mn-react → Auth.mn дээр нэвтэрнэ → таны сайт руу ?authToken=... буцна
58
- (эсвэл QR / OTP-оор token авна)
59
- │ Authorization: Bearer <authToken>
60
- ▼
61
- [Таны backend] authMn.user.verify(authToken) ──► Auth.mn (client token + user.verify эрх)
62
- │ token-ийг задалж, хэрэглэгчийн
63
- ▼ мэдээллийг буцаана
64
- өөрийн session / JWT үүсгэнэ, хэрэглэгчийг DB-дээ user_id-аар холбоно
65
- ```
66
-
67
- ### 3.1 Нэвтрэх endpoint
68
-
69
- ```ts
70
- app.post("/api/auth/callback", async (req, res) => {
71
- const v = await authMn.user.verify(req.body.authToken);
72
- if (!v.success) return res.status(401).json({ message: v.message });
73
-
74
- const u = v.data.user; // user_id, user_name, primary_phone, primary_email, profile_image_url, ...
75
- // 1) өөрийн DB-д user_id-аар хайж байхгүй бол үүсгэнэ
76
- // 2) өөрийн session / JWT үүсгэж cookie-д хадгална
77
- res.json({ success: true, user: u });
78
- });
79
- ```
80
-
81
- `v.data`:
82
-
83
- ```ts
84
- {
85
- user: UserT; // доорх бүтэц
86
- exp: number | null; // хэрэглэгчийн token дуусах хугацаа (unix sec)
87
- client: { client_id, name } // ямар client-ээр шалгасан
88
- }
89
- ```
90
-
91
- Шалгалт бүр хэрэглэгчийн **нэвтрэлтийн түүхэнд** "`<таны домэйн>`-д дамжуулсан" гэж бүртгэгдэнэ —
92
- хэрэглэгч Auth.mn дээрээ аль апп-д хэзээ нэвтэрснээ харна.
93
-
94
- ### 3.2 Route хамгаалах middleware
95
-
96
- Хэрэглэгчийн token-ийг хүсэлт бүрт шалгах бол:
97
-
98
- ```ts
99
- // Authorization: Bearer <token> (эсвэл ?authToken= / body.authToken)
100
- app.get("/api/me", authMn.user.middleware(), (req, res) => {
101
- res.json(req.authMnUser); // UserT
102
- });
103
-
104
- app.get("/api/feed", authMn.user.middleware({ required: false }), (req, res) => {
105
- // нэвтрээгүй бол req.authMnUser === null, алдаа өгөхгүй
106
- });
107
- ```
108
-
109
- > Хүсэлт бүрт Auth.mn руу нэг дуудлага хийдэг тул ачаалал ихтэй бол 3.1-ийн адил нэвтрэх үед нэг удаа
110
- > шалгаад өөрийн session/JWT ашиглахыг зөвлөнө.
111
-
112
- ### 3.3 Хэрэглэгч хайх
113
-
114
- ```ts
115
- const r = await authMn.user.find({ user_id: 5742248 }); // эсвэл { phone_number: "99112233" } / { email }
116
- if (r.success) console.log(r.data.user_name);
117
- ```
118
-
119
- ### 3.4 Олон хэрэглэгч (жагсаалт)
120
-
121
- ```ts
122
- // Таны апп-д бүртгүүлсэн бүх хэрэглэгч — campaign, push илгээхэд
123
- const r = await authMn.user.list({ app_name: "CHARGEX", fields: "lite", page: 1, limit: 500 });
124
- // r.data = { list: UserLite[], total, page, limit }
125
-
126
- const all = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" }); // бүх хуудсыг нэгтгэнэ
127
- await authMn.user.list({ user_ids: [5742248, 5742249] });
128
- await authMn.user.list({ q: "9911", last_login_after: "2026-01-01" });
129
- ```
130
-
131
- Шүүлтүүр: `user_ids | app_name | phone_number | email | name | q | gender | last_login_after | page | limit (≤500) | fields ("full" | "lite")`.
132
-
133
- ### UserT
134
-
135
- ```ts
136
- {
137
- user_id: number; // Auth.mn-ийн тогтмол ID — өөрийн DB-д үүгээр холбоно
138
- user_name: string;
139
- nick_name: string;
140
- primary_phone: string | null;
141
- primary_email: string | null;
142
- emails: { email, verified, primary }[];
143
- phone_numbers: { number, verified, primary }[];
144
- profile_image_url: string;
145
- gender?: "MEN" | "WOMEN";
146
- date_of_birth: Date | null;
147
- auth_profiles: { google_id, facebook_id, steam_id, ... };
148
- sign_up_date, last_login, ...
149
- }
150
- ```
151
-
152
- ## 4. Мэдэгдэл
153
-
154
- ```ts
155
- await authMn.notification.push({
156
- user_id: 5742248,
157
- target_app: "MY-APP",
158
- body: { title: "Захиалга", body: "Захиалга #123 батлагдлаа", button: { title: "Харах", url: "https://..." } }
159
- }); // notification.push
160
- await authMn.notification.sms({ to: "99112233", from: "MYAPP", text: "Код: 1234" }); // notification.sms
161
- await authMn.notification.mail({
162
- type: "notification", to: ["a@b.mn"], subject: "Сайн уу",
163
- body: { name: "Бат", title: "Тавтай морил", desc: "..." }
164
- }); // notification.mail
165
- ```
166
-
167
- ## 5. Socket (realtime)
168
-
169
- Хэрэглэгч Auth.mn-тэй холбогдсон аль нэг апп-аа нээлттэй байхад:
170
-
171
- ```ts
172
- await authMn.socket.toast({ user_id, type: "info", text: "Төлбөр амжилттай" }); // socket.toast
173
- await authMn.socket.status({ user_id, id: "order-123", type: "Loading", title: "Боловсруулж байна" }); // socket.status
174
- await authMn.socket.status({ user_id, id: "order-123", type: "Success", title: "Амжилттай", amount: 15000 });
175
- await authMn.socket.orderStatus({ user_id, order_id: "order-123" }); // socket.status
176
- await authMn.socket.emit([{ user_id, emit_name: "my-event", data: { any: 1 } }]); // socket.emit
177
- ```
178
-
179
- ## 6. EXP нэмэх (Seller Panda г.м.)
180
-
181
- Хэрэглэгчид exp олгох. client_id/secret-ээс **тусдаа EXP түлхүүр** хэрэгтэй — Admin panel →
182
- **EXP түлхүүр** дээр нэр (ж: `Seller Panda`) + нэг дуудлагад олгох exp-ийг admin тохируулж
183
- үүсгэнэ (`exp_…`, нэг удаа харагдана). Хэдэн exp нэмэгдэх нь түлхүүр дээр тогтсон — дуудагч
184
- тал өөрчилж чадахгүй.
185
-
186
- ```ts
187
- import authMn, { setExpKey } from "auth-mn";
188
-
189
- setExpKey(process.env.AUTH_MN_EXP_KEY); // exp_…
190
-
191
- // user_id-ээр
192
- const r = await authMn.exp.add({
193
- user_id: 8636569,
194
- desc: "Худалдан авалт #1234",
195
- ref: "order-1234" // optional — ижил ref-ээр дахин дуудахад давхар нэмэхгүй
196
- });
197
- // r.data → { user_id, exp: 10, exp_total: 1250, desc, ref, duplicate: false, ... }
198
-
199
- // эсвэл frontend-ээс ирсэн хэрэглэгчийн token-оор
200
- await authMn.exp.add({ token: userToken, desc: "Өдөр тутмын нэвтрэлт" });
201
-
202
- // тухайн түлхүүрээр нэмсэн лог
203
- const logs = await authMn.exp.logs({ user_id: 8636569, page: 1, limit: 20 });
204
- ```
205
-
206
- Шууд HTTP: `POST https://api.auth.mn/main/v1/auth/exp/add` — `Authorization: Bearer exp_…`
207
- (эсвэл `x-exp-key: exp_…`), body `{ user_id | token, desc, ref? }`.
208
-
209
- ## 7. Client өөрийн мэдээлэл
210
-
211
- ```ts
212
- import { config } from "auth-mn";
213
- await authMn.auth.getToken(); // хүчинтэй access token (шаардлагатай бол refresh / login хийгээд)
214
- config.token; // одоогийн access token — гараар Authorization: Bearer үүсгэхэд
215
-
216
- await authMn.auth.me(); // { client_id, name, permissions, ... }
217
- authMn.auth.hasPermission("notification.sms"); // сүүлийн token-оос
218
- await authMn.auth.permissions(); // Auth.mn-ийн бүх боломжит эрх
219
- await authMn.auth.revoke(); // refresh token-оо хүчингүй болгоод cache цэвэрлэнэ
220
- ```
221
-
222
- ## Алдаа
223
-
224
- | status | Шалтгаан |
225
- |---|---|
226
- | 401 | client_id/secret буруу, client идэвхгүй, эсвэл хэрэглэгчийн token хүчингүй |
227
- | 403 | Энэ API-д шаардлагатай эрх client-д олгогдоогүй — admin panel дээр нэмнэ |
228
- | 0 | Сүлжээний алдаа (`message`-д шалтгаан) |
229
-
230
- ## 0.x → 1.0 шилжилт
231
-
232
- - `config.auth.username / password`, `auth.TOKEN({username,password})` → `setAuth({ client_id, client_secret })`.
233
- Хуучин client бүртгэлүүд admin panel дээр **Secret шинэчлэх** дарж secret авна.
234
- - `find.USER / MERCHANT / ADMIN / CLIENT / CRM` **хасагдсан** — хэрэглэгчийн мэдээлэл `user.verify` / `user.find`-ээр.
235
- - `notification.SinglePushNoti / SMS / MAIL`, `socket.ShowToast / ShowStatus / ShowOrderStatus / EMIT` хэвээр ажиллана (alias).
236
- - `notification._3RD.*` хасагдсан.
1
+ # auth-mn
2
+
3
+ **Auth.mn** — таны апп-уудын нэгдсэн хэрэглэгчийн систем. Хэрэглэгч бүртгүүлэх, нэвтрэх
4
+ (утас / имэйл OTP, Google, Facebook, Steam, QR), профайл, төхөөрөмж, мэдэгдлийг Auth.mn
5
+ хариуцна; таны апп зөвхөн **хэрэглэгчийн token**-ийг хүлээж аваад Auth.mn-ээс мэдээллийг нь
6
+ асууна.
7
+
8
+ Энэ сан нь таны **backend (Node.js)** дээр ажиллана:
9
+
10
+ | Та юу хийх вэ | Сангийн функц | Шаардлагатай эрх |
11
+ |---|---|---|
12
+ | Frontend-ээс ирсэн хэрэглэгчийн token шалгаж мэдээллийг авах | `user.verify(token)` / `user.middleware()` | `user.verify` |
13
+ | user_id / утас / имэйлээр нэг хэрэглэгч авах | `user.find({...})` | `user.read` |
14
+ | Олон хэрэглэгч (өөрийн апп-ийн хэрэглэгчид, ID жагсаалт, хайлт) | `user.list({...})` / `user.listAll({...})` | `user.read` |
15
+ | Push мэдэгдэл, SMS, имэйл илгээх | `notification.push / sms / mail` | `notification.*` |
16
+ | Хэрэглэгчийн нээлттэй апп дээр realtime toast / төлөв харуулах | `socket.toast / status / orderStatus / emit` | `socket.*` |
17
+
18
+ Frontend дээр нэвтрэх товч, QR нэвтрэлт хэрэгтэй бол **[auth-mn-react](https://www.npmjs.com/package/auth-mn-react)** санг хэрэглэнэ.
19
+
20
+ ```bash
21
+ npm i auth-mn
22
+ ```
23
+
24
+ ---
25
+
26
+ ## 1. Client бүртгүүлэх
27
+
28
+ Auth.mn **admin panel → Апп-ууд (Client)** дээр апп-аа бүртгэхэд `client_id` (`cl_…`) болон
29
+ `client_secret` (`sk_…`) олгоно. Secret **нэг л удаа** харагдана — `.env`-дээ хадгална.
30
+ Тухайн апп ямар API дуудаж болохыг (эрхүүдийг) admin тэндээ сонгоно; эрхгүй API дуудвал
31
+ `403` + ямар эрх дутууг хэлсэн message ирнэ.
32
+
33
+ ```env
34
+ AUTH_MN_CLIENT_ID=cl_xxxxxxxxxxxxxxxx
35
+ AUTH_MN_CLIENT_SECRET=sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
36
+ ```
37
+
38
+ ## 2. Тохиргоо
39
+
40
+ ```ts
41
+ import authMn, { setAuth, setHost } from "auth-mn";
42
+
43
+ setHost("prod"); // "staging" эсвэл setHost({ MAIN: "https://api.auth.mn" })
44
+ setAuth({
45
+ client_id: process.env.AUTH_MN_CLIENT_ID!,
46
+ client_secret: process.env.AUTH_MN_CLIENT_SECRET!
47
+ });
48
+ ```
49
+
50
+ Үүний дараа юу ч хийх шаардлагагүй: сан `client_id + secret`-ээр access token (1 цаг) болон
51
+ refresh token (30 хоног) авч, хугацаа дуусахаас өмнө өөрөө сунгана. 401 ирвэл token-оо
52
+ сэргээж нэг удаа дахин оролдоно. **Бүх функц `{ success, message, data, status }` буцна, throw хийхгүй.**
53
+
54
+ ## 3. Хэрэглэгч нэвтрүүлэх (гол урсгал)
55
+
56
+ ```
57
+ [Frontend] auth-mn-react → Auth.mn дээр нэвтэрнэ → таны сайт руу ?authToken=... буцна
58
+ (эсвэл QR / OTP-оор token авна)
59
+ │ Authorization: Bearer <authToken>
60
+ ▼
61
+ [Таны backend] authMn.user.verify(authToken) ──► Auth.mn (client token + user.verify эрх)
62
+ │ token-ийг задалж, хэрэглэгчийн
63
+ ▼ мэдээллийг буцаана
64
+ өөрийн session / JWT үүсгэнэ, хэрэглэгчийг DB-дээ user_id-аар холбоно
65
+ ```
66
+
67
+ ### 3.1 Нэвтрэх endpoint
68
+
69
+ ```ts
70
+ app.post("/api/auth/callback", async (req, res) => {
71
+ const v = await authMn.user.verify(req.body.authToken);
72
+ if (!v.success) return res.status(401).json({ message: v.message });
73
+
74
+ const u = v.data.user; // user_id, user_name, primary_phone, primary_email, profile_image_url, ...
75
+ // 1) өөрийн DB-д user_id-аар хайж байхгүй бол үүсгэнэ
76
+ // 2) өөрийн session / JWT үүсгэж cookie-д хадгална
77
+ res.json({ success: true, user: u });
78
+ });
79
+ ```
80
+
81
+ `v.data`:
82
+
83
+ ```ts
84
+ {
85
+ user: UserT; // доорх бүтэц
86
+ exp: number | null; // хэрэглэгчийн token дуусах хугацаа (unix sec)
87
+ client: { client_id, name } // ямар client-ээр шалгасан
88
+ }
89
+ ```
90
+
91
+ Шалгалт бүр хэрэглэгчийн **нэвтрэлтийн түүхэнд** "`<таны домэйн>`-д дамжуулсан" гэж бүртгэгдэнэ —
92
+ хэрэглэгч Auth.mn дээрээ аль апп-д хэзээ нэвтэрснээ харна.
93
+
94
+ `user.verify` default-оор token-ийн payload-аас шууд буцаадаг (Auth.mn DB руу хандахгүй, хурдан;
95
+ мэдээлэл token-ийн хугацаа дуустал хуучирч болно). Төлбөр, данс зэрэг чухал үйлдэлд
96
+ `authMn.user.verify(token, { fresh: true })` — DB-ээс хамгийн сүүлийн мэдээлэл.
97
+
98
+ ### 3.2 Route хамгаалах middleware
99
+
100
+ Хэрэглэгчийн token-ийг хүсэлт бүрт шалгах бол:
101
+
102
+ ```ts
103
+ // Authorization: Bearer <token> (эсвэл ?authToken= / body.authToken)
104
+ app.get("/api/me", authMn.user.middleware(), (req, res) => {
105
+ res.json(req.authMnUser); // UserT
106
+ });
107
+
108
+ app.get("/api/feed", authMn.user.middleware({ required: false }), (req, res) => {
109
+ // нэвтрээгүй бол req.authMnUser === null, алдаа өгөхгүй
110
+ });
111
+ ```
112
+
113
+ > Хүсэлт бүрт Auth.mn руу нэг дуудлага хийдэг тул ачаалал ихтэй бол 3.1-ийн адил нэвтрэх үед нэг удаа
114
+ > шалгаад өөрийн session/JWT ашиглахыг зөвлөнө.
115
+
116
+ ### 3.3 Хэрэглэгч хайх
117
+
118
+ ```ts
119
+ const r = await authMn.user.find({ user_id: 5742248 }); // эсвэл { phone_number: "99112233" } / { email }
120
+ if (r.success) console.log(r.data.user_name);
121
+ ```
122
+
123
+ ### 3.4 Олон хэрэглэгч (жагсаалт)
124
+
125
+ ```ts
126
+ // Таны апп-д бүртгүүлсэн бүх хэрэглэгч — campaign, push илгээхэд
127
+ const r = await authMn.user.list({ app_name: "CHARGEX", fields: "lite", page: 1, limit: 500 });
128
+ // r.data = { list: UserLite[], total, page, limit }
129
+
130
+ const all = await authMn.user.listAll({ app_name: "CHARGEX", fields: "lite" }); // бүх хуудсыг нэгтгэнэ
131
+ await authMn.user.list({ user_ids: [5742248, 5742249] });
132
+ await authMn.user.list({ q: "9911", last_login_after: "2026-01-01" });
133
+ ```
134
+
135
+ Шүүлтүүр: `user_ids | app_name | phone_number | email | name | q | gender | last_login_after | page | limit (≤500) | fields ("full" | "lite")`.
136
+
137
+ ### UserT
138
+
139
+ ```ts
140
+ {
141
+ user_id: number; // Auth.mn-ийн тогтмол ID — өөрийн DB-д үүгээр холбоно
142
+ user_name: string;
143
+ nick_name: string;
144
+ primary_phone: string | null;
145
+ primary_email: string | null;
146
+ emails: { email, verified, primary }[];
147
+ phone_numbers: { number, verified, primary }[];
148
+ profile_image_url: string;
149
+ gender?: "MEN" | "WOMEN";
150
+ date_of_birth: Date | null;
151
+ auth_profiles: { google_id, facebook_id, steam_id, ... };
152
+ sign_up_date, last_login, ...
153
+ }
154
+ ```
155
+
156
+ ## 4. Мэдэгдэл
157
+
158
+ ```ts
159
+ await authMn.notification.push({
160
+ user_id: 5742248,
161
+ target_app: "MY-APP",
162
+ body: { title: "Захиалга", body: "Захиалга #123 батлагдлаа", button: { title: "Харах", url: "https://..." } }
163
+ }); // notification.push
164
+ await authMn.notification.sms({ to: "99112233", from: "MYAPP", text: "Код: 1234" }); // notification.sms
165
+ await authMn.notification.mail({
166
+ type: "notification", to: ["a@b.mn"], subject: "Сайн уу",
167
+ body: { name: "Бат", title: "Тавтай морил", desc: "..." }
168
+ }); // notification.mail
169
+ ```
170
+
171
+ ## 5. Socket (realtime)
172
+
173
+ Хэрэглэгч Auth.mn-тэй холбогдсон аль нэг апп-аа нээлттэй байхад:
174
+
175
+ ```ts
176
+ await authMn.socket.toast({ user_id, type: "info", text: "Төлбөр амжилттай" }); // socket.toast
177
+ await authMn.socket.status({ user_id, id: "order-123", type: "Loading", title: "Боловсруулж байна" }); // socket.status
178
+ await authMn.socket.status({ user_id, id: "order-123", type: "Success", title: "Амжилттай", amount: 15000 });
179
+ await authMn.socket.orderStatus({ user_id, order_id: "order-123" }); // socket.status
180
+ await authMn.socket.emit([{ user_id, emit_name: "my-event", data: { any: 1 } }]); // socket.emit
181
+ ```
182
+
183
+ ## 6. EXP нэмэх (Seller Panda г.м.)
184
+
185
+ Хэрэглэгчид exp олгох. client_id/secret-ээс **тусдаа EXP түлхүүр** хэрэгтэй — Admin panel →
186
+ **EXP түлхүүр** дээр нэр (ж: `Seller Panda`) + нэг дуудлагад олгох exp-ийг admin тохируулж
187
+ үүсгэнэ (`exp_…`, нэг удаа харагдана). Хэдэн exp нэмэгдэх нь түлхүүр дээр тогтсон — дуудагч
188
+ тал өөрчилж чадахгүй.
189
+
190
+ ```ts
191
+ import authMn, { setExpKey } from "auth-mn";
192
+
193
+ setExpKey(process.env.AUTH_MN_EXP_KEY); // exp_…
194
+
195
+ // user_id-ээр
196
+ const r = await authMn.exp.add({
197
+ user_id: 8636569,
198
+ desc: "Худалдан авалт #1234",
199
+ ref: "order-1234" // optional — ижил ref-ээр дахин дуудахад давхар нэмэхгүй
200
+ });
201
+ // r.data → { user_id, exp: 10, exp_total: 1250, desc, ref, duplicate: false, ... }
202
+
203
+ // эсвэл frontend-ээс ирсэн хэрэглэгчийн token-оор
204
+ await authMn.exp.add({ token: userToken, desc: "Өдөр тутмын нэвтрэлт" });
205
+
206
+ // тухайн түлхүүрээр нэмсэн лог
207
+ const logs = await authMn.exp.logs({ user_id: 8636569, page: 1, limit: 20 });
208
+ ```
209
+
210
+ Шууд HTTP: `POST https://api.auth.mn/main/v1/auth/exp/add` — `Authorization: Bearer exp_…`
211
+ (эсвэл `x-exp-key: exp_…`), body `{ user_id | token, desc, ref? }`.
212
+
213
+ ## 7. Client өөрийн мэдээлэл
214
+
215
+ ```ts
216
+ import { config } from "auth-mn";
217
+ await authMn.auth.getToken(); // хүчинтэй access token (шаардлагатай бол refresh / login хийгээд)
218
+ config.token; // одоогийн access token — гараар Authorization: Bearer үүсгэхэд
219
+
220
+ await authMn.auth.me(); // { client_id, name, permissions, ... }
221
+ authMn.auth.hasPermission("notification.sms"); // сүүлийн token-оос
222
+ await authMn.auth.permissions(); // Auth.mn-ийн бүх боломжит эрх
223
+ await authMn.auth.revoke(); // refresh token-оо хүчингүй болгоод cache цэвэрлэнэ
224
+ ```
225
+
226
+ ## Алдаа
227
+
228
+ | status | Шалтгаан |
229
+ |---|---|
230
+ | 401 | client_id/secret буруу, client идэвхгүй, эсвэл хэрэглэгчийн token хүчингүй |
231
+ | 403 | Энэ API-д шаардлагатай эрх client-д олгогдоогүй — admin panel дээр нэмнэ |
232
+ | 0 | Сүлжээний алдаа (`message`-д шалтгаан) |
233
+
234
+ ## 0.x → 1.0 шилжилт
235
+
236
+ - `config.auth.username / password`, `auth.TOKEN({username,password})` → `setAuth({ client_id, client_secret })`.
237
+ Хуучин client бүртгэлүүд admin panel дээр **Secret шинэчлэх** дарж secret авна.
238
+ - `find.USER / MERCHANT / ADMIN / CLIENT / CRM` **хасагдсан** — хэрэглэгчийн мэдээлэл `user.verify` / `user.find`-ээр.
239
+ - `notification.SinglePushNoti / SMS / MAIL`, `socket.ShowToast / ShowStatus / ShowOrderStatus / EMIT` хэвээр ажиллана (alias).
240
+ - `notification._3RD.*` хасагдсан.
package/dist/index.d.ts CHANGED
@@ -75,7 +75,9 @@ declare const _default: {
75
75
  state: import("./auth").AuthState;
76
76
  };
77
77
  user: {
78
- verify: (token: string) => Promise<import("./types").Result<import("./types").VerifiedUser>>;
78
+ verify: (token: string, opts?: {
79
+ fresh?: boolean;
80
+ }) => Promise<import("./types").Result<import("./types").VerifiedUser>>;
79
81
  find: (query: {
80
82
  user_id?: number | string;
81
83
  phone_number?: string;
package/dist/types.d.ts CHANGED
@@ -32,6 +32,8 @@ export type VerifiedUser = {
32
32
  client_id: string;
33
33
  name: string;
34
34
  };
35
+ /** true бол DB-ээс шинээр уншсан, false бол token-ийн payload */
36
+ fresh?: boolean;
35
37
  };
36
38
  export type ClientInfo = {
37
39
  client_id: string;
package/dist/user.d.ts CHANGED
@@ -7,8 +7,14 @@ import { PageResult, Result, UserBankAccount, UserListFilter, UserLite, UserT, V
7
7
  * const v = await authMn.user.verify(token);
8
8
  * if (!v.success) return res.status(401).json({ message: v.message });
9
9
  * v.data.user.user_id ...
10
+ *
11
+ * Default-оор Auth.mn token-ийн payload-аас шууд буцаана (DB-гүй, хурдан) — мэдээлэл token-ийн
12
+ * хугацаа дуустал хуучирч болно. Төлбөр, данс зэрэг чухал үйлдэлд { fresh: true } өгвөл DB-ээс
13
+ * хамгийн сүүлийн мэдээллийг уншина.
10
14
  */
11
- export declare const verify: (token: string) => Promise<Result<VerifiedUser>>;
15
+ export declare const verify: (token: string, opts?: {
16
+ fresh?: boolean;
17
+ }) => Promise<Result<VerifiedUser>>;
12
18
  /**
13
19
  * Хэрэглэгч хайх — user_id, phone_number эсвэл email-ийн аль нэгээр (нэг хэрэглэгч).
14
20
  * Permission: user.read
@@ -75,7 +81,9 @@ export type MiddlewareOptions = {
75
81
  */
76
82
  export declare const middleware: (opts?: MiddlewareOptions) => (req: AnyReq, res: AnyRes, next: Next) => Promise<any>;
77
83
  declare const _default: {
78
- verify: (token: string) => Promise<Result<VerifiedUser>>;
84
+ verify: (token: string, opts?: {
85
+ fresh?: boolean;
86
+ }) => Promise<Result<VerifiedUser>>;
79
87
  find: (query: {
80
88
  user_id?: number | string;
81
89
  phone_number?: string;
package/dist/user.js CHANGED
@@ -12,12 +12,16 @@ const request_1 = require("./request");
12
12
  * const v = await authMn.user.verify(token);
13
13
  * if (!v.success) return res.status(401).json({ message: v.message });
14
14
  * v.data.user.user_id ...
15
+ *
16
+ * Default-оор Auth.mn token-ийн payload-аас шууд буцаана (DB-гүй, хурдан) — мэдээлэл token-ийн
17
+ * хугацаа дуустал хуучирч болно. Төлбөр, данс зэрэг чухал үйлдэлд { fresh: true } өгвөл DB-ээс
18
+ * хамгийн сүүлийн мэдээллийг уншина.
15
19
  */
16
- const verify = (token) => (0, request_1.request)({
20
+ const verify = (token, opts = {}) => (0, request_1.request)({
17
21
  method: "POST",
18
22
  path: "/main/v1/auth/client/user/verify",
19
23
  name: "user verify",
20
- data: { token }
24
+ data: { token, fresh: !!opts.fresh }
21
25
  });
22
26
  exports.verify = verify;
23
27
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auth-mn",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Auth.mn API client for Node.js — client_id/secret token, user, notification, socket",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",