w-web-api 1.0.29 → 1.0.31
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 +16 -5
- package/dist/index.tmp +3 -1
- package/dist/js/app-legacy.9b4e9f9b.js +2 -0
- package/dist/js/app-legacy.9b4e9f9b.js.map +1 -0
- package/dist/js/app.9b4e9f9b.js +2 -0
- package/dist/js/app.9b4e9f9b.js.map +1 -0
- package/dist/js/{chunk-vendors.c0c4267e.js → chunk-vendors-legacy.7033510d.js} +2 -2
- package/dist/js/chunk-vendors-legacy.7033510d.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.c0c4267e.js → chunk-vendors.7033510d.js} +2 -2
- package/dist/js/chunk-vendors.7033510d.js.map +1 -0
- package/dist/w-web-api.umd.js +2 -2
- package/dist/w-web-api.umd.js.map +1 -1
- package/docs/WWebApi.html +82 -6
- package/docs/WWebApi.mjs.html +106 -27
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/public/index.html +7 -0
- package/server/WWebApi.mjs +105 -26
- package/src/App.vue +17 -2
- package/src/store/mutations.mjs +6 -13
- package/srv.mjs +15 -5
- package/tableTags-web-api.json +1 -1
- package/dist/js/app-legacy.86198344.js +0 -2
- package/dist/js/app-legacy.86198344.js.map +0 -1
- package/dist/js/app.86198344.js +0 -2
- package/dist/js/app.86198344.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.c0c4267e.js.map +0 -1
- package/dist/js/chunk-vendors.c0c4267e.js.map +0 -1
package/server/WWebApi.mjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import path from 'path'
|
|
2
2
|
import fs from 'fs'
|
|
3
3
|
import get from 'lodash/get'
|
|
4
|
-
// import map from 'lodash/map'
|
|
5
4
|
import each from 'lodash/each'
|
|
6
5
|
import keys from 'lodash/keys'
|
|
7
|
-
// import cloneDeep from 'lodash/cloneDeep'
|
|
8
6
|
import j2o from 'wsemi/src/j2o.mjs'
|
|
9
7
|
import iseobj from 'wsemi/src/iseobj.mjs'
|
|
10
8
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
@@ -20,6 +18,7 @@ import strdelright from 'wsemi/src/strdelright.mjs'
|
|
|
20
18
|
import pm2resolve from 'wsemi/src/pm2resolve.mjs'
|
|
21
19
|
import b642str from 'wsemi/src/b642str.mjs'
|
|
22
20
|
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
21
|
+
import fsIsFile from 'wsemi/src/fsIsFile.mjs'
|
|
23
22
|
import replace from 'wsemi/src/replace.mjs'
|
|
24
23
|
import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
|
|
25
24
|
import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
|
|
@@ -34,7 +33,8 @@ import ds from '../src/schema/index.mjs'
|
|
|
34
33
|
* @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
35
34
|
* @param {String} db 輸入資料庫名稱字串
|
|
36
35
|
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
37
|
-
* @param {Function}
|
|
36
|
+
* @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
37
|
+
* @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
38
38
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
39
39
|
* @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
|
|
40
40
|
* @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
|
|
@@ -44,12 +44,15 @@ import ds from '../src/schema/index.mjs'
|
|
|
44
44
|
* @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
|
|
45
45
|
* @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
|
|
46
46
|
* @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
|
|
47
|
+
* @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
|
|
47
48
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
48
49
|
* @example
|
|
50
|
+
*
|
|
49
51
|
* import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
50
52
|
* import WWebApi from './server/WWebApi.mjs'
|
|
51
53
|
* import getSettings from './g.getSettings.mjs'
|
|
52
54
|
*
|
|
55
|
+
*
|
|
53
56
|
* //st
|
|
54
57
|
* let st = getSettings()
|
|
55
58
|
*
|
|
@@ -63,6 +66,7 @@ import ds from '../src/schema/index.mjs'
|
|
|
63
66
|
*
|
|
64
67
|
* serverPort: 11005,
|
|
65
68
|
* subfolder: '', //mapi
|
|
69
|
+
* urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
|
|
66
70
|
*
|
|
67
71
|
* webName: {
|
|
68
72
|
* 'eng': 'API Service',
|
|
@@ -76,13 +80,13 @@ import ds from '../src/schema/index.mjs'
|
|
|
76
80
|
*
|
|
77
81
|
* }
|
|
78
82
|
*
|
|
79
|
-
* let getUserByToken = (token) => {
|
|
83
|
+
* let getUserByToken = async (token) => {
|
|
80
84
|
* // return {} //測試無法登入
|
|
81
85
|
* if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
82
86
|
* return {
|
|
83
87
|
* id: 'id-for-application',
|
|
84
88
|
* name: 'application',
|
|
85
|
-
* email: '
|
|
89
|
+
* email: 'application@example.com',
|
|
86
90
|
* isAdmin: 'y',
|
|
87
91
|
* }
|
|
88
92
|
* }
|
|
@@ -99,20 +103,29 @@ import ds from '../src/schema/index.mjs'
|
|
|
99
103
|
* return {}
|
|
100
104
|
* }
|
|
101
105
|
*
|
|
102
|
-
* let
|
|
103
|
-
* console.log('
|
|
106
|
+
* let verifyBrowserUser = (user, caller) => {
|
|
107
|
+
* console.log('verifyBrowserUser/user', user)
|
|
108
|
+
* // return false //測試無法登入
|
|
109
|
+
* console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
110
|
+
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
111
|
+
* }
|
|
112
|
+
*
|
|
113
|
+
* let verifyAppUser = (user, caller) => {
|
|
114
|
+
* console.log('verifyAppUser/user', user)
|
|
115
|
+
* // return false //測試無法登入
|
|
116
|
+
* console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
104
117
|
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
105
118
|
* }
|
|
106
119
|
*
|
|
107
120
|
* //WWebApi
|
|
108
|
-
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken,
|
|
121
|
+
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
109
122
|
*
|
|
110
123
|
* instWWebApi.on('error', (err) => {
|
|
111
124
|
* console.log(err)
|
|
112
125
|
* })
|
|
113
126
|
*
|
|
114
127
|
*/
|
|
115
|
-
function WWebApi(WOrm, url, db, getUserByToken,
|
|
128
|
+
function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
|
|
116
129
|
let instWServHapiServer = null
|
|
117
130
|
|
|
118
131
|
|
|
@@ -144,10 +157,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
144
157
|
}
|
|
145
158
|
|
|
146
159
|
|
|
147
|
-
//check
|
|
148
|
-
if (!isfun(
|
|
149
|
-
console.log('invalid
|
|
150
|
-
throw new Error('invalid
|
|
160
|
+
//check verifyBrowserUser
|
|
161
|
+
if (!isfun(verifyBrowserUser)) {
|
|
162
|
+
console.log('invalid verifyBrowserUser', verifyBrowserUser)
|
|
163
|
+
throw new Error('invalid verifyBrowserUser')
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
//check verifyAppUser
|
|
168
|
+
if (!isfun(verifyAppUser)) {
|
|
169
|
+
console.log('invalid verifyAppUser', verifyAppUser)
|
|
170
|
+
throw new Error('invalid verifyAppUser')
|
|
151
171
|
}
|
|
152
172
|
|
|
153
173
|
|
|
@@ -195,6 +215,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
195
215
|
}
|
|
196
216
|
|
|
197
217
|
|
|
218
|
+
//urlRedirect
|
|
219
|
+
let urlRedirect = get(opt, 'urlRedirect', '')
|
|
220
|
+
|
|
221
|
+
|
|
198
222
|
//WServOrm
|
|
199
223
|
let optWServOrm = {
|
|
200
224
|
bCheckUser,
|
|
@@ -221,8 +245,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
221
245
|
}
|
|
222
246
|
|
|
223
247
|
|
|
224
|
-
//
|
|
225
|
-
let
|
|
248
|
+
//getTokenUser
|
|
249
|
+
let getTokenUser = async (token) => {
|
|
226
250
|
|
|
227
251
|
//getUserByToken
|
|
228
252
|
let userSelf = getUserByToken(token)
|
|
@@ -232,12 +256,46 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
232
256
|
|
|
233
257
|
//check
|
|
234
258
|
if (!iseobj(userSelf)) {
|
|
235
|
-
console.log(`
|
|
259
|
+
console.log(`token`, token)
|
|
260
|
+
console.log(`can not find the user from token`)
|
|
236
261
|
return Promise.reject(`can not find the user from token`)
|
|
237
262
|
}
|
|
238
263
|
|
|
239
|
-
|
|
240
|
-
|
|
264
|
+
return userSelf
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
//getAndVerifyBrowserTokenUser
|
|
269
|
+
let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
|
|
270
|
+
|
|
271
|
+
//getTokenUser
|
|
272
|
+
let userSelf = await getTokenUser(token)
|
|
273
|
+
|
|
274
|
+
//verifyBrowserUser
|
|
275
|
+
let b = verifyBrowserUser(userSelf, caller)
|
|
276
|
+
if (ispm(b)) {
|
|
277
|
+
b = await b
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
//check
|
|
281
|
+
if (!b) {
|
|
282
|
+
console.log('userSelf', userSelf)
|
|
283
|
+
console.log(`user does not have permission`)
|
|
284
|
+
return Promise.reject(`user does not have permission`)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return userSelf
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
//getAndVerifyAppTokenUser
|
|
292
|
+
let getAndVerifyAppTokenUser = async (token, caller = '') => {
|
|
293
|
+
|
|
294
|
+
//getTokenUser
|
|
295
|
+
let userSelf = await getTokenUser(token)
|
|
296
|
+
|
|
297
|
+
//verifyAppUser
|
|
298
|
+
let b = verifyAppUser(userSelf, caller)
|
|
241
299
|
if (ispm(b)) {
|
|
242
300
|
b = await b
|
|
243
301
|
}
|
|
@@ -245,6 +303,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
245
303
|
//check
|
|
246
304
|
if (!b) {
|
|
247
305
|
console.log('userSelf', userSelf)
|
|
306
|
+
console.log(`user does not have permission`)
|
|
248
307
|
return Promise.reject(`user does not have permission`)
|
|
249
308
|
}
|
|
250
309
|
|
|
@@ -261,6 +320,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
261
320
|
|
|
262
321
|
//parsePayload
|
|
263
322
|
let parsePayload = async (req) => {
|
|
323
|
+
|
|
324
|
+
//inp
|
|
264
325
|
let inp = get(req, 'payload')
|
|
265
326
|
|
|
266
327
|
//to obj
|
|
@@ -271,6 +332,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
271
332
|
//check
|
|
272
333
|
if (!iseobj(inp)) {
|
|
273
334
|
console.log('inp', inp)
|
|
335
|
+
console.log(`invalid inp from req`)
|
|
274
336
|
return Promise.reject(`invalid inp from req`)
|
|
275
337
|
}
|
|
276
338
|
|
|
@@ -281,6 +343,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
281
343
|
if (!isestr(group)) {
|
|
282
344
|
console.log('inp', inp)
|
|
283
345
|
console.log('group', group)
|
|
346
|
+
console.log(`invalid group from inp`)
|
|
284
347
|
return Promise.reject(`invalid group from inp`)
|
|
285
348
|
}
|
|
286
349
|
|
|
@@ -291,6 +354,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
291
354
|
if (!isearr(apis)) {
|
|
292
355
|
console.log('inp', inp)
|
|
293
356
|
console.log('apis', apis)
|
|
357
|
+
console.log(`invalid apis from inp`)
|
|
294
358
|
return Promise.reject(`invalid apis from inp`)
|
|
295
359
|
}
|
|
296
360
|
|
|
@@ -349,6 +413,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
349
413
|
if (!isestr(group)) {
|
|
350
414
|
console.log('params', params)
|
|
351
415
|
console.log('group', group)
|
|
416
|
+
console.log(`invalid group`)
|
|
352
417
|
return Promise.reject(`invalid group`)
|
|
353
418
|
}
|
|
354
419
|
|
|
@@ -360,6 +425,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
360
425
|
if (!isearr(apis)) {
|
|
361
426
|
console.log('params', params)
|
|
362
427
|
console.log('apis', apis)
|
|
428
|
+
console.log(`invalid apis`)
|
|
363
429
|
return Promise.reject(`invalid apis`)
|
|
364
430
|
}
|
|
365
431
|
|
|
@@ -387,9 +453,18 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
387
453
|
let fnEntryOut = 'index.html'
|
|
388
454
|
try {
|
|
389
455
|
let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
|
|
456
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
457
|
+
fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
|
|
458
|
+
}
|
|
459
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
460
|
+
console.log('fpEntryIn', fpEntryIn)
|
|
461
|
+
throw new Error(`invalid fpEntryIn`)
|
|
462
|
+
}
|
|
390
463
|
let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
|
|
391
464
|
let c = fs.readFileSync(fpEntryIn, 'utf8')
|
|
465
|
+
c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
|
|
392
466
|
c = replace(c, '{sfd}', subfolder)
|
|
467
|
+
c = replace(c, '{urlRedirect}', urlRedirect)
|
|
393
468
|
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
394
469
|
}
|
|
395
470
|
catch (err) {
|
|
@@ -429,13 +504,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
429
504
|
//token
|
|
430
505
|
let token = get(req, 'query.token', '')
|
|
431
506
|
|
|
432
|
-
//
|
|
433
|
-
let user = await
|
|
507
|
+
//getAndVerifyBrowserTokenUser
|
|
508
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
|
|
434
509
|
|
|
435
510
|
//check
|
|
436
511
|
if (!iseobj(user)) {
|
|
437
512
|
console.log('token', token)
|
|
438
513
|
console.log('[API]getUserByToken/check user: invalid user')
|
|
514
|
+
console.log(`token does not have permission`)
|
|
439
515
|
return Promise.reject(`token does not have permission`)
|
|
440
516
|
}
|
|
441
517
|
|
|
@@ -460,13 +536,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
460
536
|
//token
|
|
461
537
|
let token = get(req, 'query.token', '')
|
|
462
538
|
|
|
463
|
-
//
|
|
464
|
-
let user = await
|
|
539
|
+
//getAndVerifyBrowserTokenUser
|
|
540
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getAPIsList')
|
|
465
541
|
|
|
466
542
|
//check
|
|
467
543
|
if (!iseobj(user)) {
|
|
468
544
|
console.log('token', token)
|
|
469
545
|
console.log('[API]getAPIsList/check user: invalid user')
|
|
546
|
+
console.log(`token does not have permission`)
|
|
470
547
|
return Promise.reject(`token does not have permission`)
|
|
471
548
|
}
|
|
472
549
|
|
|
@@ -495,13 +572,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
495
572
|
//token
|
|
496
573
|
let token = get(req, 'query.token', '')
|
|
497
574
|
|
|
498
|
-
//
|
|
499
|
-
let user = await
|
|
575
|
+
//getAndVerifyBrowserTokenUser
|
|
576
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'updateAPIs')
|
|
500
577
|
|
|
501
578
|
//check
|
|
502
579
|
if (!iseobj(user)) {
|
|
503
580
|
console.log('token', token)
|
|
504
581
|
console.log('[API]updateAPIs/check user: invalid user')
|
|
582
|
+
console.log(`token does not have permission`)
|
|
505
583
|
return Promise.reject(`token does not have permission`)
|
|
506
584
|
}
|
|
507
585
|
|
|
@@ -533,13 +611,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
533
611
|
//token
|
|
534
612
|
let token = get(req, 'query.token', '')
|
|
535
613
|
|
|
536
|
-
//
|
|
537
|
-
let user = await
|
|
614
|
+
//getAndVerifyAppTokenUser
|
|
615
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceApis')
|
|
538
616
|
|
|
539
617
|
//check
|
|
540
618
|
if (!iseobj(user)) {
|
|
541
619
|
console.log('token', token)
|
|
542
620
|
console.log('[API]syncAndReplaceApis/check user: invalid user')
|
|
621
|
+
console.log(`token does not have permission`)
|
|
543
622
|
return Promise.reject(`token does not have permission`)
|
|
544
623
|
}
|
|
545
624
|
|
package/src/App.vue
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
<script>
|
|
17
17
|
import get from 'lodash/get'
|
|
18
18
|
import cloneDeep from 'lodash/cloneDeep'
|
|
19
|
+
import isestr from 'wsemi/src/isestr.mjs'
|
|
20
|
+
import isDev from 'wsemi/src/isDev.mjs'
|
|
19
21
|
import wui from 'w-ui-loginout/src/WUiLoginout.mjs'
|
|
20
22
|
import Layout from './components/Layout.vue'
|
|
21
23
|
import LayoutState from './components/LayoutState.vue'
|
|
@@ -50,12 +52,25 @@ export default {
|
|
|
50
52
|
console.log('login error', cloneDeep(data))
|
|
51
53
|
vo.$ui.updateConnState(data.text)
|
|
52
54
|
vo.$ui.updateUserToken('')
|
|
53
|
-
|
|
55
|
+
let urlRedirect = get(window, '___pmwapi___.urlRedirect', '')
|
|
56
|
+
if (!isestr(urlRedirect)) {
|
|
57
|
+
console.log('urlRedirect', urlRedirect)
|
|
58
|
+
throw new Error(`invalid urlRedirect`)
|
|
59
|
+
}
|
|
60
|
+
if (isDev()) {
|
|
61
|
+
console.log('60s redirect to:', urlRedirect)
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
window.location.href = urlRedirect
|
|
64
|
+
}, 60 * 1000)
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
window.location.href = urlRedirect
|
|
68
|
+
}
|
|
54
69
|
}
|
|
55
70
|
|
|
56
71
|
//login
|
|
57
72
|
console.log('login...')
|
|
58
|
-
let ll = wui('
|
|
73
|
+
let ll = wui('wapi', {
|
|
59
74
|
timeWaitAnimation: 2000,
|
|
60
75
|
params: {},
|
|
61
76
|
})
|
package/src/store/mutations.mjs
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
import each from 'lodash/each'
|
|
2
2
|
import set from 'lodash/set'
|
|
3
|
-
import cloneDeep from 'lodash/cloneDeep'
|
|
4
3
|
import * as types from './types.mjs'
|
|
5
4
|
import ds from '../schema/index.mjs'
|
|
6
5
|
|
|
7
6
|
|
|
8
|
-
//userDef
|
|
9
|
-
let userDef = {
|
|
10
|
-
id: '', //id-for-admin
|
|
11
|
-
name: '', //測試者
|
|
12
|
-
email: '', //id-for-admin@gmail.com
|
|
13
|
-
// isVirtual: 'n',
|
|
14
|
-
isAdmin: 'n',
|
|
15
|
-
// isActive: 'n',
|
|
16
|
-
}
|
|
17
|
-
|
|
18
7
|
//state, 全域狀態
|
|
19
8
|
let state = {
|
|
20
9
|
|
|
@@ -35,8 +24,12 @@ let state = {
|
|
|
35
24
|
menu: {}, //初始值需為物件, 否則LayoutContent會取menu.key出錯
|
|
36
25
|
|
|
37
26
|
userToken: '',
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
user: {
|
|
28
|
+
id: '', //id-for-admin
|
|
29
|
+
name: '', //測試者
|
|
30
|
+
email: '', //admin@example.com
|
|
31
|
+
isAdmin: 'n',
|
|
32
|
+
},
|
|
40
33
|
|
|
41
34
|
lang: 'cht',
|
|
42
35
|
keyLangs: {
|
package/srv.mjs
CHANGED
|
@@ -16,6 +16,7 @@ let opt = {
|
|
|
16
16
|
|
|
17
17
|
serverPort: 11005,
|
|
18
18
|
subfolder: '', //mapi
|
|
19
|
+
urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
|
|
19
20
|
|
|
20
21
|
webName: {
|
|
21
22
|
'eng': 'API Service',
|
|
@@ -29,13 +30,13 @@ let opt = {
|
|
|
29
30
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
let getUserByToken = (token) => {
|
|
33
|
+
let getUserByToken = async (token) => {
|
|
33
34
|
// return {} //測試無法登入
|
|
34
35
|
if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
35
36
|
return {
|
|
36
37
|
id: 'id-for-application',
|
|
37
38
|
name: 'application',
|
|
38
|
-
email: '
|
|
39
|
+
email: 'application@example.com',
|
|
39
40
|
isAdmin: 'y',
|
|
40
41
|
}
|
|
41
42
|
}
|
|
@@ -52,13 +53,22 @@ let getUserByToken = (token) => {
|
|
|
52
53
|
return {}
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
let
|
|
56
|
-
console.log('
|
|
56
|
+
let verifyBrowserUser = (user, caller) => {
|
|
57
|
+
console.log('verifyBrowserUser/user', user)
|
|
58
|
+
// return false //測試無法登入
|
|
59
|
+
console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
60
|
+
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let verifyAppUser = (user, caller) => {
|
|
64
|
+
console.log('verifyAppUser/user', user)
|
|
65
|
+
// return false //測試無法登入
|
|
66
|
+
console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
57
67
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
58
68
|
}
|
|
59
69
|
|
|
60
70
|
//WWebApi
|
|
61
|
-
let instWWebApi = WWebApi(WOrm, url, db, getUserByToken,
|
|
71
|
+
let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
62
72
|
|
|
63
73
|
instWWebApi.on('error', (err) => {
|
|
64
74
|
console.log(err)
|
package/tableTags-web-api.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"apis":"
|
|
1
|
+
{"apis":"6FtLVT"}
|