w-web-api 1.0.30 → 1.0.32
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 +1 -1
- package/dist/js/{chunk-vendors.2a4fa50d.js → chunk-vendors-legacy.96a55c4e.js} +2 -2
- package/dist/js/chunk-vendors-legacy.96a55c4e.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.2a4fa50d.js → chunk-vendors.96a55c4e.js} +2 -2
- package/dist/js/chunk-vendors.96a55c4e.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 +42 -6
- package/docs/WWebApi.mjs.html +77 -24
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/server/WWebApi.mjs +76 -23
- package/srv.mjs +12 -4
- package/tableTags-web-api.json +1 -1
- package/dist/js/chunk-vendors-legacy.2a4fa50d.js.map +0 -1
- package/dist/js/chunk-vendors.2a4fa50d.js.map +0 -1
package/docs/WWebApi.html
CHANGED
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
<h4 class="name" id="WWebApi"><span class="type-signature"></span>new WWebApi<span class="signature">(WOrm, url, db, getUserByToken,
|
|
67
|
+
<h4 class="name" id="WWebApi"><span class="type-signature"></span>new WWebApi<span class="signature">(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt<span class="signature-attributes">opt</span>)</span><span class="type-signature"> → {Object}</span></h4>
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
|
|
81
81
|
<dt class="tag-source">Source:</dt>
|
|
82
82
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
83
|
-
<a href="WWebApi.mjs.html">WWebApi.mjs</a>, <a href="WWebApi.mjs.html#
|
|
83
|
+
<a href="WWebApi.mjs.html">WWebApi.mjs</a>, <a href="WWebApi.mjs.html#line128">line 128</a>
|
|
84
84
|
</li></ul></dd>
|
|
85
85
|
|
|
86
86
|
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
|
|
128
128
|
<h5 class="h5-examples">Example</h5>
|
|
129
129
|
|
|
130
|
-
<pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
131
130
|
bCheckUser: false,
|
|
132
131
|
getUserById: null,
|
|
133
132
|
bExcludeWhenNotAdmin: false,
|
|
134
133
|
serverPort: 11005,
|
|
135
134
|
subfolder: '', //mapi
|
|
136
135
|
webName: {
|
|
137
136
|
'eng': 'API Service',
|
|
138
137
|
'cht': 'API管理系統',
|
|
139
138
|
},
|
|
140
139
|
webDescription: {
|
|
141
140
|
'eng': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
142
141
|
'cht': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
143
142
|
},
|
|
144
143
|
webLogo: 'data:image/svg+xml;base64,...',
|
|
145
144
|
// return {} //測試無法登入
|
|
146
145
|
if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
147
146
|
return {
|
|
148
147
|
id: 'id-for-application',
|
|
149
148
|
name: 'application',
|
|
150
149
|
email: 'admin@example.com',
|
|
151
150
|
isAdmin: 'y',
|
|
152
151
|
}
|
|
153
152
|
}
|
|
154
153
|
if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
|
|
155
154
|
return {
|
|
156
155
|
id: 'id-for-admin',
|
|
157
156
|
name: '測試者',
|
|
158
157
|
email: 'admin@example.com',
|
|
159
158
|
isAdmin: 'y',
|
|
160
159
|
}
|
|
161
160
|
}
|
|
162
161
|
console.log('invalid token', token)
|
|
163
162
|
console.log('於生產環境時得加入SSO等驗證token機制')
|
|
164
163
|
return {}
|
|
165
164
|
console.log('於生產環境時得加入驗證user機制')
|
|
166
165
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
167
166
|
console.log(err)
|
|
167
|
+
<pre class="prettyprint"><code>import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
168
168
|
bCheckUser: false,
|
|
169
169
|
getUserById: null,
|
|
170
170
|
bExcludeWhenNotAdmin: false,
|
|
171
171
|
serverPort: 11005,
|
|
172
172
|
subfolder: '', //mapi
|
|
173
173
|
urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
|
|
174
174
|
webName: {
|
|
175
175
|
'eng': 'API Service',
|
|
176
176
|
'cht': 'API管理系統',
|
|
177
177
|
},
|
|
178
178
|
webDescription: {
|
|
179
179
|
'eng': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
180
180
|
'cht': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
181
181
|
},
|
|
182
182
|
webLogo: 'data:image/svg+xml;base64,...',
|
|
183
183
|
// return {} //測試無法登入
|
|
184
184
|
if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
185
185
|
return {
|
|
186
186
|
id: 'id-for-application',
|
|
187
187
|
name: 'application',
|
|
188
188
|
email: 'application@example.com',
|
|
189
189
|
isAdmin: 'y',
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
|
|
193
193
|
return {
|
|
194
194
|
id: 'id-for-admin',
|
|
195
195
|
name: '測試者',
|
|
196
196
|
email: 'admin@example.com',
|
|
197
197
|
isAdmin: 'y',
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
console.log('invalid token', token)
|
|
201
201
|
console.log('於生產環境時得加入SSO等驗證token機制')
|
|
202
202
|
return {}
|
|
203
203
|
console.log('verifyBrowserUser/user', user)
|
|
204
204
|
// return false //測試無法登入
|
|
205
205
|
console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
206
206
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
207
207
|
console.log('verifyAppUser/user', user)
|
|
208
208
|
// return false //測試無法登入
|
|
209
209
|
console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
210
210
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
211
211
|
console.log(err)
|
|
212
212
|
|
|
213
213
|
|
|
214
214
|
|
|
@@ -305,7 +305,7 @@
|
|
|
305
305
|
|
|
306
306
|
<tr>
|
|
307
307
|
|
|
308
|
-
<td class="name"><code>
|
|
308
|
+
<td class="name"><code>verifyBrowserUser</code></td>
|
|
309
309
|
|
|
310
310
|
|
|
311
311
|
<td class="type">
|
|
@@ -334,7 +334,43 @@
|
|
|
334
334
|
</td>
|
|
335
335
|
|
|
336
336
|
|
|
337
|
-
<td class="description last"><p
|
|
337
|
+
<td class="description last"><p>輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
|
|
338
|
+
</tr>
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
<tr>
|
|
343
|
+
|
|
344
|
+
<td class="name"><code>verifyAppUser</code></td>
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
<td class="type">
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
<span class="param-type">function</span>
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
</td>
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
<td class="attributes">
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
</td>
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
<td class="default">
|
|
369
|
+
|
|
370
|
+
</td>
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
<td class="description last"><p>輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false</p></td>
|
|
338
374
|
</tr>
|
|
339
375
|
|
|
340
376
|
|
|
@@ -849,7 +885,7 @@
|
|
|
849
885
|
<br class="clear">
|
|
850
886
|
|
|
851
887
|
<footer>
|
|
852
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
888
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 14:51:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
853
889
|
</footer>
|
|
854
890
|
|
|
855
891
|
<script>prettyPrint();</script>
|
package/docs/WWebApi.mjs.html
CHANGED
|
@@ -80,7 +80,8 @@ import ds from '../src/schema/index.mjs'
|
|
|
80
80
|
* @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
81
81
|
* @param {String} db 輸入資料庫名稱字串
|
|
82
82
|
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
83
|
-
* @param {Function}
|
|
83
|
+
* @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
84
|
+
* @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
84
85
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
85
86
|
* @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
|
|
86
87
|
* @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
|
|
@@ -93,10 +94,12 @@ import ds from '../src/schema/index.mjs'
|
|
|
93
94
|
* @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
|
|
94
95
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
95
96
|
* @example
|
|
97
|
+
*
|
|
96
98
|
* import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
97
99
|
* import WWebApi from './server/WWebApi.mjs'
|
|
98
100
|
* import getSettings from './g.getSettings.mjs'
|
|
99
101
|
*
|
|
102
|
+
*
|
|
100
103
|
* //st
|
|
101
104
|
* let st = getSettings()
|
|
102
105
|
*
|
|
@@ -110,6 +113,7 @@ import ds from '../src/schema/index.mjs'
|
|
|
110
113
|
*
|
|
111
114
|
* serverPort: 11005,
|
|
112
115
|
* subfolder: '', //mapi
|
|
116
|
+
* urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11005/
|
|
113
117
|
*
|
|
114
118
|
* webName: {
|
|
115
119
|
* 'eng': 'API Service',
|
|
@@ -123,13 +127,13 @@ import ds from '../src/schema/index.mjs'
|
|
|
123
127
|
*
|
|
124
128
|
* }
|
|
125
129
|
*
|
|
126
|
-
* let getUserByToken = (token) => {
|
|
130
|
+
* let getUserByToken = async (token) => {
|
|
127
131
|
* // return {} //測試無法登入
|
|
128
132
|
* if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
129
133
|
* return {
|
|
130
134
|
* id: 'id-for-application',
|
|
131
135
|
* name: 'application',
|
|
132
|
-
* email: '
|
|
136
|
+
* email: 'application@example.com',
|
|
133
137
|
* isAdmin: 'y',
|
|
134
138
|
* }
|
|
135
139
|
* }
|
|
@@ -146,20 +150,29 @@ import ds from '../src/schema/index.mjs'
|
|
|
146
150
|
* return {}
|
|
147
151
|
* }
|
|
148
152
|
*
|
|
149
|
-
* let
|
|
150
|
-
* console.log('
|
|
153
|
+
* let verifyBrowserUser = (user, caller) => {
|
|
154
|
+
* console.log('verifyBrowserUser/user', user)
|
|
155
|
+
* // return false //測試無法登入
|
|
156
|
+
* console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
157
|
+
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
158
|
+
* }
|
|
159
|
+
*
|
|
160
|
+
* let verifyAppUser = (user, caller) => {
|
|
161
|
+
* console.log('verifyAppUser/user', user)
|
|
162
|
+
* // return false //測試無法登入
|
|
163
|
+
* console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
151
164
|
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
152
165
|
* }
|
|
153
166
|
*
|
|
154
167
|
* //WWebApi
|
|
155
|
-
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken,
|
|
168
|
+
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
156
169
|
*
|
|
157
170
|
* instWWebApi.on('error', (err) => {
|
|
158
171
|
* console.log(err)
|
|
159
172
|
* })
|
|
160
173
|
*
|
|
161
174
|
*/
|
|
162
|
-
function WWebApi(WOrm, url, db, getUserByToken,
|
|
175
|
+
function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
|
|
163
176
|
let instWServHapiServer = null
|
|
164
177
|
|
|
165
178
|
|
|
@@ -191,10 +204,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
191
204
|
}
|
|
192
205
|
|
|
193
206
|
|
|
194
|
-
//check
|
|
195
|
-
if (!isfun(
|
|
196
|
-
console.log('invalid
|
|
197
|
-
throw new Error('invalid
|
|
207
|
+
//check verifyBrowserUser
|
|
208
|
+
if (!isfun(verifyBrowserUser)) {
|
|
209
|
+
console.log('invalid verifyBrowserUser', verifyBrowserUser)
|
|
210
|
+
throw new Error('invalid verifyBrowserUser')
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
//check verifyAppUser
|
|
215
|
+
if (!isfun(verifyAppUser)) {
|
|
216
|
+
console.log('invalid verifyAppUser', verifyAppUser)
|
|
217
|
+
throw new Error('invalid verifyAppUser')
|
|
198
218
|
}
|
|
199
219
|
|
|
200
220
|
|
|
@@ -272,8 +292,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
272
292
|
}
|
|
273
293
|
|
|
274
294
|
|
|
275
|
-
//
|
|
276
|
-
let
|
|
295
|
+
//getTokenUser
|
|
296
|
+
let getTokenUser = async (token) => {
|
|
277
297
|
|
|
278
298
|
//getUserByToken
|
|
279
299
|
let userSelf = getUserByToken(token)
|
|
@@ -288,8 +308,41 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
288
308
|
return Promise.reject(`can not find the user from token`)
|
|
289
309
|
}
|
|
290
310
|
|
|
291
|
-
|
|
292
|
-
|
|
311
|
+
return userSelf
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
//getAndVerifyBrowserTokenUser
|
|
316
|
+
let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
|
|
317
|
+
|
|
318
|
+
//getTokenUser
|
|
319
|
+
let userSelf = await getTokenUser(token)
|
|
320
|
+
|
|
321
|
+
//verifyBrowserUser
|
|
322
|
+
let b = verifyBrowserUser(userSelf, caller)
|
|
323
|
+
if (ispm(b)) {
|
|
324
|
+
b = await b
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
//check
|
|
328
|
+
if (!b) {
|
|
329
|
+
console.log('userSelf', userSelf)
|
|
330
|
+
console.log(`user does not have permission`)
|
|
331
|
+
return Promise.reject(`user does not have permission`)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return userSelf
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
//getAndVerifyAppTokenUser
|
|
339
|
+
let getAndVerifyAppTokenUser = async (token, caller = '') => {
|
|
340
|
+
|
|
341
|
+
//getTokenUser
|
|
342
|
+
let userSelf = await getTokenUser(token)
|
|
343
|
+
|
|
344
|
+
//verifyAppUser
|
|
345
|
+
let b = verifyAppUser(userSelf, caller)
|
|
293
346
|
if (ispm(b)) {
|
|
294
347
|
b = await b
|
|
295
348
|
}
|
|
@@ -498,8 +551,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
498
551
|
//token
|
|
499
552
|
let token = get(req, 'query.token', '')
|
|
500
553
|
|
|
501
|
-
//
|
|
502
|
-
let user = await
|
|
554
|
+
//getAndVerifyBrowserTokenUser
|
|
555
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
|
|
503
556
|
|
|
504
557
|
//check
|
|
505
558
|
if (!iseobj(user)) {
|
|
@@ -530,8 +583,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
530
583
|
//token
|
|
531
584
|
let token = get(req, 'query.token', '')
|
|
532
585
|
|
|
533
|
-
//
|
|
534
|
-
let user = await
|
|
586
|
+
//getAndVerifyBrowserTokenUser
|
|
587
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getAPIsList')
|
|
535
588
|
|
|
536
589
|
//check
|
|
537
590
|
if (!iseobj(user)) {
|
|
@@ -566,8 +619,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
566
619
|
//token
|
|
567
620
|
let token = get(req, 'query.token', '')
|
|
568
621
|
|
|
569
|
-
//
|
|
570
|
-
let user = await
|
|
622
|
+
//getAndVerifyBrowserTokenUser
|
|
623
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'updateAPIs')
|
|
571
624
|
|
|
572
625
|
//check
|
|
573
626
|
if (!iseobj(user)) {
|
|
@@ -605,8 +658,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
605
658
|
//token
|
|
606
659
|
let token = get(req, 'query.token', '')
|
|
607
660
|
|
|
608
|
-
//
|
|
609
|
-
let user = await
|
|
661
|
+
//getAndVerifyAppTokenUser
|
|
662
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceApis')
|
|
610
663
|
|
|
611
664
|
//check
|
|
612
665
|
if (!iseobj(user)) {
|
|
@@ -689,7 +742,7 @@ export default WWebApi
|
|
|
689
742
|
<br class="clear">
|
|
690
743
|
|
|
691
744
|
<footer>
|
|
692
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
745
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 14:51:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
693
746
|
</footer>
|
|
694
747
|
|
|
695
748
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 14:51:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w-web-api",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.32",
|
|
4
4
|
"main": "dist/w-web-api.umd.js",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@mdi/js": "^7.2.96",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"w-data-collector": "^1.0.19",
|
|
12
12
|
"w-serv-hapi": "^1.0.11",
|
|
13
13
|
"w-serv-orm": "^1.0.7",
|
|
14
|
-
"w-ui-loginout": "^1.0.
|
|
14
|
+
"w-ui-loginout": "^1.0.6",
|
|
15
15
|
"wsemi": "^1.7.38"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
package/server/WWebApi.mjs
CHANGED
|
@@ -33,7 +33,8 @@ import ds from '../src/schema/index.mjs'
|
|
|
33
33
|
* @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
34
34
|
* @param {String} db 輸入資料庫名稱字串
|
|
35
35
|
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
36
|
-
* @param {Function}
|
|
36
|
+
* @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
37
|
+
* @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
37
38
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
38
39
|
* @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
|
|
39
40
|
* @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
|
|
@@ -46,10 +47,12 @@ import ds from '../src/schema/index.mjs'
|
|
|
46
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
|
|
|
@@ -225,8 +245,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
225
245
|
}
|
|
226
246
|
|
|
227
247
|
|
|
228
|
-
//
|
|
229
|
-
let
|
|
248
|
+
//getTokenUser
|
|
249
|
+
let getTokenUser = async (token) => {
|
|
230
250
|
|
|
231
251
|
//getUserByToken
|
|
232
252
|
let userSelf = getUserByToken(token)
|
|
@@ -241,8 +261,41 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
241
261
|
return Promise.reject(`can not find the user from token`)
|
|
242
262
|
}
|
|
243
263
|
|
|
244
|
-
|
|
245
|
-
|
|
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)
|
|
246
299
|
if (ispm(b)) {
|
|
247
300
|
b = await b
|
|
248
301
|
}
|
|
@@ -451,8 +504,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
451
504
|
//token
|
|
452
505
|
let token = get(req, 'query.token', '')
|
|
453
506
|
|
|
454
|
-
//
|
|
455
|
-
let user = await
|
|
507
|
+
//getAndVerifyBrowserTokenUser
|
|
508
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
|
|
456
509
|
|
|
457
510
|
//check
|
|
458
511
|
if (!iseobj(user)) {
|
|
@@ -483,8 +536,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
483
536
|
//token
|
|
484
537
|
let token = get(req, 'query.token', '')
|
|
485
538
|
|
|
486
|
-
//
|
|
487
|
-
let user = await
|
|
539
|
+
//getAndVerifyBrowserTokenUser
|
|
540
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'getAPIsList')
|
|
488
541
|
|
|
489
542
|
//check
|
|
490
543
|
if (!iseobj(user)) {
|
|
@@ -519,8 +572,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
519
572
|
//token
|
|
520
573
|
let token = get(req, 'query.token', '')
|
|
521
574
|
|
|
522
|
-
//
|
|
523
|
-
let user = await
|
|
575
|
+
//getAndVerifyBrowserTokenUser
|
|
576
|
+
let user = await getAndVerifyBrowserTokenUser(token, 'updateAPIs')
|
|
524
577
|
|
|
525
578
|
//check
|
|
526
579
|
if (!iseobj(user)) {
|
|
@@ -558,8 +611,8 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
558
611
|
//token
|
|
559
612
|
let token = get(req, 'query.token', '')
|
|
560
613
|
|
|
561
|
-
//
|
|
562
|
-
let user = await
|
|
614
|
+
//getAndVerifyAppTokenUser
|
|
615
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceApis')
|
|
563
616
|
|
|
564
617
|
//check
|
|
565
618
|
if (!iseobj(user)) {
|
package/srv.mjs
CHANGED
|
@@ -30,7 +30,7 @@ let opt = {
|
|
|
30
30
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
let getUserByToken = (token) => {
|
|
33
|
+
let getUserByToken = async (token) => {
|
|
34
34
|
// return {} //測試無法登入
|
|
35
35
|
if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
36
36
|
return {
|
|
@@ -53,14 +53,22 @@ let getUserByToken = (token) => {
|
|
|
53
53
|
return {}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
let
|
|
56
|
+
let verifyBrowserUser = (user, caller) => {
|
|
57
|
+
console.log('verifyBrowserUser/user', user)
|
|
57
58
|
// return false //測試無法登入
|
|
58
|
-
console.log('
|
|
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('於生產環境時得加入限制應用程式使用者身份機制')
|
|
59
67
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
//WWebApi
|
|
63
|
-
let instWWebApi = WWebApi(WOrm, url, db, getUserByToken,
|
|
71
|
+
let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
64
72
|
|
|
65
73
|
instWWebApi.on('error', (err) => {
|
|
66
74
|
console.log(err)
|
package/tableTags-web-api.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"apis":"
|
|
1
|
+
{"apis":"6FtLVT"}
|