w-web-sso 1.0.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.
Files changed (102) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.github/workflows/ci-test.yml +24 -0
  5. package/.jsdoc +25 -0
  6. package/.vscode/launch.json +20 -0
  7. package/LICENSE +21 -0
  8. package/README.md +25 -0
  9. package/SECURITY.md +5 -0
  10. package/babel.config.js +15 -0
  11. package/dist/css/app.969ad1db.css +1 -0
  12. package/dist/index.tmp +3 -0
  13. package/dist/js/app-legacy.ff64be1c.js +2 -0
  14. package/dist/js/app-legacy.ff64be1c.js.map +1 -0
  15. package/dist/js/app.ff64be1c.js +2 -0
  16. package/dist/js/app.ff64be1c.js.map +1 -0
  17. package/dist/js/chunk-vendors-legacy.0bb7a31b.js +13 -0
  18. package/dist/js/chunk-vendors-legacy.0bb7a31b.js.map +1 -0
  19. package/dist/js/chunk-vendors.0bb7a31b.js +13 -0
  20. package/dist/js/chunk-vendors.0bb7a31b.js.map +1 -0
  21. package/dist/w-web-sso.umd.js +7 -0
  22. package/dist/w-web-sso.umd.js.map +1 -0
  23. package/docs/WWebSso.html +938 -0
  24. package/docs/WWebSso.mjs.html +721 -0
  25. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  26. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  27. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  28. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  29. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  30. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  31. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  32. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  33. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  34. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  35. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  36. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  37. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  38. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  39. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  40. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  41. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  42. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  43. package/docs/index.html +84 -0
  44. package/docs/scripts/collapse.js +39 -0
  45. package/docs/scripts/commonNav.js +28 -0
  46. package/docs/scripts/linenumber.js +25 -0
  47. package/docs/scripts/nav.js +12 -0
  48. package/docs/scripts/polyfill.js +4 -0
  49. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  50. package/docs/scripts/prettify/lang-css.js +2 -0
  51. package/docs/scripts/prettify/prettify.js +28 -0
  52. package/docs/scripts/search.js +99 -0
  53. package/docs/styles/jsdoc.css +776 -0
  54. package/docs/styles/prettify.css +80 -0
  55. package/g.backupDb.mjs +10 -0
  56. package/g.getSettings.mjs +17 -0
  57. package/g.initialData.mjs +94 -0
  58. package/g.initialTestData.mjs +21 -0
  59. package/g.mOrm.mjs +24 -0
  60. package/g.provideUsers.mjs +45 -0
  61. package/package.json +70 -0
  62. package/public/index.html +30 -0
  63. package/script.txt +22 -0
  64. package/server/WWebSso.mjs +649 -0
  65. package/server/hashPassword.mjs +27 -0
  66. package/server/proc.mjs +543 -0
  67. package/server/provideUsers.mjs +68 -0
  68. package/src/App.vue +123 -0
  69. package/src/components/Common/CheckYes.vue +85 -0
  70. package/src/components/Common/CheckYesNo.vue +91 -0
  71. package/src/components/Common/LabelItem.vue +106 -0
  72. package/src/components/Common/LoadingWinBar.vue +115 -0
  73. package/src/components/Layout.vue +160 -0
  74. package/src/components/LayoutContent.vue +193 -0
  75. package/src/components/LayoutContentUsers.vue +498 -0
  76. package/src/components/LayoutState.vue +91 -0
  77. package/src/components/PageLogin.vue +524 -0
  78. package/src/components/VeUser.vue +446 -0
  79. package/src/components/ruleGroup.vue +645 -0
  80. package/src/main.js +97 -0
  81. package/src/plugins/mDataSelectorSchema.mjs +30 -0
  82. package/src/plugins/mDataSupport.mjs +23 -0
  83. package/src/plugins/mShare.mjs +229 -0
  84. package/src/plugins/mUI.mjs +229 -0
  85. package/src/schema/gi.mjs +8 -0
  86. package/src/schema/index.mjs +18 -0
  87. package/src/schema/tables/tokens.mjs +70 -0
  88. package/src/schema/tables/users.mjs +110 -0
  89. package/src/store/actions.mjs +1 -0
  90. package/src/store/getters.mjs +1 -0
  91. package/src/store/index.mjs +25 -0
  92. package/src/store/mutations.mjs +333 -0
  93. package/src/store/types.mjs +15 -0
  94. package/srv.mjs +84 -0
  95. package/tableTags-web-sso.json +1 -0
  96. package/test/all.test.mjs +10 -0
  97. package/toolg/addVersion.mjs +4 -0
  98. package/toolg/cleanFolder.mjs +4 -0
  99. package/toolg/gDistRollup.mjs +36 -0
  100. package/toolg/genEntry.mjs +23 -0
  101. package/toolg/modifyReadme.mjs +4 -0
  102. package/vue.config.js +15 -0
