@things-factory/auth-base 8.0.5 → 9.0.0-beta.12

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 (493) hide show
  1. package/config/config.development.js +45 -0
  2. package/config/config.production.js +45 -0
  3. package/dist-client/bootstrap.d.ts +1 -1
  4. package/dist-client/bootstrap.js +4 -4
  5. package/dist-client/bootstrap.js.map +1 -1
  6. package/dist-client/directive/privileged.d.ts +1 -1
  7. package/dist-client/directive/privileged.js +1 -1
  8. package/dist-client/directive/privileged.js.map +1 -1
  9. package/dist-client/index.d.ts +4 -3
  10. package/dist-client/index.js +4 -3
  11. package/dist-client/index.js.map +1 -1
  12. package/dist-client/profiled.js +1 -1
  13. package/dist-client/profiled.js.map +1 -1
  14. package/dist-client/reducers/auth.js +1 -1
  15. package/dist-client/reducers/auth.js.map +1 -1
  16. package/dist-client/tsconfig.tsbuildinfo +1 -1
  17. package/dist-client/verify-webauthn.d.ts +13 -0
  18. package/dist-client/verify-webauthn.js +72 -0
  19. package/dist-client/verify-webauthn.js.map +1 -0
  20. package/dist-server/constants/error-code.d.ts +2 -0
  21. package/dist-server/constants/error-code.js +3 -1
  22. package/dist-server/constants/error-code.js.map +1 -1
  23. package/dist-server/controllers/auth.d.ts +5 -5
  24. package/dist-server/controllers/auth.js +5 -5
  25. package/dist-server/controllers/auth.js.map +1 -1
  26. package/dist-server/controllers/change-pwd.js +21 -21
  27. package/dist-server/controllers/change-pwd.js.map +1 -1
  28. package/dist-server/controllers/checkin.js +4 -4
  29. package/dist-server/controllers/checkin.js.map +1 -1
  30. package/dist-server/controllers/delete-user.js +22 -21
  31. package/dist-server/controllers/delete-user.js.map +1 -1
  32. package/dist-server/controllers/invitation.d.ts +2 -1
  33. package/dist-server/controllers/invitation.js +46 -21
  34. package/dist-server/controllers/invitation.js.map +1 -1
  35. package/dist-server/controllers/profile.d.ts +9 -8
  36. package/dist-server/controllers/profile.js +26 -8
  37. package/dist-server/controllers/profile.js.map +1 -1
  38. package/dist-server/controllers/reset-password.js +24 -24
  39. package/dist-server/controllers/reset-password.js.map +1 -1
  40. package/dist-server/controllers/signin.d.ts +5 -2
  41. package/dist-server/controllers/signin.js +41 -25
  42. package/dist-server/controllers/signin.js.map +1 -1
  43. package/dist-server/controllers/signup.d.ts +1 -1
  44. package/dist-server/controllers/signup.js +26 -17
  45. package/dist-server/controllers/signup.js.map +1 -1
  46. package/dist-server/controllers/unlock-user.js +18 -17
  47. package/dist-server/controllers/unlock-user.js.map +1 -1
  48. package/dist-server/controllers/utils/password-rule.js +4 -4
  49. package/dist-server/controllers/utils/password-rule.js.map +1 -1
  50. package/dist-server/controllers/utils/save-invitation-token.d.ts +1 -1
  51. package/dist-server/controllers/utils/save-invitation-token.js +2 -2
  52. package/dist-server/controllers/utils/save-invitation-token.js.map +1 -1
  53. package/dist-server/controllers/utils/save-verification-token.d.ts +1 -1
  54. package/dist-server/controllers/utils/save-verification-token.js +3 -3
  55. package/dist-server/controllers/utils/save-verification-token.js.map +1 -1
  56. package/dist-server/controllers/verification.js +24 -23
  57. package/dist-server/controllers/verification.js.map +1 -1
  58. package/dist-server/errors/auth-error.js +1 -1
  59. package/dist-server/errors/auth-error.js.map +1 -1
  60. package/dist-server/errors/index.d.ts +2 -2
  61. package/dist-server/errors/index.js +2 -2
  62. package/dist-server/errors/index.js.map +1 -1
  63. package/dist-server/errors/user-domain-not-match-error.d.ts +1 -1
  64. package/dist-server/errors/user-domain-not-match-error.js +8 -8
  65. package/dist-server/errors/user-domain-not-match-error.js.map +1 -1
  66. package/dist-server/index.d.ts +16 -16
  67. package/dist-server/index.js +18 -18
  68. package/dist-server/index.js.map +1 -1
  69. package/dist-server/middlewares/authenticate-401-middleware.js +11 -11
  70. package/dist-server/middlewares/authenticate-401-middleware.js.map +1 -1
  71. package/dist-server/middlewares/domain-authenticate-middleware.d.ts +1 -1
  72. package/dist-server/middlewares/domain-authenticate-middleware.js +9 -9
  73. package/dist-server/middlewares/domain-authenticate-middleware.js.map +1 -1
  74. package/dist-server/middlewares/graphql-authenticate-middleware.js +4 -4
  75. package/dist-server/middlewares/graphql-authenticate-middleware.js.map +1 -1
  76. package/dist-server/middlewares/index.d.ts +5 -5
  77. package/dist-server/middlewares/index.js +18 -18
  78. package/dist-server/middlewares/index.js.map +1 -1
  79. package/dist-server/middlewares/jwt-authenticate-middleware.js +15 -15
  80. package/dist-server/middlewares/jwt-authenticate-middleware.js.map +1 -1
  81. package/dist-server/middlewares/signin-middleware.js +7 -6
  82. package/dist-server/middlewares/signin-middleware.js.map +1 -1
  83. package/dist-server/middlewares/verify-recaptcha-middleware.d.ts +3 -0
  84. package/dist-server/middlewares/verify-recaptcha-middleware.js +95 -0
  85. package/dist-server/middlewares/verify-recaptcha-middleware.js.map +1 -0
  86. package/dist-server/middlewares/webauthn-middleware.js +16 -13
  87. package/dist-server/middlewares/webauthn-middleware.js.map +1 -1
  88. package/dist-server/migrations/1548206416130-SeedUser.js +8 -7
  89. package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
  90. package/dist-server/migrations/1566805283882-SeedPrivilege.js +2 -2
  91. package/dist-server/migrations/1566805283882-SeedPrivilege.js.map +1 -1
  92. package/dist-server/migrations/index.js.map +1 -1
  93. package/dist-server/router/auth-checkin-router.js +18 -12
  94. package/dist-server/router/auth-checkin-router.js.map +1 -1
  95. package/dist-server/router/auth-private-process-router.js +26 -21
  96. package/dist-server/router/auth-private-process-router.js.map +1 -1
  97. package/dist-server/router/auth-public-process-router.js +42 -31
  98. package/dist-server/router/auth-public-process-router.js.map +1 -1
  99. package/dist-server/router/auth-signin-router.js +16 -16
  100. package/dist-server/router/auth-signin-router.js.map +1 -1
  101. package/dist-server/router/auth-signup-router.js +13 -9
  102. package/dist-server/router/auth-signup-router.js.map +1 -1
  103. package/dist-server/router/index.d.ts +9 -9
  104. package/dist-server/router/index.js +9 -9
  105. package/dist-server/router/index.js.map +1 -1
  106. package/dist-server/router/oauth2/index.d.ts +2 -2
  107. package/dist-server/router/oauth2/index.js +2 -2
  108. package/dist-server/router/oauth2/index.js.map +1 -1
  109. package/dist-server/router/oauth2/oauth2-authorize-router.js +6 -6
  110. package/dist-server/router/oauth2/oauth2-authorize-router.js.map +1 -1
  111. package/dist-server/router/oauth2/oauth2-router.d.ts +1 -1
  112. package/dist-server/router/oauth2/oauth2-router.js +21 -21
  113. package/dist-server/router/oauth2/oauth2-router.js.map +1 -1
  114. package/dist-server/router/oauth2/oauth2-server.js +21 -21
  115. package/dist-server/router/oauth2/oauth2-server.js.map +1 -1
  116. package/dist-server/router/site-root-router.js +4 -4
  117. package/dist-server/router/site-root-router.js.map +1 -1
  118. package/dist-server/router/webauthn-router.js +58 -8
  119. package/dist-server/router/webauthn-router.js.map +1 -1
  120. package/dist-server/routes.js +19 -19
  121. package/dist-server/routes.js.map +1 -1
  122. package/dist-server/service/app-binding/app-binding-mutation.js +4 -4
  123. package/dist-server/service/app-binding/app-binding-mutation.js.map +1 -1
  124. package/dist-server/service/app-binding/app-binding-query.d.ts +4 -4
  125. package/dist-server/service/app-binding/app-binding-query.js +22 -22
  126. package/dist-server/service/app-binding/app-binding-query.js.map +1 -1
  127. package/dist-server/service/app-binding/app-binding-types.d.ts +1 -1
  128. package/dist-server/service/app-binding/app-binding-types.js +2 -2
  129. package/dist-server/service/app-binding/app-binding-types.js.map +1 -1
  130. package/dist-server/service/app-binding/app-binding.d.ts +2 -2
  131. package/dist-server/service/app-binding/app-binding.js +4 -4
  132. package/dist-server/service/app-binding/app-binding.js.map +1 -1
  133. package/dist-server/service/app-binding/index.d.ts +2 -2
  134. package/dist-server/service/app-binding/index.js +3 -3
  135. package/dist-server/service/app-binding/index.js.map +1 -1
  136. package/dist-server/service/appliance/appliance-mutation.d.ts +2 -2
  137. package/dist-server/service/appliance/appliance-mutation.js +21 -21
  138. package/dist-server/service/appliance/appliance-mutation.js.map +1 -1
  139. package/dist-server/service/appliance/appliance-query.d.ts +3 -3
  140. package/dist-server/service/appliance/appliance-query.js +17 -17
  141. package/dist-server/service/appliance/appliance-query.js.map +1 -1
  142. package/dist-server/service/appliance/appliance-types.d.ts +1 -1
  143. package/dist-server/service/appliance/appliance-types.js +2 -2
  144. package/dist-server/service/appliance/appliance-types.js.map +1 -1
  145. package/dist-server/service/appliance/appliance.d.ts +1 -1
  146. package/dist-server/service/appliance/appliance.js +8 -8
  147. package/dist-server/service/appliance/appliance.js.map +1 -1
  148. package/dist-server/service/appliance/index.d.ts +3 -3
  149. package/dist-server/service/appliance/index.js +5 -5
  150. package/dist-server/service/appliance/index.js.map +1 -1
  151. package/dist-server/service/application/application-mutation.d.ts +8 -8
  152. package/dist-server/service/application/application-mutation.js +20 -20
  153. package/dist-server/service/application/application-mutation.js.map +1 -1
  154. package/dist-server/service/application/application-query.d.ts +2 -2
  155. package/dist-server/service/application/application-query.js +16 -16
  156. package/dist-server/service/application/application-query.js.map +1 -1
  157. package/dist-server/service/application/application-types.d.ts +1 -1
  158. package/dist-server/service/application/application-types.js +4 -4
  159. package/dist-server/service/application/application-types.js.map +1 -1
  160. package/dist-server/service/application/application.d.ts +1 -1
  161. package/dist-server/service/application/application.js +12 -12
  162. package/dist-server/service/application/application.js.map +1 -1
  163. package/dist-server/service/application/index.d.ts +3 -3
  164. package/dist-server/service/application/index.js +5 -5
  165. package/dist-server/service/application/index.js.map +1 -1
  166. package/dist-server/service/auth-provider/auth-provider-mutation.d.ts +2 -2
  167. package/dist-server/service/auth-provider/auth-provider-mutation.js +20 -20
  168. package/dist-server/service/auth-provider/auth-provider-mutation.js.map +1 -1
  169. package/dist-server/service/auth-provider/auth-provider-query.d.ts +3 -3
  170. package/dist-server/service/auth-provider/auth-provider-query.js +20 -20
  171. package/dist-server/service/auth-provider/auth-provider-query.js.map +1 -1
  172. package/dist-server/service/auth-provider/auth-provider-type.d.ts +1 -1
  173. package/dist-server/service/auth-provider/auth-provider-type.js +2 -2
  174. package/dist-server/service/auth-provider/auth-provider-type.js.map +1 -1
  175. package/dist-server/service/auth-provider/auth-provider.d.ts +3 -3
  176. package/dist-server/service/auth-provider/auth-provider.js +12 -12
  177. package/dist-server/service/auth-provider/auth-provider.js.map +1 -1
  178. package/dist-server/service/auth-provider/index.d.ts +3 -3
  179. package/dist-server/service/auth-provider/index.js +5 -5
  180. package/dist-server/service/auth-provider/index.js.map +1 -1
  181. package/dist-server/service/domain-generator/domain-generator-mutation.d.ts +1 -1
  182. package/dist-server/service/domain-generator/domain-generator-mutation.js +11 -11
  183. package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
  184. package/dist-server/service/domain-generator/domain-generator-types.d.ts +1 -1
  185. package/dist-server/service/domain-generator/domain-generator-types.js +3 -3
  186. package/dist-server/service/domain-generator/domain-generator-types.js.map +1 -1
  187. package/dist-server/service/domain-generator/index.d.ts +1 -1
  188. package/dist-server/service/domain-generator/index.js +2 -2
  189. package/dist-server/service/domain-generator/index.js.map +1 -1
  190. package/dist-server/service/granted-role/granted-role-mutation.d.ts +3 -3
  191. package/dist-server/service/granted-role/granted-role-mutation.js +17 -17
  192. package/dist-server/service/granted-role/granted-role-mutation.js.map +1 -1
  193. package/dist-server/service/granted-role/granted-role-query.d.ts +2 -2
  194. package/dist-server/service/granted-role/granted-role-query.js +13 -13
  195. package/dist-server/service/granted-role/granted-role-query.js.map +1 -1
  196. package/dist-server/service/granted-role/granted-role.d.ts +1 -1
  197. package/dist-server/service/granted-role/granted-role.js +3 -3
  198. package/dist-server/service/granted-role/granted-role.js.map +1 -1
  199. package/dist-server/service/granted-role/index.d.ts +3 -3
  200. package/dist-server/service/granted-role/index.js +5 -5
  201. package/dist-server/service/granted-role/index.js.map +1 -1
  202. package/dist-server/service/index.d.ts +25 -25
  203. package/dist-server/service/index.js +70 -70
  204. package/dist-server/service/index.js.map +1 -1
  205. package/dist-server/service/invitation/index.d.ts +3 -3
  206. package/dist-server/service/invitation/index.js +5 -5
  207. package/dist-server/service/invitation/index.js.map +1 -1
  208. package/dist-server/service/invitation/invitation-mutation.d.ts +4 -3
  209. package/dist-server/service/invitation/invitation-mutation.js +26 -14
  210. package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
  211. package/dist-server/service/invitation/invitation-query.d.ts +1 -1
  212. package/dist-server/service/invitation/invitation-query.js +7 -7
  213. package/dist-server/service/invitation/invitation-query.js.map +1 -1
  214. package/dist-server/service/invitation/invitation-types.d.ts +1 -1
  215. package/dist-server/service/invitation/invitation-types.js +2 -2
  216. package/dist-server/service/invitation/invitation-types.js.map +1 -1
  217. package/dist-server/service/invitation/invitation.d.ts +1 -1
  218. package/dist-server/service/invitation/invitation.js +5 -5
  219. package/dist-server/service/invitation/invitation.js.map +1 -1
  220. package/dist-server/service/login-history/index.d.ts +2 -2
  221. package/dist-server/service/login-history/index.js +4 -4
  222. package/dist-server/service/login-history/index.js.map +1 -1
  223. package/dist-server/service/login-history/login-history-query.d.ts +3 -3
  224. package/dist-server/service/login-history/login-history-query.js +11 -11
  225. package/dist-server/service/login-history/login-history-query.js.map +1 -1
  226. package/dist-server/service/login-history/login-history-type.d.ts +1 -1
  227. package/dist-server/service/login-history/login-history-type.js +2 -2
  228. package/dist-server/service/login-history/login-history-type.js.map +1 -1
  229. package/dist-server/service/login-history/login-history.d.ts +1 -1
  230. package/dist-server/service/login-history/login-history.js +4 -4
  231. package/dist-server/service/login-history/login-history.js.map +1 -1
  232. package/dist-server/service/partner/index.d.ts +3 -3
  233. package/dist-server/service/partner/index.js +5 -5
  234. package/dist-server/service/partner/index.js.map +1 -1
  235. package/dist-server/service/partner/partner-mutation.js +8 -8
  236. package/dist-server/service/partner/partner-mutation.js.map +1 -1
  237. package/dist-server/service/partner/partner-query.d.ts +3 -3
  238. package/dist-server/service/partner/partner-query.js +17 -17
  239. package/dist-server/service/partner/partner-query.js.map +1 -1
  240. package/dist-server/service/partner/partner-types.d.ts +1 -1
  241. package/dist-server/service/partner/partner-types.js +2 -2
  242. package/dist-server/service/partner/partner-types.js.map +1 -1
  243. package/dist-server/service/partner/partner.d.ts +1 -1
  244. package/dist-server/service/partner/partner.js +5 -5
  245. package/dist-server/service/partner/partner.js.map +1 -1
  246. package/dist-server/service/password-history/index.d.ts +1 -1
  247. package/dist-server/service/password-history/index.js +2 -2
  248. package/dist-server/service/password-history/index.js.map +1 -1
  249. package/dist-server/service/privilege/index.d.ts +3 -3
  250. package/dist-server/service/privilege/index.js +5 -5
  251. package/dist-server/service/privilege/index.js.map +1 -1
  252. package/dist-server/service/privilege/privilege-directive.js +2 -2
  253. package/dist-server/service/privilege/privilege-directive.js.map +1 -1
  254. package/dist-server/service/privilege/privilege-mutation.d.ts +2 -2
  255. package/dist-server/service/privilege/privilege-mutation.js +15 -15
  256. package/dist-server/service/privilege/privilege-mutation.js.map +1 -1
  257. package/dist-server/service/privilege/privilege-query.d.ts +4 -4
  258. package/dist-server/service/privilege/privilege-query.js +20 -20
  259. package/dist-server/service/privilege/privilege-query.js.map +1 -1
  260. package/dist-server/service/privilege/privilege-types.d.ts +1 -1
  261. package/dist-server/service/privilege/privilege-types.js +2 -2
  262. package/dist-server/service/privilege/privilege-types.js.map +1 -1
  263. package/dist-server/service/privilege/privilege.d.ts +2 -2
  264. package/dist-server/service/privilege/privilege.js +10 -10
  265. package/dist-server/service/privilege/privilege.js.map +1 -1
  266. package/dist-server/service/role/index.d.ts +3 -3
  267. package/dist-server/service/role/index.js +5 -5
  268. package/dist-server/service/role/index.js.map +1 -1
  269. package/dist-server/service/role/role-mutation.d.ts +2 -2
  270. package/dist-server/service/role/role-mutation.js +19 -19
  271. package/dist-server/service/role/role-mutation.js.map +1 -1
  272. package/dist-server/service/role/role-query.d.ts +4 -4
  273. package/dist-server/service/role/role-query.js +29 -29
  274. package/dist-server/service/role/role-query.js.map +1 -1
  275. package/dist-server/service/role/role-types.d.ts +1 -1
  276. package/dist-server/service/role/role-types.js +2 -2
  277. package/dist-server/service/role/role-types.js.map +1 -1
  278. package/dist-server/service/role/role.d.ts +2 -2
  279. package/dist-server/service/role/role.js +12 -12
  280. package/dist-server/service/role/role.js.map +1 -1
  281. package/dist-server/service/user/domain-query.d.ts +1 -1
  282. package/dist-server/service/user/domain-query.js +3 -3
  283. package/dist-server/service/user/domain-query.js.map +1 -1
  284. package/dist-server/service/user/index.d.ts +4 -4
  285. package/dist-server/service/user/index.js +6 -6
  286. package/dist-server/service/user/index.js.map +1 -1
  287. package/dist-server/service/user/user-mutation.d.ts +13 -12
  288. package/dist-server/service/user/user-mutation.js +141 -83
  289. package/dist-server/service/user/user-mutation.js.map +1 -1
  290. package/dist-server/service/user/user-query.d.ts +3 -3
  291. package/dist-server/service/user/user-query.js +21 -21
  292. package/dist-server/service/user/user-query.js.map +1 -1
  293. package/dist-server/service/user/user-types.d.ts +2 -1
  294. package/dist-server/service/user/user-types.js +6 -2
  295. package/dist-server/service/user/user-types.js.map +1 -1
  296. package/dist-server/service/user/user.d.ts +4 -3
  297. package/dist-server/service/user/user.js +80 -54
  298. package/dist-server/service/user/user.js.map +1 -1
  299. package/dist-server/service/users-auth-providers/index.d.ts +1 -1
  300. package/dist-server/service/users-auth-providers/index.js +2 -2
  301. package/dist-server/service/users-auth-providers/index.js.map +1 -1
  302. package/dist-server/service/users-auth-providers/users-auth-providers.d.ts +2 -2
  303. package/dist-server/service/users-auth-providers/users-auth-providers.js +8 -8
  304. package/dist-server/service/users-auth-providers/users-auth-providers.js.map +1 -1
  305. package/dist-server/service/verification-token/index.d.ts +1 -1
  306. package/dist-server/service/verification-token/index.js +2 -2
  307. package/dist-server/service/verification-token/index.js.map +1 -1
  308. package/dist-server/service/web-auth-credential/index.d.ts +1 -1
  309. package/dist-server/service/web-auth-credential/index.js +2 -2
  310. package/dist-server/service/web-auth-credential/index.js.map +1 -1
  311. package/dist-server/service/web-auth-credential/web-auth-credential.d.ts +1 -1
  312. package/dist-server/service/web-auth-credential/web-auth-credential.js +10 -10
  313. package/dist-server/service/web-auth-credential/web-auth-credential.js.map +1 -1
  314. package/dist-server/templates/account-unlock-email.d.ts +2 -1
  315. package/dist-server/templates/account-unlock-email.js +1 -1
  316. package/dist-server/templates/account-unlock-email.js.map +1 -1
  317. package/dist-server/templates/invitation-email.d.ts +2 -1
  318. package/dist-server/templates/invitation-email.js +1 -1
  319. package/dist-server/templates/invitation-email.js.map +1 -1
  320. package/dist-server/templates/verification-email.d.ts +2 -1
  321. package/dist-server/templates/verification-email.js +1 -1
  322. package/dist-server/templates/verification-email.js.map +1 -1
  323. package/dist-server/tsconfig.tsbuildinfo +1 -1
  324. package/dist-server/types.d.ts +1 -1
  325. package/dist-server/types.js.map +1 -1
  326. package/dist-server/utils/access-token-cookie.js +2 -2
  327. package/dist-server/utils/access-token-cookie.js.map +1 -1
  328. package/dist-server/utils/check-permission.d.ts +2 -2
  329. package/dist-server/utils/check-permission.js +3 -3
  330. package/dist-server/utils/check-permission.js.map +1 -1
  331. package/dist-server/utils/check-user-belongs-domain.d.ts +1 -1
  332. package/dist-server/utils/check-user-belongs-domain.js +2 -2
  333. package/dist-server/utils/check-user-belongs-domain.js.map +1 -1
  334. package/dist-server/utils/check-user-has-role.d.ts +1 -1
  335. package/dist-server/utils/check-user-has-role.js +2 -2
  336. package/dist-server/utils/check-user-has-role.js.map +1 -1
  337. package/dist-server/utils/get-domain-users.d.ts +1 -1
  338. package/dist-server/utils/get-domain-users.js +2 -2
  339. package/dist-server/utils/get-domain-users.js.map +1 -1
  340. package/dist-server/utils/get-user-domains.d.ts +1 -1
  341. package/dist-server/utils/get-user-domains.js +4 -4
  342. package/dist-server/utils/get-user-domains.js.map +1 -1
  343. package/helps/config/recaptcha.ja.md +49 -0
  344. package/helps/config/recaptcha.ko.md +49 -0
  345. package/helps/config/recaptcha.md +49 -0
  346. package/helps/config/recaptcha.ms.md +49 -0
  347. package/helps/config/recaptcha.zh.md +49 -0
  348. package/package.json +10 -9
  349. package/translations/en.json +5 -1
  350. package/translations/ja.json +5 -1
  351. package/translations/ko.json +6 -3
  352. package/translations/ms.json +5 -1
  353. package/translations/zh.json +5 -1
  354. package/client/actions/auth.ts +0 -24
  355. package/client/auth.ts +0 -272
  356. package/client/bootstrap.ts +0 -47
  357. package/client/directive/privileged.ts +0 -28
  358. package/client/index.ts +0 -3
  359. package/client/profiled.ts +0 -83
  360. package/client/reducers/auth.ts +0 -31
  361. package/server/constants/error-code.ts +0 -20
  362. package/server/constants/error-message.ts +0 -0
  363. package/server/constants/max-age.ts +0 -1
  364. package/server/controllers/auth.ts +0 -5
  365. package/server/controllers/change-pwd.ts +0 -99
  366. package/server/controllers/checkin.ts +0 -21
  367. package/server/controllers/delete-user.ts +0 -68
  368. package/server/controllers/invitation.ts +0 -132
  369. package/server/controllers/profile.ts +0 -28
  370. package/server/controllers/reset-password.ts +0 -126
  371. package/server/controllers/signin.ts +0 -79
  372. package/server/controllers/signup.ts +0 -60
  373. package/server/controllers/unlock-user.ts +0 -61
  374. package/server/controllers/utils/make-invitation-token.ts +0 -5
  375. package/server/controllers/utils/make-verification-token.ts +0 -4
  376. package/server/controllers/utils/password-rule.ts +0 -120
  377. package/server/controllers/utils/save-invitation-token.ts +0 -10
  378. package/server/controllers/utils/save-verification-token.ts +0 -12
  379. package/server/controllers/verification.ts +0 -83
  380. package/server/errors/auth-error.ts +0 -24
  381. package/server/errors/index.ts +0 -2
  382. package/server/errors/user-domain-not-match-error.ts +0 -29
  383. package/server/index.ts +0 -37
  384. package/server/middlewares/authenticate-401-middleware.ts +0 -114
  385. package/server/middlewares/domain-authenticate-middleware.ts +0 -78
  386. package/server/middlewares/graphql-authenticate-middleware.ts +0 -13
  387. package/server/middlewares/index.ts +0 -67
  388. package/server/middlewares/jwt-authenticate-middleware.ts +0 -84
  389. package/server/middlewares/signin-middleware.ts +0 -55
  390. package/server/middlewares/webauthn-middleware.ts +0 -127
  391. package/server/migrations/1548206416130-SeedUser.ts +0 -59
  392. package/server/migrations/1566805283882-SeedPrivilege.ts +0 -28
  393. package/server/migrations/index.ts +0 -9
  394. package/server/router/auth-checkin-router.ts +0 -107
  395. package/server/router/auth-private-process-router.ts +0 -107
  396. package/server/router/auth-public-process-router.ts +0 -302
  397. package/server/router/auth-signin-router.ts +0 -65
  398. package/server/router/auth-signup-router.ts +0 -95
  399. package/server/router/index.ts +0 -9
  400. package/server/router/oauth2/index.ts +0 -2
  401. package/server/router/oauth2/oauth2-authorize-router.ts +0 -81
  402. package/server/router/oauth2/oauth2-router.ts +0 -165
  403. package/server/router/oauth2/oauth2-server.ts +0 -262
  404. package/server/router/oauth2/passport-oauth2-client-password.ts +0 -87
  405. package/server/router/oauth2/passport-refresh-token.ts +0 -87
  406. package/server/router/path-base-domain-router.ts +0 -8
  407. package/server/router/site-root-router.ts +0 -48
  408. package/server/router/webauthn-router.ts +0 -87
  409. package/server/routes.ts +0 -80
  410. package/server/service/app-binding/app-binding-mutation.ts +0 -22
  411. package/server/service/app-binding/app-binding-query.ts +0 -92
  412. package/server/service/app-binding/app-binding-types.ts +0 -11
  413. package/server/service/app-binding/app-binding.ts +0 -17
  414. package/server/service/app-binding/index.ts +0 -4
  415. package/server/service/appliance/appliance-mutation.ts +0 -113
  416. package/server/service/appliance/appliance-query.ts +0 -76
  417. package/server/service/appliance/appliance-types.ts +0 -56
  418. package/server/service/appliance/appliance.ts +0 -133
  419. package/server/service/appliance/index.ts +0 -6
  420. package/server/service/application/application-mutation.ts +0 -104
  421. package/server/service/application/application-query.ts +0 -98
  422. package/server/service/application/application-types.ts +0 -76
  423. package/server/service/application/application.ts +0 -216
  424. package/server/service/application/index.ts +0 -6
  425. package/server/service/auth-provider/auth-provider-mutation.ts +0 -159
  426. package/server/service/auth-provider/auth-provider-parameter-spec.ts +0 -24
  427. package/server/service/auth-provider/auth-provider-query.ts +0 -88
  428. package/server/service/auth-provider/auth-provider-type.ts +0 -67
  429. package/server/service/auth-provider/auth-provider.ts +0 -155
  430. package/server/service/auth-provider/index.ts +0 -7
  431. package/server/service/domain-generator/domain-generator-mutation.ts +0 -117
  432. package/server/service/domain-generator/domain-generator-types.ts +0 -46
  433. package/server/service/domain-generator/index.ts +0 -3
  434. package/server/service/granted-role/granted-role-mutation.ts +0 -156
  435. package/server/service/granted-role/granted-role-query.ts +0 -60
  436. package/server/service/granted-role/granted-role.ts +0 -27
  437. package/server/service/granted-role/index.ts +0 -6
  438. package/server/service/index.ts +0 -90
  439. package/server/service/invitation/index.ts +0 -6
  440. package/server/service/invitation/invitation-mutation.ts +0 -63
  441. package/server/service/invitation/invitation-query.ts +0 -33
  442. package/server/service/invitation/invitation-types.ts +0 -11
  443. package/server/service/invitation/invitation.ts +0 -63
  444. package/server/service/login-history/index.ts +0 -5
  445. package/server/service/login-history/login-history-query.ts +0 -51
  446. package/server/service/login-history/login-history-type.ts +0 -12
  447. package/server/service/login-history/login-history.ts +0 -45
  448. package/server/service/partner/index.ts +0 -6
  449. package/server/service/partner/partner-mutation.ts +0 -61
  450. package/server/service/partner/partner-query.ts +0 -102
  451. package/server/service/partner/partner-types.ts +0 -11
  452. package/server/service/partner/partner.ts +0 -57
  453. package/server/service/password-history/index.ts +0 -3
  454. package/server/service/password-history/password-history.ts +0 -16
  455. package/server/service/privilege/index.ts +0 -6
  456. package/server/service/privilege/privilege-directive.ts +0 -77
  457. package/server/service/privilege/privilege-mutation.ts +0 -92
  458. package/server/service/privilege/privilege-query.ts +0 -94
  459. package/server/service/privilege/privilege-types.ts +0 -60
  460. package/server/service/privilege/privilege.ts +0 -102
  461. package/server/service/role/index.ts +0 -6
  462. package/server/service/role/role-mutation.ts +0 -109
  463. package/server/service/role/role-query.ts +0 -155
  464. package/server/service/role/role-types.ts +0 -81
  465. package/server/service/role/role.ts +0 -72
  466. package/server/service/user/domain-query.ts +0 -24
  467. package/server/service/user/index.ts +0 -7
  468. package/server/service/user/user-mutation.ts +0 -413
  469. package/server/service/user/user-query.ts +0 -145
  470. package/server/service/user/user-types.ts +0 -97
  471. package/server/service/user/user.ts +0 -354
  472. package/server/service/users-auth-providers/index.ts +0 -5
  473. package/server/service/users-auth-providers/users-auth-providers.ts +0 -71
  474. package/server/service/verification-token/index.ts +0 -3
  475. package/server/service/verification-token/verification-token.ts +0 -60
  476. package/server/service/web-auth-credential/index.ts +0 -3
  477. package/server/service/web-auth-credential/web-auth-credential.ts +0 -67
  478. package/server/templates/account-unlock-email.ts +0 -65
  479. package/server/templates/invitation-email.ts +0 -66
  480. package/server/templates/reset-password-email.ts +0 -65
  481. package/server/templates/verification-email.ts +0 -66
  482. package/server/types.ts +0 -21
  483. package/server/utils/accepts.ts +0 -11
  484. package/server/utils/access-token-cookie.ts +0 -61
  485. package/server/utils/check-permission.ts +0 -52
  486. package/server/utils/check-user-belongs-domain.ts +0 -19
  487. package/server/utils/check-user-has-role.ts +0 -29
  488. package/server/utils/encrypt-state.ts +0 -22
  489. package/server/utils/get-aes-256-key.ts +0 -13
  490. package/server/utils/get-domain-from-hostname.ts +0 -7
  491. package/server/utils/get-domain-users.ts +0 -38
  492. package/server/utils/get-secret.ts +0 -13
  493. package/server/utils/get-user-domains.ts +0 -112
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/router/index.ts"],"names":[],"mappings":";;;AAAA,wEAA6C;AAC7C,uEAA4C;AAC5C,oEAAyC;AACzC,6DAAkC;AAClC,mDAAwB;AACxB,gEAAqC;AACrC,+DAAoC;AACpC,+DAAoC;AACpC,4DAAiC","sourcesContent":["export * from './auth-private-process-router'\nexport * from './auth-public-process-router'\nexport * from './path-base-domain-router'\nexport * from './site-root-router'\nexport * from './oauth2'\nexport * from './auth-checkin-router'\nexport * from './auth-signin-router'\nexport * from './auth-signup-router'\nexport * from './webauthn-router'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/router/index.ts"],"names":[],"mappings":";;;AAAA,2EAAgD;AAChD,0EAA+C;AAC/C,uEAA4C;AAC5C,gEAAqC;AACrC,4DAAiC;AACjC,mEAAwC;AACxC,kEAAuC;AACvC,kEAAuC;AACvC,+DAAoC","sourcesContent":["export * from './auth-private-process-router.js'\nexport * from './auth-public-process-router.js'\nexport * from './path-base-domain-router.js'\nexport * from './site-root-router.js'\nexport * from './oauth2/index.js'\nexport * from './auth-checkin-router.js'\nexport * from './auth-signin-router.js'\nexport * from './auth-signup-router.js'\nexport * from './webauthn-router.js'\n"]}
@@ -1,2 +1,2 @@
1
- export * from './oauth2-authorize-router';
2
- export * from './oauth2-router';
1
+ export * from './oauth2-authorize-router.js';
2
+ export * from './oauth2-router.js';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./oauth2-authorize-router"), exports);
5
- tslib_1.__exportStar(require("./oauth2-router"), exports);
4
+ tslib_1.__exportStar(require("./oauth2-authorize-router.js"), exports);
5
+ tslib_1.__exportStar(require("./oauth2-router.js"), exports);
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/router/oauth2/index.ts"],"names":[],"mappings":";;;AAAA,oEAAyC;AACzC,0DAA+B","sourcesContent":["export * from './oauth2-authorize-router'\nexport * from './oauth2-router'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/router/oauth2/index.ts"],"names":[],"mappings":";;;AAAA,uEAA4C;AAC5C,6DAAkC","sourcesContent":["export * from './oauth2-authorize-router.js'\nexport * from './oauth2-router.js'\n"]}
@@ -5,8 +5,8 @@ const tslib_1 = require("tslib");
5
5
  const koa_router_1 = tslib_1.__importDefault(require("koa-router"));
