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.
@@ -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} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
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: 'admin@example.com',
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 verifyUser = (user) => {
103
- * console.log('於生產環境時得加入驗證user機制')
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, verifyUser, opt)
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, verifyUser, opt = {}) {
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 verifyUser
148
- if (!isfun(verifyUser)) {
149
- console.log('invalid verifyUser', verifyUser)
150
- throw new Error('invalid verifyUser')
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
- //getTokenUserForSelf
225
- let getTokenUserForSelf = async (token) => {
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(`can not find the user from token`, token)
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
- //verifyUser
240
- let b = verifyUser(userSelf)
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
- //getTokenUserForSelf
433
- let user = await getTokenUserForSelf(token)
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
- //getTokenUserForSelf
464
- let user = await getTokenUserForSelf(token)
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
- //getTokenUserForSelf
499
- let user = await getTokenUserForSelf(token)
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
- //getTokenUserForSelf
537
- let user = await getTokenUserForSelf(token)
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
- vo.$ui.updateUserSelf(get(vo, `$store.state.userDef`))
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('wperm', {
73
+ let ll = wui('wapi', {
59
74
  timeWaitAnimation: 2000,
60
75
  params: {},
61
76
  })
@@ -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
- userDef: cloneDeep(userDef),
39
- userSelf: cloneDeep(userDef),
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: 'admin@example.com',
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 verifyUser = (user) => {
56
- console.log('於生產環境時得加入驗證user機制')
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, verifyUser, opt)
71
+ let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
62
72
 
63
73
  instWWebApi.on('error', (err) => {
64
74
  console.log(err)
@@ -1 +1 @@
1
- {"apis":"fY7kYV"}
1
+ {"apis":"6FtLVT"}