@@ -0,0 +1,721 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>WWebSso.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebSso.html">WWebSso</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">WWebSso.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import path from 'path'
49
+ import fs from 'fs'
50
+ import ot from 'dayjs'
51
+ import get from 'lodash-es/get.js'
52
+ import each from 'lodash-es/each.js'
53
+ import size from 'lodash-es/size.js'
54
+ import keys from 'lodash-es/keys.js'
55
+ import iseobj from 'wsemi/src/iseobj.mjs'
56
+ import isestr from 'wsemi/src/isestr.mjs'
57
+ import ispint from 'wsemi/src/ispint.mjs'
58
+ import isearr from 'wsemi/src/isearr.mjs'
59
+ import ispnum from 'wsemi/src/ispnum.mjs'
60
+ import isfun from 'wsemi/src/isfun.mjs'
61
+ import ispm from 'wsemi/src/ispm.mjs'
62
+ import cint from 'wsemi/src/cint.mjs'
63
+ import j2o from 'wsemi/src/j2o.mjs'
64
+ import strleft from 'wsemi/src/strleft.mjs'
65
+ import strright from 'wsemi/src/strright.mjs'
66
+ import strdelright from 'wsemi/src/strdelright.mjs'
67
+ import pm2resolve from 'wsemi/src/pm2resolve.mjs'
68
+ import pmSeries from 'wsemi/src/pmSeries.mjs'
69
+ import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
70
+ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
71
+ import replace from 'wsemi/src/replace.mjs'
72
+ import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
73
+ import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
74
+ import ds from '../src/schema/index.mjs'
75
+ import proc from './proc.mjs'
76
+ // import { getUserRules } from '../src/plugins/mShare.mjs'
77
+
78
+
79
+ /**
80
+ * 權限伺服器
81
+ *
82
+ * @class
83
+ * @param {Function} WOrm 輸入資料庫ORM函數
84
+ * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
85
+ * @param {String} db 輸入資料庫名稱字串
86
+ * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
87
+ * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
88
+ * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
89
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
90
+ * @param {Integer} [opt.serverPort=11007] 輸入伺服器通訊port,預設11006
91
+ * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
92
+ * @param {Function} [opt.getUserById=null] 輸入當bCheckUser=true時依照使用者ID取得使用者資訊物件函數,預設null
93
+ * @param {Boolean} [opt.bExcludeWhenNotAdmin=false] 輸入使用ORM的select方法時是否自動刪除數據內isActive欄位之布林值,預設false
94
+ * @param {Object} [opt.webName={}] 輸入站台名稱物件,至少包含語系eng與cht鍵的名稱,預設{}
95
+ * @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
96
+ * @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
97
+ * @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
98
+ * @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
99
+ * @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
100
+ * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
101
+ * @example
102
+ *
103
+ *
104
+ *
105
+ */
106
+ function WWebSso(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
107
+ let instWServHapiServer = null
108
+
109
+
110
+ //check WOrm
111
+ if (!isfun(WOrm)) {
112
+ console.log('invalid WOrm', WOrm)
113
+ throw new Error('invalid WOrm')
114
+ }
115
+
116
+
117
+ //check url
118
+ if (!isestr(url)) {
119
+ console.log('invalid url', url)
120
+ throw new Error('invalid url')
121
+ }
122
+
123
+
124
+ //check db
125
+ if (!isestr(db)) {
126
+ console.log('invalid db', db)
127
+ throw new Error('invalid db')
128
+ }
129
+
130
+
131
+ //check getUserByToken
132
+ if (!isfun(getUserByToken)) {
133
+ console.log('invalid getUserByToken', getUserByToken)
134
+ throw new Error('invalid getUserByToken')
135
+ }
136
+
137
+
138
+ //check verifyBrowserUser
139
+ if (!isfun(verifyBrowserUser)) {
140
+ console.log('invalid verifyBrowserUser', verifyBrowserUser)
141
+ throw new Error('invalid verifyBrowserUser')
142
+ }
143
+
144
+
145
+ //check verifyAppUser
146
+ if (!isfun(verifyAppUser)) {
147
+ console.log('invalid verifyAppUser', verifyAppUser)
148
+ throw new Error('invalid verifyAppUser')
149
+ }
150
+
151
+
152
+ //serverPort
153
+ let serverPort = get(opt, 'serverPort')
154
+ if (!ispint(serverPort)) {
155
+ serverPort = 11007
156
+ }
157
+ serverPort = cint(serverPort)
158
+
159
+
160
+ //bCheckUser
161
+ let bCheckUser = get(opt, 'bCheckUser', false)
162
+
163
+
164
+ //getUserById
165
+ let getUserById = get(opt, 'getUserById', null)
166
+
167
+
168
+ //bExcludeWhenNotAdmin
169
+ let bExcludeWhenNotAdmin = get(opt, 'bExcludeWhenNotAdmin', false)
170
+
171
+
172
+ //webName
173
+ let webName = get(opt, 'webName', {})
174
+
175
+
176
+ //webDescription
177
+ let webDescription = get(opt, 'webDescription', {})
178
+
179
+
180
+ //webLogo
181
+ let webLogo = get(opt, 'webLogo', '')
182
+
183
+
184
+ //webBackgoundGradientColors
185
+ let webBackgoundGradientColors = get(opt, 'webBackgoundGradientColors', [])
186
+ if (!isearr(webBackgoundGradientColors)) {
187
+ webBackgoundGradientColors = ['#FFE0B2', '#FFCC80', '#FFF59D']
188
+ }
189
+
190
+
191
+ //webKey
192
+ let webKey = get(opt, 'webKey', '')
193
+
194
+
195
+ //salt
196
+ let salt = get(opt, 'salt', '')
197
+
198
+
199
+ //timeExpired
200
+ let timeExpired = get(opt, 'timeExpired', '')
201
+ if (ispnum(timeExpired)) {
202
+ timeExpired = 30
203
+ }
204
+
205
+ //subfolder
206
+ let subfolder = get(opt, 'subfolder', '')
207
+ if (isestr(subfolder)) {
208
+ if (strright(subfolder, 1) === '/') { //右邊不需要給「/」
209
+ subfolder = strdelright(subfolder, 1)
210
+ }
211
+ if (strleft(subfolder, 1) !== '/') { //左邊需要給「/」
212
+ subfolder = `/${subfolder}`
213
+ }
214
+ }
215
+
216
+
217
+ //urlRedirect
218
+ let urlRedirect = get(opt, 'urlRedirect', '')
219
+
220
+
221
+ //mappingBy
222
+ let mappingBy = get(opt, 'mappingBy', '')
223
+ if (mappingBy !== 'id' &amp;&amp; mappingBy !== 'email' &amp;&amp; mappingBy !== 'name') {
224
+ mappingBy = 'email'
225
+ }
226
+ // console.log('mappingBy', mappingBy)
227
+
228
+
229
+ //WServOrm
230
+ let optWServOrm = {
231
+ bCheckUser,
232
+ getUserById,
233
+ bExcludeWhenNotAdmin,
234
+ }
235
+ let wp = {}
236
+ try {
237
+ wp = WServOrm(ds, WOrm, url, db, optWServOrm)
238
+ }
239
+ catch (err) {
240
+ console.log(err)
241
+ }
242
+ let { woItems, procOrm } = wp
243
+
244
+
245
+ //getWebInfor
246
+ let getWebInfor = (_t) => {
247
+ return {
248
+ webName,
249
+ webDescription,
250
+ webLogo,
251
+ webBackgoundGradientColors,
252
+ webKey,
253
+ }
254
+ }
255
+
256
+
257
+ //proc
258
+ let p = proc(woItems, { salt, timeExpired })
259
+
260
+
261
+ //detect
262
+ let stCleanTokens = 'none'
263
+ setInterval(() => {
264
+ if (stCleanTokens === 'doing') {
265
+ return
266
+ }
267
+ stCleanTokens = 'doing'
268
+ p.cleanTokens()
269
+ .finally(() => {
270
+ stCleanTokens = 'none'
271
+ })
272
+ }, 1000)
273
+
274
+
275
+ // //parseToken
276
+ // let parseToken = (req) => {
277
+
278
+ // //token
279
+ // let token = get(req, 'query.token', '')
280
+ // // console.log('token', token)
281
+
282
+ // return token
283
+ // }
284
+
285
+
286
+ // //getTokenUser
287
+ // let getTokenUser = async(token) => {
288
+
289
+ // //userSelf
290
+ // let userSelf = null
291
+ // if (isestr(token)) {
292
+ // userSelf = getUserByToken(token)
293
+ // if (ispm(userSelf)) {
294
+ // userSelf = await userSelf
295
+ // }
296
+ // }
297
+ // // console.log('userSelf', userSelf)
298
+
299
+ // //check
300
+ // if (!iseobj(userSelf)) {
301
+ // console.log(`token`, token)
302
+ // console.log(`can not find the user from token`)
303
+ // return Promise.reject(`can not find the user from token`)
304
+ // }
305
+
306
+ // //check userSelf
307
+ // if (true) {
308
+ // let id = get(userSelf, 'id', '')
309
+ // if (!isestr(id)) {
310
+ // console.log('userSelf', userSelf)
311
+ // console.log('can not get the userId')
312
+ // return Promise.reject(`can not get the userId`)
313
+ // }
314
+ // let email = get(userSelf, 'email', '')
315
+ // if (!isestr(email)) {
316
+ // console.log('userSelf', userSelf)
317
+ // console.log('can not get the email of user')
318
+ // return Promise.reject(`can not get the email of user`)
319
+ // }
320
+ // let name = get(userSelf, 'name', '')
321
+ // if (!isestr(name)) {
322
+ // console.log('userSelf', userSelf)
323
+ // console.log('can not get userName')
324
+ // return Promise.reject(`can not get userName`)
325
+ // }
326
+ // let isAdmin = get(userSelf, 'isAdmin', '')
327
+ // if (isAdmin !== 'y' &amp;&amp; isAdmin !== 'n') {
328
+ // console.log('userSelf', userSelf)
329
+ // console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
330
+ // console.log('can not get the role of user')
331
+ // return Promise.reject(`can not get the role of user`)
332
+ // }
333
+ // }
334
+
335
+ // //須反查sso內users, 提供正規化屬性
336
+ // let vSelf = get(userSelf, mappingBy, '')
337
+ // // console.log('vSelf', vSelf)
338
+
339
+ // //check
340
+ // if (!isestr(vSelf)) {
341
+ // console.log('userSelf', userSelf)
342
+ // console.log('mappingBy', mappingBy)
343
+ // console.log('can not get the prop of user by mappingBy')
344
+ // return Promise.reject(`can not get the prop of user by mappingBy`)
345
+ // }
346
+
347
+ // //userFind
348
+ // let userFind = await woItems.users.select({ [mappingBy]: vSelf, isActive: 'y' })
349
+ // userFind = get(userFind, 0, null)
350
+ // // console.log('userFind', userFind)
351
+
352
+ // //check
353
+ // if (!iseobj(userFind)) {
354
+ // console.log('userSelf', userSelf)
355
+ // console.log('mappingBy', mappingBy)
356
+ // console.log('can not get the user from sso')
357
+ // return Promise.reject(`can not get the user from sso`)
358
+ // }
359
+
360
+ // //複寫isAdmin
361
+ // let isAdminSrc = get(userSelf, 'isAdmin', '')
362
+ // let isAdminSelf = get(userFind, 'isAdmin', '')
363
+ // if (isAdminSrc !== isAdminSelf) {
364
+ // userFind.isAdmin = isAdminSelf
365
+ // }
366
+ // // console.log('userFind(isAdmin)', userFind)
367
+
368
+ // return userFind
369
+ // }
370
+
371
+
372
+ // //getAndVerifyBrowserTokenUser
373
+ // let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
374
+
375
+ // //getTokenUser
376
+ // let userSelf = await getTokenUser(token)
377
+
378
+ // //verifyBrowserUser
379
+ // let b = verifyBrowserUser(userSelf, caller)
380
+ // if (ispm(b)) {
381
+ // b = await b
382
+ // }
383
+
384
+ // //check
385
+ // if (!b) {
386
+ // console.log('userSelf', userSelf)
387
+ // console.log(`user does not have permission`)
388
+ // return Promise.reject(`user does not have permission`)
389
+ // }
390
+
391
+ // return userSelf
392
+ // }
393
+
394
+
395
+ // //getAndVerifyAppTokenUser
396
+ // let getAndVerifyAppTokenUser = async (token, caller = '') => {
397
+
398
+ // //getTokenUser
399
+ // let userSelf = await getTokenUser(token)
400
+
401
+ // //verifyAppUser
402
+ // let b = verifyAppUser(userSelf, caller)
403
+ // if (ispm(b)) {
404
+ // b = await b
405
+ // }
406
+
407
+ // //check
408
+ // if (!b) {
409
+ // console.log('userSelf', userSelf)
410
+ // console.log(`user does not have permission`)
411
+ // return Promise.reject(`user does not have permission`)
412
+ // }
413
+
414
+ // return userSelf
415
+ // }
416
+
417
+
418
+ // //parsePayload
419
+ // let parsePayload = async (req, key) => {
420
+
421
+ // //inp
422
+ // let inp = get(req, 'payload')
423
+
424
+ // //to obj
425
+ // if (isestr(inp)) {
426
+ // inp = j2o(inp)
427
+ // }
428
+
429
+ // //check
430
+ // if (!iseobj(inp)) {
431
+ // console.log('inp', inp)
432
+ // console.log('invalid inp from req')
433
+ // return Promise.reject(`invalid inp from req`)
434
+ // }
435
+
436
+ // //from
437
+ // let from = get(inp, 'from', '')
438
+
439
+ // //check
440
+ // if (!isestr(from)) {
441
+ // console.log('inp', inp)
442
+ // console.log('from', from)
443
+ // console.log('invalid from from inp')
444
+ // return Promise.reject(`invalid from from inp`)
445
+ // }
446
+
447
+
448
+ // //vs
449
+ // let vs = get(inp, key, [])
450
+
451
+ // //check
452
+ // if (!isearr(vs)) {
453
+ // console.log('inp', inp)
454
+ // console.log(key, vs)
455
+ // console.log(`invalid ${key} from inp`)
456
+ // return Promise.reject(`invalid ${key} from inp`)
457
+ // }
458
+
459
+ // //resave
460
+ // inp = {
461
+ // from,
462
+ // [key]: vs,
463
+ // }
464
+
465
+ // return inp
466
+ // }
467
+
468
+
469
+ // //syncAndReplaceRows
470
+ // let syncAndReplaceRows = async (params, key) => {
471
+
472
+ // //from
473
+ // let from = get(params, 'from', '')
474
+ // // console.log('from', from)
475
+
476
+ // //check
477
+ // if (!isestr(from)) {
478
+ // console.log('params', params)
479
+ // console.log('from', from)
480
+ // console.log(`invalid from`)
481
+ // return Promise.reject(`invalid from`)
482
+ // }
483
+
484
+ // //vs
485
+ // let vs = get(params, key, [])
486
+ // // console.log(key, vs)
487
+
488
+ // //check
489
+ // if (!isearr(vs)) {
490
+ // console.log('params', params)
491
+ // console.log(key, vs)
492
+ // console.log(`invalid ${key}`)
493
+ // return Promise.reject(`invalid ${key}`)
494
+ // }
495
+
496
+ // //save from
497
+ // each(vs, (v, k) => {
498
+ // vs[k].from = from
499
+ // })
500
+
501
+ // //delAll from
502
+ // await woItems[key].delAll({ from })
503
+
504
+ // //insert
505
+ // let r = await woItems[key].insert(vs)
506
+
507
+ // return r
508
+ // }
509
+
510
+
511
+ //pathStaticFiles
512
+ let pathStaticFiles = 'dist'
513
+ let npmPathStaticFiles = './node_modules/w-web-sso/dist'
514
+ if (fsIsFolder(npmPathStaticFiles)) {
515
+ pathStaticFiles = npmPathStaticFiles
516
+ }
517
+ // console.log('pathStaticFiles', pathStaticFiles)
518
+
519
+
520
+ //subfolder
521
+ let fnEntryIn = 'index.tmp'
522
+ let fnEntryOut = 'index.html'
523
+ try {
524
+ let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
525
+ if (!fsIsFile(fpEntryIn)) {
526
+ fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
527
+ }
528
+ if (!fsIsFile(fpEntryIn)) {
529
+ console.log('fpEntryIn', fpEntryIn)
530
+ throw new Error(`invalid fpEntryIn`)
531
+ }
532
+ let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
533
+ let c = fs.readFileSync(fpEntryIn, 'utf8')
534
+ c = replace(c, '/msso/', '{sfd}/') //方法同genEntry
535
+ c = replace(c, '{sfd}', subfolder)
536
+ c = replace(c, '{urlRedirect}', urlRedirect)
537
+ fs.writeFileSync(fpEntryOut, c, 'utf8')
538
+ }
539
+ catch (err) {
540
+ console.log(err)
541
+ console.log(`can not generate ${fnEntryOut}`)
542
+ }
543
+
544
+
545
+ //apis
546
+ let apis = [
547
+ // {
548
+ // method: 'GET',
549
+ // path: '/api/someAPI',
550
+ // handler: async function (req, res) {
551
+
552
+ // // //token
553
+ // // let token = get(req, 'query.token', '')
554
+
555
+ // return 'someAPI'
556
+ // },
557
+ // },
558
+ {
559
+ method: 'GET',
560
+ path: '/getWebInfor',
561
+ handler: async function (req, res) {
562
+ return getWebInfor()
563
+ },
564
+ },
565
+ {
566
+ method: 'GET',
567
+ path: '/api/getUserByToken', //名稱getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
568
+ handler: async function (req, res) {
569
+ // console.log('getUserByToken', req)
570
+
571
+ // async function core() {
572
+ // //提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
573
+
574
+ // //token
575
+ // let token = get(req, 'query.token', '')
576
+ // // console.log('token', token)
577
+
578
+ // //getAndVerifyBrowserTokenUser
579
+ // let userSelf = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
580
+ // // console.log('userSelf', userSelf)
581
+
582
+ // //check
583
+ // if (!iseobj(userSelf)) {
584
+ // console.log('token', token)
585
+ // console.log('[API]getUserByToken/check userSelf: invalid userSelf')
586
+ // console.log(`token does not have permission`)
587
+ // return Promise.reject(`token does not have permission`)
588
+ // }
589
+
590
+ // return userSelf
591
+ // }
592
+
593
+ // //pm2resolve core
594
+ // let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
595
+ // // console.log('getUserByToken', r)
596
+
597
+ // return r
598
+
599
+ return null
600
+ },
601
+ },
602
+ {
603
+ method: 'GET',
604
+ path: '/api/getUsersByToken', //名稱getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
605
+ handler: async function (req, res) {
606
+ // console.log('getUsersByToken', req)
607
+
608
+ // async function core() {
609
+ // //提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
610
+
611
+ // //token
612
+ // let token = get(req, 'query.token', '')
613
+ // // console.log('token', token)
614
+
615
+ // //getAndVerifyBrowserTokenUser
616
+ // let userSelf = await getAndVerifyBrowserTokenUser(token, 'getUsersByToken')
617
+ // // console.log('userSelf', userSelf)
618
+
619
+ // //check
620
+ // if (!iseobj(userSelf)) {
621
+ // console.log('token', token)
622
+ // console.log('[API]getUserByToken/check userSelf: invalid userSelf')
623
+ // console.log(`token does not have permission`)
624
+ // return Promise.reject(`token does not have permission`)
625
+ // }
626
+
627
+ // return userSelf
628
+ // }
629
+
630
+ // //pm2resolve core
631
+ // let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
632
+ // // console.log('getUserByToken', r)
633
+
634
+ // return r
635
+
636
+ return null
637
+ },
638
+ },
639
+ ]
640
+
641
+
642
+ //tableNamesExec, tableNamesSync
643
+ let tableNamesExec = keys(ds)
644
+ // let tableNamesSync = filter(tableNamesExec, (v) => {
645
+ // return strright(v, 5) !== 'Items'//不同步數據
646
+ // })
647
+ let tableNamesSync = []
648
+
649
+
650
+ //WServHapiServer
651
+ instWServHapiServer = new WServHapiServer({
652
+ port: opt.serverPort,
653
+ pathStaticFiles,
654
+ apis,
655
+ getUserIDFromToken: async (token) => { //可使用async或sync函數
656
+ return ''
657
+ },
658
+ useDbORM: true,
659
+ dbORMs: woItems,
660
+ operORM: procOrm, //procOrm的輸入為: userId, tableName, methodName, input
661
+ tableNamesExec,
662
+ methodsExec: ['select', 'insert', 'save', 'del', 'delAll'], //mix需於procOrm內註冊以提供
663
+ tableNamesSync,
664
+ extFuncs: { //接收參數第1個為userId, 之後才是前端給予參數
665
+ getWebInfor,
666
+ getUserByToken: (_t, token) => {
667
+ return p.getUserByToken(token)
668
+ },
669
+ loginByAccountAndPassword: (_t, account, password) => {
670
+ return p.loginByAccountAndPassword(account, password)
671
+ },
672
+ checkToken: (_t, token) => {
673
+ return p.checkToken(token)
674
+ },
675
+ refreshToken: (_t, token) => {
676
+ return p.refreshToken(token)
677
+ },
678
+ logOutByToken: (_t, token) => {
679
+ return p.logOutByToken(token)
680
+ },
681
+ getUsersList: (_t, token) => {
682
+ return p.getUsersList(token)
683
+ },
684
+ //...
685
+ },
686
+ hookBefores: null,
687
+ hookAfters: null,
688
+ fnTableTags: 'tableTags-web-sso.json',
689
+ })
690
+
691
+
692
+ return instWServHapiServer
693
+ }
694
+
695
+
696
+ export default WWebSso
697
+ </code></pre>
698
+ </article>
699
+ </section>
700
+
701
+
702
+
703
+
704
+
705
+
706
+ </div>
707
+
708
+ <br class="clear">
709
+
710
+ <footer>
711
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Apr 15 2024 15:51:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
712
+ </footer>
713
+
714
+ <script>prettyPrint();</script>
715
+ <script src="scripts/polyfill.js"></script>
716
+ <script src="scripts/linenumber.js"></script>
717
+
718
+
719
+
720
+ </body>
721
+ </html>