6
6
  const shell_1 = require("@things-factory/shell");
7
7
  const env_1 = require("@things-factory/env");
8
- const application_1 = require("../../service/application/application");
9
- const oauth2_server_1 = require("./oauth2-server");
8
+ const application_js_1 = require("../../service/application/application.js");
9
+ const oauth2_server_js_1 = require("./oauth2-server.js");
10
10
  exports.oauth2AuthorizeRouter = new koa_router_1.default();
11
11
  const disableUserFavoredLanguage = env_1.config.get('i18n/disableUserFavoredLanguage', false);
12
12
  const languages = env_1.config.get('i18n/languages', false);
@@ -25,20 +25,20 @@ const languages = env_1.config.get('i18n/languages', false);
25
25
  // to obtain their approval (displaying details about the client requesting
26
26
  // authorization). We accomplish that here by routing through `ensureLoggedIn()`
27
27
  // first, and rendering the `dialog` view.
28
- exports.oauth2AuthorizeRouter.get('/authorize', oauth2_server_1.server.authorize(async function (clientID, redirectURI) {
29
- const client = await (0, shell_1.getRepository)(application_1.Application).findOneBy({
28
+ exports.oauth2AuthorizeRouter.get('/authorize', oauth2_server_js_1.server.authorize(async function (clientID, redirectURI) {
29
+ const client = await (0, shell_1.getRepository)(application_js_1.Application).findOneBy({
30
30
  appKey: clientID
31
31
  });
32
32
  // CONFIRM-ME redirectUrl 의 허용 범위는 ?
33
33
  // if (!client.redirectUrl != redirectURI) {
34
34
  // return false
35
35
  // }
36
- return [client || oauth2_server_1.NonClient, redirectURI];
36
+ return [client || oauth2_server_js_1.NonClient, redirectURI];
37
37
  }), async function (context, next) {
38
38
  const { oauth2, user, domain } = context.state;
39
39
  let pageElement = 'oauth2-decision';
40
40
  let elementScript = '/oauth2/oauth2-decision-page.js';
41
- if (oauth2.client.id === oauth2_server_1.NonClient.id) {
41
+ if (oauth2.client.id === oauth2_server_js_1.NonClient.id) {
42
42
  pageElement = 'oauth2-decision-error';
43
43
  elementScript = '/oauth2/oauth2-decision-error-page.js';
44
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2-authorize-router.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-authorize-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAE/B,iDAAqD;AACrD,6CAA4C;AAE5C,uEAAmE;AACnE,mDAAwE;AAE3D,QAAA,qBAAqB,GAAG,IAAI,oBAAM,EAAE,CAAA;AAEjD,MAAM,0BAA0B,GAAG,YAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;AACvF,MAAM,SAAS,GAAG,YAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAErD,8BAA8B;AAC9B,EAAE;AACF,oEAAoE;AACpE,8EAA8E;AAC9E,uEAAuE;AACvE,oEAAoE;AACpE,6EAA6E;AAC7E,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,2EAA2E;AAC3E,iFAAiF;AACjF,0CAA0C;AAE1C,6BAAqB,CAAC,GAAG,CACvB,YAAY,EACZ,sBAAiB,CAAC,SAAS,CAAC,KAAK,WAAW,QAAQ,EAAE,WAAW;IAC/D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,yBAAW,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAA;IACF,oCAAoC;IACpC,4CAA4C;IAC5C,iBAAiB;IACjB,IAAI;IAEJ,OAAO,CAAC,MAAM,IAAI,yBAAS,EAAE,WAAW,CAAC,CAAA;AAC3C,CAAC,CAAC,EACF,KAAK,WAAW,OAAO,EAAE,IAAI;IAC3B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9C,IAAI,WAAW,GAAW,iBAAiB,CAAA;IAC3C,IAAI,aAAa,GAAW,iCAAiC,CAAA;IAE7D,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,yBAAS,CAAC,EAAE,EAAE,CAAC;QACtC,WAAW,GAAG,uBAAuB,CAAA;QACrC,aAAa,GAAG,uCAAuC,CAAA;IACzD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE;YAClC,WAAW;YACX,aAAa;YACb,IAAI,EAAE;gBACJ,MAAM;gBACN,MAAM,kCACD,MAAM,KACT,IAAI,EAAE;wBACJ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;wBAClB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;wBACtB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;qBACzB,GACF;gBACD,0BAA0B;gBAC1B,SAAS;aACV;SACF,CAAC,CAAA;QACF,uCAAuC;QACvC,oBAAoB;QACpB,2HAA2H;QAC3H,oBAAoB;QACpB,KAAK;IACP,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC,CACF,CAAA","sourcesContent":["import Router from 'koa-router'\n\nimport { getRepository } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { Application } from '../../service/application/application'\nimport { NonClient, server as oauth2orizeServer } from './oauth2-server'\n\nexport const oauth2AuthorizeRouter = new Router()\n\nconst disableUserFavoredLanguage = config.get('i18n/disableUserFavoredLanguage', false)\nconst languages = config.get('i18n/languages', false)\n\n// user authorization endpoint\n//\n// `authorization` middleware accepts a `validate` callback which is\n// responsible for validating the client making the authorization request. In\n// doing so, is recommended that the `redirectURI` be checked against a\n// registered value, although security requirements may vary accross\n// implementations. Once validated, the `done` callback must be invoked with\n// a `client` instance, as well as the `redirectURI` to which the user will be\n// redirected after an authorization decision is obtained.\n//\n// This middleware simply initializes a new authorization transaction. It is\n// the application's responsibility to authenticate the user and render a dialog\n// to obtain their approval (displaying details about the client requesting\n// authorization). We accomplish that here by routing through `ensureLoggedIn()`\n// first, and rendering the `dialog` view.\n\noauth2AuthorizeRouter.get(\n '/authorize',\n oauth2orizeServer.authorize(async function (clientID, redirectURI) {\n const client = await getRepository(Application).findOneBy({\n appKey: clientID\n })\n // CONFIRM-ME redirectUrl 의 허용 범위는 ?\n // if (!client.redirectUrl != redirectURI) {\n // return false\n // }\n\n return [client || NonClient, redirectURI]\n }),\n async function (context, next) {\n const { oauth2, user, domain } = context.state\n\n let pageElement: string = 'oauth2-decision'\n let elementScript: string = '/oauth2/oauth2-decision-page.js'\n\n if (oauth2.client.id === NonClient.id) {\n pageElement = 'oauth2-decision-error'\n elementScript = '/oauth2/oauth2-decision-error-page.js'\n }\n\n try {\n await context.render('oauth2-page', {\n pageElement,\n elementScript,\n data: {\n domain,\n oauth2: {\n ...oauth2,\n user: {\n id: oauth2.user.id,\n name: oauth2.user.name,\n email: oauth2.user.email\n }\n },\n disableUserFavoredLanguage,\n languages\n }\n })\n // await context.render(decisionPage, {\n // domain: domain,\n // ...oauth2, // client, redirectURI, req { type, clientID, redirectURI, scope, state}, user, transactionID, info, locals\n // availableScopes\n // })\n } catch (e) {\n throw e\n }\n }\n)\n"]}
1
+ {"version":3,"file":"oauth2-authorize-router.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-authorize-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAE/B,iDAAqD;AACrD,6CAA4C;AAE5C,6EAAsE;AACtE,yDAA2E;AAE9D,QAAA,qBAAqB,GAAG,IAAI,oBAAM,EAAE,CAAA;AAEjD,MAAM,0BAA0B,GAAG,YAAM,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;AACvF,MAAM,SAAS,GAAG,YAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAA;AAErD,8BAA8B;AAC9B,EAAE;AACF,oEAAoE;AACpE,8EAA8E;AAC9E,uEAAuE;AACvE,oEAAoE;AACpE,6EAA6E;AAC7E,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,2EAA2E;AAC3E,iFAAiF;AACjF,0CAA0C;AAE1C,6BAAqB,CAAC,GAAG,CACvB,YAAY,EACZ,yBAAiB,CAAC,SAAS,CAAC,KAAK,WAAW,QAAQ,EAAE,WAAW;IAC/D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,4BAAW,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAA;IACF,oCAAoC;IACpC,4CAA4C;IAC5C,iBAAiB;IACjB,IAAI;IAEJ,OAAO,CAAC,MAAM,IAAI,4BAAS,EAAE,WAAW,CAAC,CAAA;AAC3C,CAAC,CAAC,EACF,KAAK,WAAW,OAAO,EAAE,IAAI;IAC3B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9C,IAAI,WAAW,GAAW,iBAAiB,CAAA;IAC3C,IAAI,aAAa,GAAW,iCAAiC,CAAA;IAE7D,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,4BAAS,CAAC,EAAE,EAAE,CAAC;QACtC,WAAW,GAAG,uBAAuB,CAAA;QACrC,aAAa,GAAG,uCAAuC,CAAA;IACzD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE;YAClC,WAAW;YACX,aAAa;YACb,IAAI,EAAE;gBACJ,MAAM;gBACN,MAAM,kCACD,MAAM,KACT,IAAI,EAAE;wBACJ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;wBAClB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;wBACtB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;qBACzB,GACF;gBACD,0BAA0B;gBAC1B,SAAS;aACV;SACF,CAAC,CAAA;QACF,uCAAuC;QACvC,oBAAoB;QACpB,2HAA2H;QAC3H,oBAAoB;QACpB,KAAK;IACP,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC,CACF,CAAA","sourcesContent":["import Router from 'koa-router'\n\nimport { getRepository } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { Application } from '../../service/application/application.js'\nimport { NonClient, server as oauth2orizeServer } from './oauth2-server.js'\n\nexport const oauth2AuthorizeRouter = new Router()\n\nconst disableUserFavoredLanguage = config.get('i18n/disableUserFavoredLanguage', false)\nconst languages = config.get('i18n/languages', false)\n\n// user authorization endpoint\n//\n// `authorization` middleware accepts a `validate` callback which is\n// responsible for validating the client making the authorization request. In\n// doing so, is recommended that the `redirectURI` be checked against a\n// registered value, although security requirements may vary accross\n// implementations. Once validated, the `done` callback must be invoked with\n// a `client` instance, as well as the `redirectURI` to which the user will be\n// redirected after an authorization decision is obtained.\n//\n// This middleware simply initializes a new authorization transaction. It is\n// the application's responsibility to authenticate the user and render a dialog\n// to obtain their approval (displaying details about the client requesting\n// authorization). We accomplish that here by routing through `ensureLoggedIn()`\n// first, and rendering the `dialog` view.\n\noauth2AuthorizeRouter.get(\n '/authorize',\n oauth2orizeServer.authorize(async function (clientID, redirectURI) {\n const client = await getRepository(Application).findOneBy({\n appKey: clientID\n })\n // CONFIRM-ME redirectUrl 의 허용 범위는 ?\n // if (!client.redirectUrl != redirectURI) {\n // return false\n // }\n\n return [client || NonClient, redirectURI]\n }),\n async function (context, next) {\n const { oauth2, user, domain } = context.state\n\n let pageElement: string = 'oauth2-decision'\n let elementScript: string = '/oauth2/oauth2-decision-page.js'\n\n if (oauth2.client.id === NonClient.id) {\n pageElement = 'oauth2-decision-error'\n elementScript = '/oauth2/oauth2-decision-error-page.js'\n }\n\n try {\n await context.render('oauth2-page', {\n pageElement,\n elementScript,\n data: {\n domain,\n oauth2: {\n ...oauth2,\n user: {\n id: oauth2.user.id,\n name: oauth2.user.name,\n email: oauth2.user.email\n }\n },\n disableUserFavoredLanguage,\n languages\n }\n })\n // await context.render(decisionPage, {\n // domain: domain,\n // ...oauth2, // client, redirectURI, req { type, clientID, redirectURI, scope, state}, user, transactionID, info, locals\n // availableScopes\n // })\n } catch (e) {\n throw e\n }\n }\n)\n"]}
@@ -1,4 +1,4 @@
1
- import { User } from '../../service/user/user';
1
+ import { User } from '../../service/user/user.js';
2
2
  declare global {
3
3
  namespace NodeJS {
4
4
  interface Process {
@@ -7,16 +7,16 @@ const koa_compose_1 = tslib_1.__importDefault(require("koa-compose"));
7
7
  const koa_passport_1 = tslib_1.__importDefault(require("koa-passport"));
8
8
  const koa_router_1 = tslib_1.__importDefault(require("koa-router"));
9
9
  const shell_1 = require("@things-factory/shell");
10
- const middlewares_1 = require("../../middlewares");
11
- const application_1 = require("../../service/application/application");
12
- const user_1 = require("../../service/user/user");
13
- const access_token_cookie_1 = require("../../utils/access-token-cookie");
14
- const get_secret_1 = require("../../utils/get-secret");
15
- const oauth2_server_1 = require("./oauth2-server");
16
- const passport_oauth2_client_password_1 = require("./passport-oauth2-client-password");
10
+ const index_js_1 = require("../../middlewares/index.js");
11
+ const application_js_1 = require("../../service/application/application.js");
12
+ const user_js_1 = require("../../service/user/user.js");
13
+ const access_token_cookie_js_1 = require("../../utils/access-token-cookie.js");
14
+ const get_secret_js_1 = require("../../utils/get-secret.js");
15
+ const oauth2_server_js_1 = require("./oauth2-server.js");
16
+ const passport_oauth2_client_password_js_1 = require("./passport-oauth2-client-password.js");
17
17
  exports.oauth2Router = new koa_router_1.default();
18
- koa_passport_1.default.use('oauth2-client-password', new passport_oauth2_client_password_1.Strategy({}, (clientId, clientSecret, done) => {
19
- (0, shell_1.getRepository)(application_1.Application)
18
+ koa_passport_1.default.use('oauth2-client-password', new passport_oauth2_client_password_js_1.Strategy({}, (clientId, clientSecret, done) => {
19
+ (0, shell_1.getRepository)(application_js_1.Application)
20
20
  .findOneBy({
21
21
  appKey: clientId
22
22
  })
@@ -35,7 +35,7 @@ koa_passport_1.default.use('oauth2-client-password', new passport_oauth2_client_
35
35
  // requested by a client application. Based on the grant type requested by the
36
36
  // client, the above grant middleware configured above will be invoked to send
37
37
  // a response.
38
- exports.oauth2Router.post('/decision', middlewares_1.jwtAuthenticateMiddleware, (0, koa_compose_1.default)(oauth2_server_1.server.decision(async function (context) {
38
+ exports.oauth2Router.post('/decision', index_js_1.jwtAuthenticateMiddleware, (0, koa_compose_1.default)(oauth2_server_js_1.server.decision(async function (context) {
39
39
  const { request } = context;
40
40
  return request.body;
41
41
  })));
@@ -45,19 +45,19 @@ exports.oauth2Router.post('/decision', middlewares_1.jwtAuthenticateMiddleware,
45
45
  // for access tokens. Based on the grant type being exchanged, the above
46
46
  // exchange middleware will be invoked to handle the request. Clients must
47
47
  // authenticate when making requests to this endpoint.
48
- exports.oauth2Router.post('/access-token', koa_passport_1.default.authenticate('oauth2-client-password', { session: false }), oauth2_server_1.server.token(), oauth2_server_1.server.errorHandler());
48
+ exports.oauth2Router.post('/access-token', koa_passport_1.default.authenticate('oauth2-client-password', { session: false }), oauth2_server_js_1.server.token(), oauth2_server_js_1.server.errorHandler());
49
49
  exports.oauth2Router.post('/refresh-token', async (context, next) => {
50
50
  var _a, _b;
51
51
  const refreshToken = (_b = (_a = context.request) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.refreshToken;
52
52
  if (!refreshToken)
53
53
  throw new Error('Missing refresh token');
54
- const appUser = await (0, shell_1.getRepository)(user_1.User).findOneBy({
54
+ const appUser = await (0, shell_1.getRepository)(user_js_1.User).findOneBy({
55
55
  password: refreshToken
56
56
  });
57
57
  if (!appUser)
58
58
  throw new Error('App user is not found');
59
59
  try {
60
- jsonwebtoken_1.default.verify(refreshToken, get_secret_1.SECRET);
60
+ jsonwebtoken_1.default.verify(refreshToken, get_secret_js_1.SECRET);
61
61
  const decoded = jsonwebtoken_1.default.decode(refreshToken);
62
62
  const subdomain = decoded.domain.subdomain;
63
63
  const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOne({
@@ -67,11 +67,11 @@ exports.oauth2Router.post('/refresh-token', async (context, next) => {
67
67
  throw new Error('Domain is not found');
68
68
  const appKey = decoded.application.appKey;
69
69
  const scopes = decoded.scope;
70
- const newAccessToken = application_1.Application.generateAccessToken(domain, appUser, appKey, scopes);
71
- const newRefreshToken = application_1.Application.generateRefreshToken(domain, appUser, appKey, scopes);
70
+ const newAccessToken = application_js_1.Application.generateAccessToken(domain, appUser, appKey, scopes);
71
+ const newRefreshToken = application_js_1.Application.generateRefreshToken(domain, appUser, appKey, scopes);
72
72
  appUser.password = newRefreshToken;
73
- await (0, shell_1.getRepository)(user_1.User).save(appUser);
74
- (0, access_token_cookie_1.setAccessTokenCookie)(context, newAccessToken);
73
+ await (0, shell_1.getRepository)(user_js_1.User).save(appUser);
74
+ (0, access_token_cookie_js_1.setAccessTokenCookie)(context, newAccessToken);
75
75
  context.body = {
76
76
  accessToken: newAccessToken,
77
77
  refreshToken: newRefreshToken
@@ -82,7 +82,7 @@ exports.oauth2Router.post('/refresh-token', async (context, next) => {
82
82
  context.body = e.message;
83
83
  }
84
84
  });
85
- exports.oauth2Router.get('/profile', middlewares_1.jwtAuthenticateMiddleware, async (context, next) => {
85
+ exports.oauth2Router.get('/profile', index_js_1.jwtAuthenticateMiddleware, async (context, next) => {
86
86
  const { user, domain } = context.state;
87
87
  const { name, description, email, userType: type, locale } = user;
88
88
  const { name: domainName, subdomain, brandName, brandImage, contentImage, timezone } = domain || {};
@@ -109,7 +109,7 @@ exports.oauth2Router.get('/profile', middlewares_1.jwtAuthenticateMiddleware, as
109
109
  }
110
110
  };
111
111
  });
112
- exports.oauth2Router.post('/disconnect', middlewares_1.jwtAuthenticateMiddleware, async (context, next) => {
112
+ exports.oauth2Router.post('/disconnect', index_js_1.jwtAuthenticateMiddleware, async (context, next) => {
113
113
  try {
114
114
  let { user } = context.state;
115
115
  if (typeof process.oauthDisconnect === 'function') {
@@ -118,8 +118,8 @@ exports.oauth2Router.post('/disconnect', middlewares_1.jwtAuthenticateMiddleware
118
118
  else {
119
119
  user.domains = [];
120
120
  user.roles = [];
121
- user.status = user_1.UserStatus.DELETED;
122
- await (0, shell_1.getRepository)(user_1.User).save(user);
121
+ user.status = user_js_1.UserStatus.DELETED;
122
+ await (0, shell_1.getRepository)(user_js_1.User).save(user);
123
123
  }
124
124
  context.status = 200;
125
125
  context.body = 'ok';
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2-router.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-router.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt from 'jsonwebtoken'\nimport compose from 'koa-compose'\nimport passport from 'koa-passport'\nimport Router from 'koa-router'\n\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { jwtAuthenticateMiddleware } from '../../middlewares'\nimport { Application } from '../../service/application/application'\nimport { User, UserStatus } from '../../service/user/user'\nimport { setAccessTokenCookie } from '../../utils/access-token-cookie'\nimport { SECRET } from '../../utils/get-secret'\nimport { server as oauth2orizeServer } from './oauth2-server'\nimport { Strategy as ClientPasswordStrategy } from './passport-oauth2-client-password'\n\ndeclare global {\n namespace NodeJS {\n interface Process {\n oauthDisconnect: (user: User) => Promise<void>\n }\n }\n}\n\nexport const oauth2Router = new Router()\n\npassport.use(\n 'oauth2-client-password',\n new ClientPasswordStrategy({}, (clientId, clientSecret, done) => {\n getRepository(Application)\n .findOneBy({\n appKey: clientId\n })\n .then(client => {\n if (!client || client.appSecret != clientSecret) {\n done(null, false)\n return\n }\n\n done(null, client)\n })\n .catch(err => done(err))\n })\n)\n\n// user decision endpoint\n//\n// `decision` middleware processes a user's decision to allow or deny access\n// requested by a client application. Based on the grant type requested by the\n// client, the above grant middleware configured above will be invoked to send\n// a response.\n\noauth2Router.post(\n '/decision',\n jwtAuthenticateMiddleware,\n compose(\n oauth2orizeServer.decision(async function (context) {\n const { request } = context\n\n return request.body\n })\n )\n)\n\n// token endpoint\n//\n// `token` middleware handles client requests to exchange authorization grants\n// for access tokens. Based on the grant type being exchanged, the above\n// exchange middleware will be invoked to handle the request. Clients must\n// authenticate when making requests to this endpoint.\n\noauth2Router.post(\n '/access-token',\n passport.authenticate('oauth2-client-password', { session: false }),\n oauth2orizeServer.token(),\n oauth2orizeServer.errorHandler()\n)\n\noauth2Router.post('/refresh-token', async (context, next) => {\n const refreshToken: string | undefined = context.request?.body?.refreshToken\n if (!refreshToken) throw new Error('Missing refresh token')\n\n const appUser: User | undefined = await getRepository(User).findOneBy({\n password: refreshToken\n })\n\n if (!appUser) throw new Error('App user is not found')\n\n try {\n jwt.verify(refreshToken, SECRET)\n const decoded = jwt.decode(refreshToken) as any\n const subdomain: string = decoded.domain.subdomain\n const domain: Domain | undefined = await getRepository(Domain).findOne({\n where: { subdomain }\n })\n if (!domain) throw new Error('Domain is not found')\n const appKey: string = decoded.application.appKey\n const scopes: any[] = decoded.scope\n\n const newAccessToken: string = Application.generateAccessToken(domain, appUser, appKey, scopes)\n const newRefreshToken: string = Application.generateRefreshToken(domain, appUser, appKey, scopes)\n\n appUser.password = newRefreshToken\n await getRepository(User).save(appUser)\n\n setAccessTokenCookie(context, newAccessToken)\n\n context.body = {\n accessToken: newAccessToken,\n refreshToken: newRefreshToken\n }\n } catch (e) {\n context.status = 401\n context.body = e.message\n }\n})\n\noauth2Router.get('/profile', jwtAuthenticateMiddleware, async (context, next) => {\n const { user, domain } = context.state\n\n const { name, description, email, userType: type, locale } = user\n const { name: domainName, subdomain, brandName, brandImage, contentImage, timezone } = domain || {}\n\n var application = {}\n if (type == 'application') {\n /* user entity에 reference 필드가 추가되기 전까지, appKey취득 방법임. */\n application['appKey'] = email.substr(0, email.lastIndexOf('@'))\n }\n\n context.body = {\n profile: {\n name,\n description,\n email,\n type /* (admin|user|application|appliance) */,\n domain: {\n name: domainName,\n subdomain,\n brandName,\n brandImage,\n contentImage,\n timezone\n },\n application\n }\n }\n})\n\noauth2Router.post('/disconnect', jwtAuthenticateMiddleware, async (context, next) => {\n try {\n let { user } = context.state\n\n if (typeof process.oauthDisconnect === 'function') {\n await process.oauthDisconnect(user)\n } else {\n user.domains = []\n user.roles = []\n user.status = UserStatus.DELETED\n await getRepository(User).save(user)\n }\n context.status = 200\n context.body = 'ok'\n } catch (e) {\n throw e\n }\n})\n"]}
1
+ {"version":3,"file":"oauth2-router.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-router.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt from 'jsonwebtoken'\nimport compose from 'koa-compose'\nimport passport from 'koa-passport'\nimport Router from 'koa-router'\n\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { jwtAuthenticateMiddleware } from '../../middlewares/index.js'\nimport { Application } from '../../service/application/application.js'\nimport { User, UserStatus } from '../../service/user/user.js'\nimport { setAccessTokenCookie } from '../../utils/access-token-cookie.js'\nimport { SECRET } from '../../utils/get-secret.js'\nimport { server as oauth2orizeServer } from './oauth2-server.js'\nimport { Strategy as ClientPasswordStrategy } from './passport-oauth2-client-password.js'\n\ndeclare global {\n namespace NodeJS {\n interface Process {\n oauthDisconnect: (user: User) => Promise<void>\n }\n }\n}\n\nexport const oauth2Router = new Router()\n\npassport.use(\n 'oauth2-client-password',\n new ClientPasswordStrategy({}, (clientId, clientSecret, done) => {\n getRepository(Application)\n .findOneBy({\n appKey: clientId\n })\n .then(client => {\n if (!client || client.appSecret != clientSecret) {\n done(null, false)\n return\n }\n\n done(null, client)\n })\n .catch(err => done(err))\n })\n)\n\n// user decision endpoint\n//\n// `decision` middleware processes a user's decision to allow or deny access\n// requested by a client application. Based on the grant type requested by the\n// client, the above grant middleware configured above will be invoked to send\n// a response.\n\noauth2Router.post(\n '/decision',\n jwtAuthenticateMiddleware,\n compose(\n oauth2orizeServer.decision(async function (context) {\n const { request } = context\n\n return request.body\n })\n )\n)\n\n// token endpoint\n//\n// `token` middleware handles client requests to exchange authorization grants\n// for access tokens. Based on the grant type being exchanged, the above\n// exchange middleware will be invoked to handle the request. Clients must\n// authenticate when making requests to this endpoint.\n\noauth2Router.post(\n '/access-token',\n passport.authenticate('oauth2-client-password', { session: false }),\n oauth2orizeServer.token(),\n oauth2orizeServer.errorHandler()\n)\n\noauth2Router.post('/refresh-token', async (context, next) => {\n const refreshToken: string | undefined = context.request?.body?.refreshToken\n if (!refreshToken) throw new Error('Missing refresh token')\n\n const appUser: User | undefined = await getRepository(User).findOneBy({\n password: refreshToken\n })\n\n if (!appUser) throw new Error('App user is not found')\n\n try {\n jwt.verify(refreshToken, SECRET)\n const decoded = jwt.decode(refreshToken) as any\n const subdomain: string = decoded.domain.subdomain\n const domain: Domain | undefined = await getRepository(Domain).findOne({\n where: { subdomain }\n })\n if (!domain) throw new Error('Domain is not found')\n const appKey: string = decoded.application.appKey\n const scopes: any[] = decoded.scope\n\n const newAccessToken: string = Application.generateAccessToken(domain, appUser, appKey, scopes)\n const newRefreshToken: string = Application.generateRefreshToken(domain, appUser, appKey, scopes)\n\n appUser.password = newRefreshToken\n await getRepository(User).save(appUser)\n\n setAccessTokenCookie(context, newAccessToken)\n\n context.body = {\n accessToken: newAccessToken,\n refreshToken: newRefreshToken\n }\n } catch (e) {\n context.status = 401\n context.body = e.message\n }\n})\n\noauth2Router.get('/profile', jwtAuthenticateMiddleware, async (context, next) => {\n const { user, domain } = context.state\n\n const { name, description, email, userType: type, locale } = user\n const { name: domainName, subdomain, brandName, brandImage, contentImage, timezone } = domain || {}\n\n var application = {}\n if (type == 'application') {\n /* user entity에 reference 필드가 추가되기 전까지, appKey취득 방법임. */\n application['appKey'] = email.substr(0, email.lastIndexOf('@'))\n }\n\n context.body = {\n profile: {\n name,\n description,\n email,\n type /* (admin|user|application|appliance) */,\n domain: {\n name: domainName,\n subdomain,\n brandName,\n brandImage,\n contentImage,\n timezone\n },\n application\n }\n }\n})\n\noauth2Router.post('/disconnect', jwtAuthenticateMiddleware, async (context, next) => {\n try {\n let { user } = context.state\n\n if (typeof process.oauthDisconnect === 'function') {\n await process.oauthDisconnect(user)\n } else {\n user.domains = []\n user.roles = []\n user.status = UserStatus.DELETED\n await getRepository(User).save(user)\n }\n context.status = 200\n context.body = 'ok'\n } catch (e) {\n throw e\n }\n})\n"]}
@@ -6,9 +6,9 @@ const oauth2orize_koa_1 = tslib_1.__importDefault(require("oauth2orize-koa"));
6
6
  const typeorm_1 = require("typeorm");
7
7
  const env_1 = require("@things-factory/env");
8
8
  const shell_1 = require("@things-factory/shell");
9
- const application_1 = require("../../service/application/application");
10
- const role_1 = require("../../service/role/role");
11
- const user_1 = require("../../service/user/user");
9
+ const application_js_1 = require("../../service/application/application.js");
10
+ const role_js_1 = require("../../service/role/role.js");
11
+ const user_js_1 = require("../../service/user/user.js");
12
12
  const crypto = require('crypto');
13
13
  exports.NOTFOUND = 'NOTFOUND';
14
14
  exports.NonClient = {
@@ -35,7 +35,7 @@ exports.server.deserializeClient(async function (id) {
35
35
  if (id == exports.NOTFOUND) {
36
36
  return {};
37
37
  }
38
- const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({ id });
38
+ const application = await (0, shell_1.getRepository)(application_js_1.Application).findOneBy({ id });
39
39
  return application;
40
40
  });
41
41
  // Register supported grant types.
@@ -52,7 +52,7 @@ exports.server.deserializeClient(async function (id) {
52
52
  // values, and will be exchanged for an access token.
53
53
  exports.server.grant(oauth2orize_koa_1.default.grant.code(async (client, redirectUrl, user, ares, areq) => {
54
54
  const { email, appKey, subdomain, scopes, state } = ares;
55
- return application_1.Application.generateAuthCode(email, appKey, subdomain, scopes, state);
55
+ return application_js_1.Application.generateAuthCode(email, appKey, subdomain, scopes, state);
56
56
  }));
57
57
  // Exchange authorization codes for access tokens. The callback accepts the
58
58
  // `client`, which is exchanging `code` and any `redirectURI` from the
@@ -62,13 +62,13 @@ exports.server.grant(oauth2orize_koa_1.default.grant.code(async (client, redirec
62
62
  exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, code, redirectUrl) => {
63
63
  try {
64
64
  /* authorization code */
65
- var decoded = application_1.Application.verifyAuthCode(code);
65
+ var decoded = application_js_1.Application.verifyAuthCode(code);
66
66
  }
67
67
  catch (e) {
68
68
  return false;
69
69
  }
70
70
  let { email, appKey, subdomain, scopes } = decoded;
71
- const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({
71
+ const application = await (0, shell_1.getRepository)(application_js_1.Application).findOneBy({
72
72
  appKey
73
73
  });
74
74
  if (!application) {
@@ -89,9 +89,9 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
89
89
  const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
90
90
  subdomain
91
91
  });
92
- const creator = await (0, shell_1.getRepository)(user_1.User).findOneBy({ email: (0, typeorm_1.ILike)(email) });
92
+ const creator = await (0, shell_1.getRepository)(user_js_1.User).findOneBy({ email: (0, typeorm_1.ILike)(email) });
93
93
  const appuserEmail = `${crypto.randomUUID()}@${subdomain}`;
94
- var appuser = await (0, shell_1.getRepository)(user_1.User).findOne({
94
+ var appuser = await (0, shell_1.getRepository)(user_js_1.User).findOne({
95
95
  where: {
96
96
  email: appuserEmail,
97
97
  reference: application.id,
@@ -99,7 +99,7 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
99
99
  },
100
100
  relations: ['domains', 'creator', 'updater']
101
101
  });
102
- appuser = await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, (appuser || {})), { email: appuserEmail, name: application.name, userType: 'application', reference: application.id, domains: [domain], roles: scopes, status: user_1.UserStatus.ACTIVATED, updater: creator, creator }));
102
+ appuser = await (0, shell_1.getRepository)(user_js_1.User).save(Object.assign(Object.assign({}, (appuser || {})), { email: appuserEmail, name: application.name, userType: 'application', reference: application.id, domains: [domain], roles: scopes, status: user_js_1.UserStatus.ACTIVATED, updater: creator, creator }));
103
103
  // appuser = await getRepository(User).findOne({
104
104
  // where: { email: ILike(appuserEmail) },
105
105
  // relations: ['domains']
@@ -108,9 +108,9 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
108
108
  // await getRepository(User).save(appuser)
109
109
  // Lazy relation 필드들(domain, domains)들에 대한 업데이트. 이상의 방법으로 업데이트 해야하는 것 같다.
110
110
  // Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.
111
- var accessToken = application_1.Application.generateAccessToken(domain, appuser, appKey, scopes);
112
- var refreshToken = application_1.Application.generateRefreshToken(domain, appuser, appKey, scopes);
113
- await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, appuser), { password: refreshToken }));
111
+ var accessToken = application_js_1.Application.generateAccessToken(domain, appuser, appKey, scopes);
112
+ var refreshToken = application_js_1.Application.generateRefreshToken(domain, appuser, appKey, scopes);
113
+ await (0, shell_1.getRepository)(user_js_1.User).save(Object.assign(Object.assign({}, appuser), { password: refreshToken }));
114
114
  return [
115
115
  accessToken,
116
116
  refreshToken,
@@ -124,14 +124,14 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.code(async (client, c
124
124
  exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (client, refreshToken, scope) => {
125
125
  try {
126
126
  /* refresh token */
127
- var decoded = application_1.Application.verifyAuthCode(refreshToken);
127
+ var decoded = application_js_1.Application.verifyAuthCode(refreshToken);
128
128
  }
129
129
  catch (e) {
130
130
  env_1.logger.error(e);
131
131
  return false;
132
132
  }
133
133
  const { id, userType, email, application: { appKey }, domain: { subdomain }, scope: originalScope, exp: expires_in } = decoded;
134
- const application = await (0, shell_1.getRepository)(application_1.Application).findOneBy({
134
+ const application = await (0, shell_1.getRepository)(application_js_1.Application).findOneBy({
135
135
  appKey
136
136
  });
137
137
  if (!application) {
@@ -145,12 +145,12 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (c
145
145
  const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
146
146
  subdomain
147
147
  });
148
- const creator = await (0, shell_1.getRepository)(user_1.User).findOneBy({
148
+ const creator = await (0, shell_1.getRepository)(user_js_1.User).findOneBy({
149
149
  id,
150
150
  userType
151
151
  });
152
152
  const appuserEmail = `${appKey}@${subdomain}`;
153
- var appuser = await (0, shell_1.getRepository)(user_1.User).findOne({
153
+ var appuser = await (0, shell_1.getRepository)(user_js_1.User).findOne({
154
154
  where: {
155
155
  email: appuserEmail,
156
156
  reference: application.id,
@@ -173,13 +173,13 @@ exports.server.exchange(oauth2orize_koa_1.default.exchange.refreshToken(async (c
173
173
  env_1.logger.error(`additional scope(${additionalScope}) required`);
174
174
  return false;
175
175
  }
176
- const roles = await (0, shell_1.getRepository)(role_1.Role).findBy({
176
+ const roles = await (0, shell_1.getRepository)(role_js_1.Role).findBy({
177
177
  name: (0, typeorm_1.In)(scopes),
178
178
  domain: { id: domain.id }
179
179
  });
180
- var accessToken = application_1.Application.generateAccessToken(domain, appuser, appKey, scope);
181
- var refreshToken = application_1.Application.generateRefreshToken(domain, appuser, appKey, scope);
182
- await (0, shell_1.getRepository)(user_1.User).save(Object.assign(Object.assign({}, appuser), { roles, password: refreshToken }));
180
+ var accessToken = application_js_1.Application.generateAccessToken(domain, appuser, appKey, scope);
181
+ var refreshToken = application_js_1.Application.generateRefreshToken(domain, appuser, appKey, scope);
182
+ await (0, shell_1.getRepository)(user_js_1.User).save(Object.assign(Object.assign({}, appuser), { roles, password: refreshToken }));
183
183
  return [
184
184
  accessToken,
185
185
  refreshToken,
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2-server.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-server.ts"],"names":[],"mappings":"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","sourcesContent":["import oauth2orize from 'oauth2orize-koa'\nimport { ILike, In } from 'typeorm'\n\nimport { logger } from '@things-factory/env'\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { Application } from '../../service/application/application'\nimport { Role } from '../../service/role/role'\nimport { User, UserStatus } from '../../service/user/user'\n\nconst crypto = require('crypto')\n\nexport const NOTFOUND = 'NOTFOUND'\nexport const NonClient = {\n id: NOTFOUND\n}\n\n// create OAuth 2.0 server\nexport const server = oauth2orize.createServer()\n\n// Register serialialization and deserialization functions.\n//\n// When a client redirects a user to user authorization endpoint, an\n// authorization transaction is initiated. To complete the transaction, the\n// user must authenticate and approve the authorization request. Because this\n// may involve multiple HTTP request/response exchanges, the transaction is\n// stored in the session.\n//\n// An application must supply serialization functions, which determine how the\n// client object is serialized into the session. Typically this will be a\n// simple matter of serializing the client's ID, and deserializing by finding\n// the client by ID from the database.\n\nserver.serializeClient(async function (client) {\n return client.id\n})\n\nserver.deserializeClient(async function (id) {\n if (id == NOTFOUND) {\n return {}\n }\n\n const application = await getRepository(Application).findOneBy({ id })\n return application\n})\n\n// Register supported grant types.\n//\n// OAuth 2.0 specifies a framework that allows users to grant client\n// applications limited access to their protected resources. It does this\n// through a process of the user granting access, and the client exchanging\n// the grant for an access token.\n\n// Grant authorization codes. The callback takes the `client` requesting\n// authorization, the `redirectURI` (which is used as a verifier in the\n// subsequent exchange), the authenticated `user` granting access, and\n// their response, which contains approved scope, duration, etc. as parsed by\n// the application. The application issues a code, which is bound to these\n// values, and will be exchanged for an access token.\n\nserver.grant(\n oauth2orize.grant.code(async (client, redirectUrl, user, ares, areq) => {\n const { email, appKey, subdomain, scopes, state } = ares\n\n return Application.generateAuthCode(email, appKey, subdomain, scopes, state)\n })\n)\n\n// Exchange authorization codes for access tokens. The callback accepts the\n// `client`, which is exchanging `code` and any `redirectURI` from the\n// authorization request for verification. If these values are validated, the\n// application issues an access token on behalf of the user who authorized the\n// code.\n\nserver.exchange(\n oauth2orize.exchange.code(async (client, code, redirectUrl) => {\n try {\n /* authorization code */\n var decoded: any = Application.verifyAuthCode(code)\n } catch (e) {\n return false\n }\n let { email, appKey, subdomain, scopes } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n return false\n }\n\n /* DONT-FORGET uncomment after test */\n // if (redirectUrl !== application.redirectUrl && redirectUrl.indexOf(application.redirectUrl) != 0) {\n // logger.error(\n // 'oauth2 exchange error - redirectUrl should begins with the application setting',\n // redirectUrl,\n // application.redirectUrl\n // )\n // // return false\n // throw new TypeError(\n // `oauth2 exchange error - redirectUrl should begins with the application setting : '${redirectUrl}':'${application.redirectUrl}'`\n // )\n // }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({ email: ILike(email) })\n\n const appuserEmail = `${crypto.randomUUID()}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n\n relations: ['domains', 'creator', 'updater']\n })\n\n appuser = await getRepository(User).save({\n ...(appuser || {}),\n email: appuserEmail,\n name: application.name,\n userType: 'application',\n reference: application.id,\n domains: [domain],\n roles: scopes,\n status: UserStatus.ACTIVATED,\n updater: creator,\n creator\n })\n\n // appuser = await getRepository(User).findOne({\n // where: { email: ILike(appuserEmail) },\n // relations: ['domains']\n // })\n\n // appuser.domains = Promise.resolve([domain])\n // await getRepository(User).save(appuser)\n // Lazy relation 필드들(domain, domains)들에 대한 업데이트. 이상의 방법으로 업데이트 해야하는 것 같다.\n // Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scopes)\n var refreshToken = Application.generateRefreshToken(domain, appuser, appKey, scopes)\n\n await getRepository(User).save({\n ...(appuser as any),\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer',\n centerId: subdomain\n }\n ]\n })\n)\n\nserver.exchange(\n oauth2orize.exchange.refreshToken(async (client, refreshToken, scope) => {\n try {\n /* refresh token */\n var decoded: any = Application.verifyAuthCode(refreshToken)\n } catch (e) {\n logger.error(e)\n return false\n }\n const {\n id,\n userType,\n email,\n application: { appKey },\n domain: { subdomain },\n scope: originalScope,\n exp: expires_in\n } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n logger.error('application is not exist')\n return false\n }\n\n if (Date.now() > expires_in * 1000) {\n logger.error('refresh token is expired')\n return false\n }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({\n id,\n userType\n })\n\n const appuserEmail = `${appKey}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n relations: ['domain', 'creator', 'updater']\n })\n\n if (!appuser) {\n logger.error('application is not bound')\n return false\n }\n\n /*\n * `scope` is the scope of access requested by the client, which must not include any scope not originally granted.\n */\n\n scope = scope || originalScope\n\n const scopes: string[] = scope.split(',')\n const originalScopes = (originalScope || '').split(',')\n const additionalScope = scopes.find(scope => originalScopes.indexOf(scope) === -1)\n if (additionalScope) {\n logger.error(`additional scope(${additionalScope}) required`)\n return false\n }\n\n const roles = await getRepository(Role).findBy({\n name: In(scopes),\n domain: { id: domain.id }\n })\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scope)\n var refreshToken: any = Application.generateRefreshToken(domain, appuser, appKey, scope)\n\n await getRepository(User).save({\n ...(appuser as any),\n roles,\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer'\n }\n ]\n })\n)\n"]}
1
+ {"version":3,"file":"oauth2-server.js","sourceRoot":"","sources":["../../../server/router/oauth2/oauth2-server.ts"],"names":[],"mappings":"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","sourcesContent":["import oauth2orize from 'oauth2orize-koa'\nimport { ILike, In } from 'typeorm'\n\nimport { logger } from '@things-factory/env'\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { Application } from '../../service/application/application.js'\nimport { Role } from '../../service/role/role.js'\nimport { User, UserStatus } from '../../service/user/user.js'\n\nconst crypto = require('crypto')\n\nexport const NOTFOUND = 'NOTFOUND'\nexport const NonClient = {\n id: NOTFOUND\n}\n\n// create OAuth 2.0 server\nexport const server = oauth2orize.createServer()\n\n// Register serialialization and deserialization functions.\n//\n// When a client redirects a user to user authorization endpoint, an\n// authorization transaction is initiated. To complete the transaction, the\n// user must authenticate and approve the authorization request. Because this\n// may involve multiple HTTP request/response exchanges, the transaction is\n// stored in the session.\n//\n// An application must supply serialization functions, which determine how the\n// client object is serialized into the session. Typically this will be a\n// simple matter of serializing the client's ID, and deserializing by finding\n// the client by ID from the database.\n\nserver.serializeClient(async function (client) {\n return client.id\n})\n\nserver.deserializeClient(async function (id) {\n if (id == NOTFOUND) {\n return {}\n }\n\n const application = await getRepository(Application).findOneBy({ id })\n return application\n})\n\n// Register supported grant types.\n//\n// OAuth 2.0 specifies a framework that allows users to grant client\n// applications limited access to their protected resources. It does this\n// through a process of the user granting access, and the client exchanging\n// the grant for an access token.\n\n// Grant authorization codes. The callback takes the `client` requesting\n// authorization, the `redirectURI` (which is used as a verifier in the\n// subsequent exchange), the authenticated `user` granting access, and\n// their response, which contains approved scope, duration, etc. as parsed by\n// the application. The application issues a code, which is bound to these\n// values, and will be exchanged for an access token.\n\nserver.grant(\n oauth2orize.grant.code(async (client, redirectUrl, user, ares, areq) => {\n const { email, appKey, subdomain, scopes, state } = ares\n\n return Application.generateAuthCode(email, appKey, subdomain, scopes, state)\n })\n)\n\n// Exchange authorization codes for access tokens. The callback accepts the\n// `client`, which is exchanging `code` and any `redirectURI` from the\n// authorization request for verification. If these values are validated, the\n// application issues an access token on behalf of the user who authorized the\n// code.\n\nserver.exchange(\n oauth2orize.exchange.code(async (client, code, redirectUrl) => {\n try {\n /* authorization code */\n var decoded: any = Application.verifyAuthCode(code)\n } catch (e) {\n return false\n }\n let { email, appKey, subdomain, scopes } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n return false\n }\n\n /* DONT-FORGET uncomment after test */\n // if (redirectUrl !== application.redirectUrl && redirectUrl.indexOf(application.redirectUrl) != 0) {\n // logger.error(\n // 'oauth2 exchange error - redirectUrl should begins with the application setting',\n // redirectUrl,\n // application.redirectUrl\n // )\n // // return false\n // throw new TypeError(\n // `oauth2 exchange error - redirectUrl should begins with the application setting : '${redirectUrl}':'${application.redirectUrl}'`\n // )\n // }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({ email: ILike(email) })\n\n const appuserEmail = `${crypto.randomUUID()}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n\n relations: ['domains', 'creator', 'updater']\n })\n\n appuser = await getRepository(User).save({\n ...(appuser || {}),\n email: appuserEmail,\n name: application.name,\n userType: 'application',\n reference: application.id,\n domains: [domain],\n roles: scopes,\n status: UserStatus.ACTIVATED,\n updater: creator,\n creator\n })\n\n // appuser = await getRepository(User).findOne({\n // where: { email: ILike(appuserEmail) },\n // relations: ['domains']\n // })\n\n // appuser.domains = Promise.resolve([domain])\n // await getRepository(User).save(appuser)\n // Lazy relation 필드들(domain, domains)들에 대한 업데이트. 이상의 방법으로 업데이트 해야하는 것 같다.\n // Lazy relation 업데이트 방법의 일관성이 부족하므로, Lazy relation 필드를 사용하지 않기를 권장함.\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scopes)\n var refreshToken = Application.generateRefreshToken(domain, appuser, appKey, scopes)\n\n await getRepository(User).save({\n ...(appuser as any),\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer',\n centerId: subdomain\n }\n ]\n })\n)\n\nserver.exchange(\n oauth2orize.exchange.refreshToken(async (client, refreshToken, scope) => {\n try {\n /* refresh token */\n var decoded: any = Application.verifyAuthCode(refreshToken)\n } catch (e) {\n logger.error(e)\n return false\n }\n const {\n id,\n userType,\n email,\n application: { appKey },\n domain: { subdomain },\n scope: originalScope,\n exp: expires_in\n } = decoded\n\n const application: Application = await getRepository(Application).findOneBy({\n appKey\n })\n\n if (!application) {\n logger.error('application is not exist')\n return false\n }\n\n if (Date.now() > expires_in * 1000) {\n logger.error('refresh token is expired')\n return false\n }\n\n const domain: Domain = await getRepository(Domain).findOneBy({\n subdomain\n })\n\n const creator: User = await getRepository(User).findOneBy({\n id,\n userType\n })\n\n const appuserEmail = `${appKey}@${subdomain}`\n\n var appuser: User = await getRepository(User).findOne({\n where: {\n email: appuserEmail,\n reference: application.id,\n userType: 'application'\n },\n relations: ['domain', 'creator', 'updater']\n })\n\n if (!appuser) {\n logger.error('application is not bound')\n return false\n }\n\n /*\n * `scope` is the scope of access requested by the client, which must not include any scope not originally granted.\n */\n\n scope = scope || originalScope\n\n const scopes: string[] = scope.split(',')\n const originalScopes = (originalScope || '').split(',')\n const additionalScope = scopes.find(scope => originalScopes.indexOf(scope) === -1)\n if (additionalScope) {\n logger.error(`additional scope(${additionalScope}) required`)\n return false\n }\n\n const roles = await getRepository(Role).findBy({\n name: In(scopes),\n domain: { id: domain.id }\n })\n\n var accessToken = Application.generateAccessToken(domain, appuser, appKey, scope)\n var refreshToken: any = Application.generateRefreshToken(domain, appuser, appKey, scope)\n\n await getRepository(User).save({\n ...(appuser as any),\n roles,\n password: refreshToken\n })\n\n return [\n accessToken,\n refreshToken,\n {\n expires_in: 30 * 24 * 60 * 60 /* 30d */,\n token_type: 'bearer'\n }\n ]\n })\n)\n"]}
@@ -6,15 +6,15 @@ const koa_router_1 = tslib_1.__importDefault(require("koa-router"));
6
6
  const koa_passport_1 = tslib_1.__importDefault(require("koa-passport"));
7
7
  const shell_1 = require("@things-factory/shell");
8
8
  const env_1 = require("@things-factory/env");
9
- const user_1 = require("../service/user/user");
10
- const get_user_domains_1 = require("../utils/get-user-domains");
9
+ const user_js_1 = require("../service/user/user.js");
10
+ const get_user_domains_js_1 = require("../utils/get-user-domains.js");
11
11
  const PUBLIC_HOME_ROUTE = env_1.config.get('publicHomeRoute', '/public/home');
12
12
  exports.siteRootRouter = new koa_router_1.default();
13
13
  async function findAuth(context, next) {
14
14
  return await koa_passport_1.default.authenticate('jwt', { session: false }, async (err, decoded, info) => {
15
15
  if (decoded) {
16
16
  try {
17
- const user = await user_1.User.checkAuth(decoded);
17
+ const user = await user_js_1.User.checkAuth(decoded);
18
18
  context.state.user = user;
19
19
  }
20
20
  catch (e) { }
@@ -26,7 +26,7 @@ exports.siteRootRouter.get('/', findAuth, shell_1.domainMiddleware, async (conte
26
26
  const { user, domain } = context.state;
27
27
  const subdomain = domain === null || domain === void 0 ? void 0 : domain.subdomain;
28
28
  if (user && subdomain) {
29
- const userDomains = await (0, get_user_domains_1.getUserDomains)(user);
29
+ const userDomains = await (0, get_user_domains_js_1.getUserDomains)(user);
30
30
  if (userDomains.find(userDomain => userDomain.subdomain == subdomain)) {
31
31
  return await next();
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"site-root-router.js","sourceRoot":"","sources":["../../server/router/site-root-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAC/B,wEAAmC;AAEnC,iDAAgE;AAChE,6CAA4C;AAE5C,+CAA2C;AAC3C,gEAA0D;AAE1D,MAAM,iBAAiB,GAAG,YAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;AAE1D,QAAA,cAAc,GAAG,IAAI,oBAAM,EAAE,CAAA;AAE1C,KAAK,UAAU,QAAQ,CAAC,OAAO,EAAE,IAAI;IACnC,OAAO,MAAM,sBAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACzF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,WAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;gBAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACnB,CAAC;AAED,sBAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,wBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEtC,MAAM,SAAS,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,CAAA;IAEnC,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;QACtB,MAAM,WAAW,GAAsB,MAAM,IAAA,iCAAc,EAAC,IAAI,CAAC,CAAA;QACjE,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,CAAC;YACtE,OAAO,MAAM,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAEjC,OAAM;IACR,CAAC;IAED,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AACrC,CAAC,CAAC,CAAA","sourcesContent":["import Router from 'koa-router'\nimport passport from 'koa-passport'\n\nimport { Domain, domainMiddleware } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { User } from '../service/user/user'\nimport { getUserDomains } from '../utils/get-user-domains'\n\nconst PUBLIC_HOME_ROUTE = config.get('publicHomeRoute', '/public/home')\n\nexport const siteRootRouter = new Router()\n\nasync function findAuth(context, next) {\n return await passport.authenticate('jwt', { session: false }, async (err, decoded, info) => {\n if (decoded) {\n try {\n const user = await User.checkAuth(decoded)\n context.state.user = user\n } catch (e) {}\n }\n\n await next()\n })(context, next)\n}\n\nsiteRootRouter.get('/', findAuth, domainMiddleware, async (context, next) => {\n const { user, domain } = context.state\n\n const subdomain = domain?.subdomain\n\n if (user && subdomain) {\n const userDomains: Partial<Domain>[] = await getUserDomains(user)\n if (userDomains.find(userDomain => userDomain.subdomain == subdomain)) {\n return await next()\n }\n\n return context.redirect(`/auth/checkin/${subdomain}`)\n }\n\n if (user && !subdomain) {\n context.redirect('/auth/checkin')\n\n return\n }\n\n context.redirect(PUBLIC_HOME_ROUTE)\n})\n"]}
1
+ {"version":3,"file":"site-root-router.js","sourceRoot":"","sources":["../../server/router/site-root-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAC/B,wEAAmC;AAEnC,iDAAgE;AAChE,6CAA4C;AAE5C,qDAA8C;AAC9C,sEAA6D;AAE7D,MAAM,iBAAiB,GAAG,YAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAA;AAE1D,QAAA,cAAc,GAAG,IAAI,oBAAM,EAAE,CAAA;AAE1C,KAAK,UAAU,QAAQ,CAAC,OAAO,EAAE,IAAI;IACnC,OAAO,MAAM,sBAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACzF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,cAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;gBAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACnB,CAAC;AAED,sBAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,wBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC1E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEtC,MAAM,SAAS,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,CAAA;IAEnC,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;QACtB,MAAM,WAAW,GAAsB,MAAM,IAAA,oCAAc,EAAC,IAAI,CAAC,CAAA;QACjE,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,CAAC;YACtE,OAAO,MAAM,IAAI,EAAE,CAAA;QACrB,CAAC;QAED,OAAO,OAAO,CAAC,QAAQ,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAEjC,OAAM;IACR,CAAC;IAED,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AACrC,CAAC,CAAC,CAAA","sourcesContent":["import Router from 'koa-router'\nimport passport from 'koa-passport'\n\nimport { Domain, domainMiddleware } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\n\nimport { User } from '../service/user/user.js'\nimport { getUserDomains } from '../utils/get-user-domains.js'\n\nconst PUBLIC_HOME_ROUTE = config.get('publicHomeRoute', '/public/home')\n\nexport const siteRootRouter = new Router()\n\nasync function findAuth(context, next) {\n return await passport.authenticate('jwt', { session: false }, async (err, decoded, info) => {\n if (decoded) {\n try {\n const user = await User.checkAuth(decoded)\n context.state.user = user\n } catch (e) {}\n }\n\n await next()\n })(context, next)\n}\n\nsiteRootRouter.get('/', findAuth, domainMiddleware, async (context, next) => {\n const { user, domain } = context.state\n\n const subdomain = domain?.subdomain\n\n if (user && subdomain) {\n const userDomains: Partial<Domain>[] = await getUserDomains(user)\n if (userDomains.find(userDomain => userDomain.subdomain == subdomain)) {\n return await next()\n }\n\n return context.redirect(`/auth/checkin/${subdomain}`)\n }\n\n if (user && !subdomain) {\n context.redirect('/auth/checkin')\n\n return\n }\n\n context.redirect(PUBLIC_HOME_ROUTE)\n})\n"]}
@@ -6,16 +6,63 @@ const koa_router_1 = tslib_1.__importDefault(require("koa-router"));
6
6
  const shell_1 = require("@things-factory/shell");
7
7
  const env_1 = require("@things-factory/env");
8
8
  const server_1 = require("@simplewebauthn/server");
9
- const web_auth_credential_1 = require("../service/web-auth-credential/web-auth-credential");
10
- const access_token_cookie_1 = require("../utils/access-token-cookie");
11
- const webauthn_middleware_1 = require("../middlewares/webauthn-middleware");
9
+ const web_auth_credential_js_1 = require("../service/web-auth-credential/web-auth-credential.js");
10
+ const access_token_cookie_js_1 = require("../utils/access-token-cookie.js");
11
+ const webauthn_middleware_js_1 = require("../middlewares/webauthn-middleware.js");
12
12
  exports.webAuthnGlobalPublicRouter = new koa_router_1.default();
13
13
  exports.webAuthnGlobalPrivateRouter = new koa_router_1.default();
14
14
  const { name: rpName } = env_1.appPackage;
15
+ // Generate authentication challenge for the currently logged-in user
16
+ exports.webAuthnGlobalPrivateRouter.get('/auth/verify-webauthn/challenge', async (context, next) => {
17
+ const { user } = context.state;
18
+ const rpID = context.hostname;
19
+ if (!user) {
20
+ context.status = 401;
21
+ context.body = { error: 'User not authenticated' };
22
+ return;
23
+ }
24
+ const webAuthCredentials = await (0, shell_1.getRepository)(web_auth_credential_js_1.WebAuthCredential).find({
25
+ where: { user: { id: user.id } }
26
+ });
27
+ if (webAuthCredentials.length === 0) {
28
+ context.status = 400;
29
+ context.body = { error: 'No biometric credentials registered for this user' };
30
+ return;
31
+ }
32
+ const options = await (0, server_1.generateAuthenticationOptions)({
33
+ rpID,
34
+ userVerification: 'preferred',
35
+ allowCredentials: webAuthCredentials.map(credential => ({
36
+ id: credential.credentialId,
37
+ type: 'public-key'
38
+ }))
39
+ });
40
+ context.session.challenge = options.challenge;
41
+ context.body = options;
42
+ });
43
+ // Verify biometric authentication
44
+ exports.webAuthnGlobalPrivateRouter.post('/auth/verify-webauthn',
45
+ /* reuse webauthn-login as webauthn-verify strategy */
46
+ (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
47
+ const { user } = context.state;
48
+ const { request } = context;
49
+ const { body: reqBody } = request;
50
+ if (!user) {
51
+ context.status = 401;
52
+ context.body = { verified: false, message: 'User not authenticated' };
53
+ return;
54
+ }
55
+ context.body = {
56
+ verified: true,
57
+ message: 'Biometric authentication successful'
58
+ };
59
+ await next();
60
+ });
61
+ // Generate registration challenge for the currently logged-in user
15
62
  exports.webAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', async (context, next) => {
16
63
  const { user } = context.state;
17
64
  const rpID = context.hostname;
18
- const webAuthCredentials = await (0, shell_1.getRepository)(web_auth_credential_1.WebAuthCredential).find({
65
+ const webAuthCredentials = await (0, shell_1.getRepository)(web_auth_credential_js_1.WebAuthCredential).find({
19
66
  where: {
20
67
  user: { id: user.id }
21
68
  }
@@ -45,7 +92,9 @@ exports.webAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', asy
45
92
  context.session.challenge = options.challenge;
46
93
  context.body = options;
47
94
  });
48
- exports.webAuthnGlobalPrivateRouter.post('/auth/verify-registration', (0, webauthn_middleware_1.createWebAuthnMiddleware)('webauthn-register'));
95
+ // Verify registration
96
+ exports.webAuthnGlobalPrivateRouter.post('/auth/verify-registration', (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-register'));
97
+ // Generate sign-in challenge
49
98
  exports.webAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async (context, next) => {
50
99
  const rpID = context.hostname;
51
100
  const options = await (0, server_1.generateAuthenticationOptions)({
@@ -55,14 +104,15 @@ exports.webAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async
55
104
  context.session.challenge = options.challenge;
56
105
  context.body = options;
57
106
  });
58
- exports.webAuthnGlobalPublicRouter.post('/auth/signin-webauthn', (0, webauthn_middleware_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
107
+ // Sign in with biometric authentication
108
+ exports.webAuthnGlobalPublicRouter.post('/auth/signin-webauthn', (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
59
109
  const { domain, user } = context.state;
60
110
  const { request } = context;
61
111
  const { body: reqBody } = request;
62
112
  const token = await user.sign({ subdomain: domain === null || domain === void 0 ? void 0 : domain.subdomain });
63
- (0, access_token_cookie_1.setAccessTokenCookie)(context, token);
113
+ (0, access_token_cookie_js_1.setAccessTokenCookie)(context, token);
64
114
  var redirectURL = `/auth/checkin${domain ? '/' + domain.subdomain : ''}?redirect_to=${encodeURIComponent(reqBody.redirectTo || '/')}`;
65
- /* 2단계 인터렉션 때문에 브라우저에서 fetch(...) 진행될 것이므로, redirect(3xx) 응답으로 처리할 없다. 따라서, 데이타로 redirectURL를 응답한다. */
115
+ /* Due to the two-step interaction, it will be processed by fetch(...) in the browser, so it cannot be handled with a redirect(3xx) response. Therefore, respond with redirectURL as data. */
66
116
  context.body = { redirectURL, verified: true };
67
117
  await next();
68
118
  });