@things-factory/auth-base 9.0.0-beta.0 → 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 (332) 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 -4
  10. package/dist-client/index.js +4 -4
  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-server/controllers/auth.d.ts +5 -5
  18. package/dist-server/controllers/auth.js +5 -5
  19. package/dist-server/controllers/auth.js.map +1 -1
  20. package/dist-server/controllers/change-pwd.js +19 -19
  21. package/dist-server/controllers/change-pwd.js.map +1 -1
  22. package/dist-server/controllers/checkin.js +4 -4
  23. package/dist-server/controllers/checkin.js.map +1 -1
  24. package/dist-server/controllers/delete-user.js +9 -9
  25. package/dist-server/controllers/delete-user.js.map +1 -1
  26. package/dist-server/controllers/invitation.js +19 -19
  27. package/dist-server/controllers/invitation.js.map +1 -1
  28. package/dist-server/controllers/profile.d.ts +5 -5
  29. package/dist-server/controllers/profile.js +10 -10
  30. package/dist-server/controllers/profile.js.map +1 -1
  31. package/dist-server/controllers/reset-password.js +24 -24
  32. package/dist-server/controllers/reset-password.js.map +1 -1
  33. package/dist-server/controllers/signin.d.ts +1 -1
  34. package/dist-server/controllers/signin.js +24 -24
  35. package/dist-server/controllers/signin.js.map +1 -1
  36. package/dist-server/controllers/signup.d.ts +1 -1
  37. package/dist-server/controllers/signup.js +13 -13
  38. package/dist-server/controllers/signup.js.map +1 -1
  39. package/dist-server/controllers/unlock-user.js +17 -17
  40. package/dist-server/controllers/unlock-user.js.map +1 -1
  41. package/dist-server/controllers/utils/password-rule.js +4 -4
  42. package/dist-server/controllers/utils/password-rule.js.map +1 -1
  43. package/dist-server/controllers/utils/save-invitation-token.d.ts +1 -1
  44. package/dist-server/controllers/utils/save-invitation-token.js +2 -2
  45. package/dist-server/controllers/utils/save-invitation-token.js.map +1 -1
  46. package/dist-server/controllers/utils/save-verification-token.d.ts +1 -1
  47. package/dist-server/controllers/utils/save-verification-token.js +3 -3
  48. package/dist-server/controllers/utils/save-verification-token.js.map +1 -1
  49. package/dist-server/controllers/verification.js +23 -23
  50. package/dist-server/controllers/verification.js.map +1 -1
  51. package/dist-server/errors/auth-error.js +1 -1
  52. package/dist-server/errors/auth-error.js.map +1 -1
  53. package/dist-server/errors/index.d.ts +2 -2
  54. package/dist-server/errors/index.js +2 -2
  55. package/dist-server/errors/index.js.map +1 -1
  56. package/dist-server/errors/user-domain-not-match-error.d.ts +1 -1
  57. package/dist-server/errors/user-domain-not-match-error.js +8 -8
  58. package/dist-server/errors/user-domain-not-match-error.js.map +1 -1
  59. package/dist-server/index.d.ts +16 -16
  60. package/dist-server/index.js +18 -18
  61. package/dist-server/index.js.map +1 -1
  62. package/dist-server/middlewares/authenticate-401-middleware.js +11 -11
  63. package/dist-server/middlewares/authenticate-401-middleware.js.map +1 -1
  64. package/dist-server/middlewares/domain-authenticate-middleware.d.ts +1 -1
  65. package/dist-server/middlewares/domain-authenticate-middleware.js +9 -9
  66. package/dist-server/middlewares/domain-authenticate-middleware.js.map +1 -1
  67. package/dist-server/middlewares/graphql-authenticate-middleware.js +4 -4
  68. package/dist-server/middlewares/graphql-authenticate-middleware.js.map +1 -1
  69. package/dist-server/middlewares/index.d.ts +5 -5
  70. package/dist-server/middlewares/index.js +18 -18
  71. package/dist-server/middlewares/index.js.map +1 -1
  72. package/dist-server/middlewares/jwt-authenticate-middleware.js +15 -15
  73. package/dist-server/middlewares/jwt-authenticate-middleware.js.map +1 -1
  74. package/dist-server/middlewares/signin-middleware.js +2 -6
  75. package/dist-server/middlewares/signin-middleware.js.map +1 -1
  76. package/dist-server/middlewares/verify-recaptcha-middleware.d.ts +3 -0
  77. package/dist-server/middlewares/verify-recaptcha-middleware.js +95 -0
  78. package/dist-server/middlewares/verify-recaptcha-middleware.js.map +1 -0
  79. package/dist-server/middlewares/webauthn-middleware.js +16 -13
  80. package/dist-server/middlewares/webauthn-middleware.js.map +1 -1
  81. package/dist-server/migrations/1548206416130-SeedUser.js +6 -6
  82. package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
  83. package/dist-server/migrations/1566805283882-SeedPrivilege.js +2 -2
  84. package/dist-server/migrations/1566805283882-SeedPrivilege.js.map +1 -1
  85. package/dist-server/migrations/index.js.map +1 -1
  86. package/dist-server/router/auth-checkin-router.js +10 -10
  87. package/dist-server/router/auth-checkin-router.js.map +1 -1
  88. package/dist-server/router/auth-private-process-router.js +15 -15
  89. package/dist-server/router/auth-private-process-router.js.map +1 -1
  90. package/dist-server/router/auth-public-process-router.js +30 -30
  91. package/dist-server/router/auth-public-process-router.js.map +1 -1
  92. package/dist-server/router/auth-signin-router.js +12 -6
  93. package/dist-server/router/auth-signin-router.js.map +1 -1
  94. package/dist-server/router/auth-signup-router.js +13 -9
  95. package/dist-server/router/auth-signup-router.js.map +1 -1
  96. package/dist-server/router/index.d.ts +9 -9
  97. package/dist-server/router/index.js +9 -9
  98. package/dist-server/router/index.js.map +1 -1
  99. package/dist-server/router/oauth2/index.d.ts +2 -2
  100. package/dist-server/router/oauth2/index.js +2 -2
  101. package/dist-server/router/oauth2/index.js.map +1 -1
  102. package/dist-server/router/oauth2/oauth2-authorize-router.js +6 -6
  103. package/dist-server/router/oauth2/oauth2-authorize-router.js.map +1 -1
  104. package/dist-server/router/oauth2/oauth2-router.d.ts +1 -1
  105. package/dist-server/router/oauth2/oauth2-router.js +21 -21
  106. package/dist-server/router/oauth2/oauth2-router.js.map +1 -1
  107. package/dist-server/router/oauth2/oauth2-server.js +21 -21
  108. package/dist-server/router/oauth2/oauth2-server.js.map +1 -1
  109. package/dist-server/router/site-root-router.js +4 -4
  110. package/dist-server/router/site-root-router.js.map +1 -1
  111. package/dist-server/router/webauthn-router.js +9 -9
  112. package/dist-server/router/webauthn-router.js.map +1 -1
  113. package/dist-server/routes.js +19 -19
  114. package/dist-server/routes.js.map +1 -1
  115. package/dist-server/service/app-binding/app-binding-mutation.js +4 -4
  116. package/dist-server/service/app-binding/app-binding-mutation.js.map +1 -1
  117. package/dist-server/service/app-binding/app-binding-query.d.ts +4 -4
  118. package/dist-server/service/app-binding/app-binding-query.js +22 -22
  119. package/dist-server/service/app-binding/app-binding-query.js.map +1 -1
  120. package/dist-server/service/app-binding/app-binding-types.d.ts +1 -1
  121. package/dist-server/service/app-binding/app-binding-types.js +2 -2
  122. package/dist-server/service/app-binding/app-binding-types.js.map +1 -1
  123. package/dist-server/service/app-binding/app-binding.d.ts +2 -2
  124. package/dist-server/service/app-binding/app-binding.js +4 -4
  125. package/dist-server/service/app-binding/app-binding.js.map +1 -1
  126. package/dist-server/service/app-binding/index.d.ts +2 -2
  127. package/dist-server/service/app-binding/index.js +3 -3
  128. package/dist-server/service/app-binding/index.js.map +1 -1
  129. package/dist-server/service/appliance/appliance-mutation.d.ts +2 -2
  130. package/dist-server/service/appliance/appliance-mutation.js +21 -21
  131. package/dist-server/service/appliance/appliance-mutation.js.map +1 -1
  132. package/dist-server/service/appliance/appliance-query.d.ts +3 -3
  133. package/dist-server/service/appliance/appliance-query.js +17 -17
  134. package/dist-server/service/appliance/appliance-query.js.map +1 -1
  135. package/dist-server/service/appliance/appliance-types.d.ts +1 -1
  136. package/dist-server/service/appliance/appliance-types.js +2 -2
  137. package/dist-server/service/appliance/appliance-types.js.map +1 -1
  138. package/dist-server/service/appliance/appliance.d.ts +1 -1
  139. package/dist-server/service/appliance/appliance.js +8 -8
  140. package/dist-server/service/appliance/appliance.js.map +1 -1
  141. package/dist-server/service/appliance/index.d.ts +3 -3
  142. package/dist-server/service/appliance/index.js +5 -5
  143. package/dist-server/service/appliance/index.js.map +1 -1
  144. package/dist-server/service/application/application-mutation.d.ts +8 -8
  145. package/dist-server/service/application/application-mutation.js +20 -20
  146. package/dist-server/service/application/application-mutation.js.map +1 -1
  147. package/dist-server/service/application/application-query.d.ts +2 -2
  148. package/dist-server/service/application/application-query.js +16 -16
  149. package/dist-server/service/application/application-query.js.map +1 -1
  150. package/dist-server/service/application/application-types.d.ts +1 -1
  151. package/dist-server/service/application/application-types.js +4 -4
  152. package/dist-server/service/application/application-types.js.map +1 -1
  153. package/dist-server/service/application/application.d.ts +1 -1
  154. package/dist-server/service/application/application.js +12 -12
  155. package/dist-server/service/application/application.js.map +1 -1
  156. package/dist-server/service/application/index.d.ts +3 -3
  157. package/dist-server/service/application/index.js +5 -5
  158. package/dist-server/service/application/index.js.map +1 -1
  159. package/dist-server/service/auth-provider/auth-provider-mutation.d.ts +2 -2
  160. package/dist-server/service/auth-provider/auth-provider-mutation.js +20 -20
  161. package/dist-server/service/auth-provider/auth-provider-mutation.js.map +1 -1
  162. package/dist-server/service/auth-provider/auth-provider-query.d.ts +3 -3
  163. package/dist-server/service/auth-provider/auth-provider-query.js +20 -20
  164. package/dist-server/service/auth-provider/auth-provider-query.js.map +1 -1
  165. package/dist-server/service/auth-provider/auth-provider-type.d.ts +1 -1
  166. package/dist-server/service/auth-provider/auth-provider-type.js +2 -2
  167. package/dist-server/service/auth-provider/auth-provider-type.js.map +1 -1
  168. package/dist-server/service/auth-provider/auth-provider.d.ts +3 -3
  169. package/dist-server/service/auth-provider/auth-provider.js +12 -12
  170. package/dist-server/service/auth-provider/auth-provider.js.map +1 -1
  171. package/dist-server/service/auth-provider/index.d.ts +3 -3
  172. package/dist-server/service/auth-provider/index.js +5 -5
  173. package/dist-server/service/auth-provider/index.js.map +1 -1
  174. package/dist-server/service/domain-generator/domain-generator-mutation.d.ts +1 -1
  175. package/dist-server/service/domain-generator/domain-generator-mutation.js +11 -11
  176. package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
  177. package/dist-server/service/domain-generator/domain-generator-types.d.ts +1 -1
  178. package/dist-server/service/domain-generator/domain-generator-types.js +3 -3
  179. package/dist-server/service/domain-generator/domain-generator-types.js.map +1 -1
  180. package/dist-server/service/domain-generator/index.d.ts +1 -1
  181. package/dist-server/service/domain-generator/index.js +2 -2
  182. package/dist-server/service/domain-generator/index.js.map +1 -1
  183. package/dist-server/service/granted-role/granted-role-mutation.d.ts +3 -3
  184. package/dist-server/service/granted-role/granted-role-mutation.js +17 -17
  185. package/dist-server/service/granted-role/granted-role-mutation.js.map +1 -1
  186. package/dist-server/service/granted-role/granted-role-query.d.ts +2 -2
  187. package/dist-server/service/granted-role/granted-role-query.js +13 -13
  188. package/dist-server/service/granted-role/granted-role-query.js.map +1 -1
  189. package/dist-server/service/granted-role/granted-role.d.ts +1 -1
  190. package/dist-server/service/granted-role/granted-role.js +3 -3
  191. package/dist-server/service/granted-role/granted-role.js.map +1 -1
  192. package/dist-server/service/granted-role/index.d.ts +3 -3
  193. package/dist-server/service/granted-role/index.js +5 -5
  194. package/dist-server/service/granted-role/index.js.map +1 -1
  195. package/dist-server/service/index.d.ts +25 -25
  196. package/dist-server/service/index.js +70 -70
  197. package/dist-server/service/index.js.map +1 -1
  198. package/dist-server/service/invitation/index.d.ts +3 -3
  199. package/dist-server/service/invitation/index.js +5 -5
  200. package/dist-server/service/invitation/index.js.map +1 -1
  201. package/dist-server/service/invitation/invitation-mutation.d.ts +2 -2
  202. package/dist-server/service/invitation/invitation-mutation.js +10 -10
  203. package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
  204. package/dist-server/service/invitation/invitation-query.d.ts +1 -1
  205. package/dist-server/service/invitation/invitation-query.js +7 -7
  206. package/dist-server/service/invitation/invitation-query.js.map +1 -1
  207. package/dist-server/service/invitation/invitation-types.d.ts +1 -1
  208. package/dist-server/service/invitation/invitation-types.js +2 -2
  209. package/dist-server/service/invitation/invitation-types.js.map +1 -1
  210. package/dist-server/service/invitation/invitation.d.ts +1 -1
  211. package/dist-server/service/invitation/invitation.js +5 -5
  212. package/dist-server/service/invitation/invitation.js.map +1 -1
  213. package/dist-server/service/login-history/index.d.ts +2 -2
  214. package/dist-server/service/login-history/index.js +4 -4
  215. package/dist-server/service/login-history/index.js.map +1 -1
  216. package/dist-server/service/login-history/login-history-query.d.ts +3 -3
  217. package/dist-server/service/login-history/login-history-query.js +11 -11
  218. package/dist-server/service/login-history/login-history-query.js.map +1 -1
  219. package/dist-server/service/login-history/login-history-type.d.ts +1 -1
  220. package/dist-server/service/login-history/login-history-type.js +2 -2
  221. package/dist-server/service/login-history/login-history-type.js.map +1 -1
  222. package/dist-server/service/login-history/login-history.d.ts +1 -1
  223. package/dist-server/service/login-history/login-history.js +4 -4
  224. package/dist-server/service/login-history/login-history.js.map +1 -1
  225. package/dist-server/service/partner/index.d.ts +3 -3
  226. package/dist-server/service/partner/index.js +5 -5
  227. package/dist-server/service/partner/index.js.map +1 -1
  228. package/dist-server/service/partner/partner-mutation.js +8 -8
  229. package/dist-server/service/partner/partner-mutation.js.map +1 -1
  230. package/dist-server/service/partner/partner-query.d.ts +3 -3
  231. package/dist-server/service/partner/partner-query.js +17 -17
  232. package/dist-server/service/partner/partner-query.js.map +1 -1
  233. package/dist-server/service/partner/partner-types.d.ts +1 -1
  234. package/dist-server/service/partner/partner-types.js +2 -2
  235. package/dist-server/service/partner/partner-types.js.map +1 -1
  236. package/dist-server/service/partner/partner.d.ts +1 -1
  237. package/dist-server/service/partner/partner.js +5 -5
  238. package/dist-server/service/partner/partner.js.map +1 -1
  239. package/dist-server/service/password-history/index.d.ts +1 -1
  240. package/dist-server/service/password-history/index.js +2 -2
  241. package/dist-server/service/password-history/index.js.map +1 -1
  242. package/dist-server/service/privilege/index.d.ts +3 -3
  243. package/dist-server/service/privilege/index.js +5 -5
  244. package/dist-server/service/privilege/index.js.map +1 -1
  245. package/dist-server/service/privilege/privilege-directive.js +2 -2
  246. package/dist-server/service/privilege/privilege-directive.js.map +1 -1
  247. package/dist-server/service/privilege/privilege-mutation.d.ts +2 -2
  248. package/dist-server/service/privilege/privilege-mutation.js +15 -15
  249. package/dist-server/service/privilege/privilege-mutation.js.map +1 -1
  250. package/dist-server/service/privilege/privilege-query.d.ts +4 -4
  251. package/dist-server/service/privilege/privilege-query.js +20 -20
  252. package/dist-server/service/privilege/privilege-query.js.map +1 -1
  253. package/dist-server/service/privilege/privilege-types.d.ts +1 -1
  254. package/dist-server/service/privilege/privilege-types.js +2 -2
  255. package/dist-server/service/privilege/privilege-types.js.map +1 -1
  256. package/dist-server/service/privilege/privilege.d.ts +2 -2
  257. package/dist-server/service/privilege/privilege.js +10 -10
  258. package/dist-server/service/privilege/privilege.js.map +1 -1
  259. package/dist-server/service/role/index.d.ts +3 -3
  260. package/dist-server/service/role/index.js +5 -5
  261. package/dist-server/service/role/index.js.map +1 -1
  262. package/dist-server/service/role/role-mutation.d.ts +2 -2
  263. package/dist-server/service/role/role-mutation.js +19 -19
  264. package/dist-server/service/role/role-mutation.js.map +1 -1
  265. package/dist-server/service/role/role-query.d.ts +4 -4
  266. package/dist-server/service/role/role-query.js +29 -29
  267. package/dist-server/service/role/role-query.js.map +1 -1
  268. package/dist-server/service/role/role-types.d.ts +1 -1
  269. package/dist-server/service/role/role-types.js +2 -2
  270. package/dist-server/service/role/role-types.js.map +1 -1
  271. package/dist-server/service/role/role.d.ts +2 -2
  272. package/dist-server/service/role/role.js +12 -12
  273. package/dist-server/service/role/role.js.map +1 -1
  274. package/dist-server/service/user/domain-query.d.ts +1 -1
  275. package/dist-server/service/user/domain-query.js +3 -3
  276. package/dist-server/service/user/domain-query.js.map +1 -1
  277. package/dist-server/service/user/index.d.ts +4 -4
  278. package/dist-server/service/user/index.js +6 -6
  279. package/dist-server/service/user/index.js.map +1 -1
  280. package/dist-server/service/user/user-mutation.d.ts +3 -3
  281. package/dist-server/service/user/user-mutation.js +42 -42
  282. package/dist-server/service/user/user-mutation.js.map +1 -1
  283. package/dist-server/service/user/user-query.d.ts +3 -3
  284. package/dist-server/service/user/user-query.js +21 -21
  285. package/dist-server/service/user/user-query.js.map +1 -1
  286. package/dist-server/service/user/user-types.d.ts +1 -1
  287. package/dist-server/service/user/user-types.js +2 -2
  288. package/dist-server/service/user/user-types.js.map +1 -1
  289. package/dist-server/service/user/user.d.ts +3 -3
  290. package/dist-server/service/user/user.js +40 -40
  291. package/dist-server/service/user/user.js.map +1 -1
  292. package/dist-server/service/users-auth-providers/index.d.ts +1 -1
  293. package/dist-server/service/users-auth-providers/index.js +2 -2
  294. package/dist-server/service/users-auth-providers/index.js.map +1 -1
  295. package/dist-server/service/users-auth-providers/users-auth-providers.d.ts +2 -2
  296. package/dist-server/service/users-auth-providers/users-auth-providers.js +8 -8
  297. package/dist-server/service/users-auth-providers/users-auth-providers.js.map +1 -1
  298. package/dist-server/service/verification-token/index.d.ts +1 -1
  299. package/dist-server/service/verification-token/index.js +2 -2
  300. package/dist-server/service/verification-token/index.js.map +1 -1
  301. package/dist-server/service/web-auth-credential/index.d.ts +1 -1
  302. package/dist-server/service/web-auth-credential/index.js +2 -2
  303. package/dist-server/service/web-auth-credential/index.js.map +1 -1
  304. package/dist-server/service/web-auth-credential/web-auth-credential.d.ts +1 -1
  305. package/dist-server/service/web-auth-credential/web-auth-credential.js +10 -10
  306. package/dist-server/service/web-auth-credential/web-auth-credential.js.map +1 -1
  307. package/dist-server/tsconfig.tsbuildinfo +1 -1
  308. package/dist-server/types.d.ts +1 -1
  309. package/dist-server/types.js.map +1 -1
  310. package/dist-server/utils/access-token-cookie.js +2 -2
  311. package/dist-server/utils/access-token-cookie.js.map +1 -1
  312. package/dist-server/utils/check-permission.d.ts +2 -2
  313. package/dist-server/utils/check-permission.js +3 -3
  314. package/dist-server/utils/check-permission.js.map +1 -1
  315. package/dist-server/utils/check-user-belongs-domain.d.ts +1 -1
  316. package/dist-server/utils/check-user-belongs-domain.js +2 -2
  317. package/dist-server/utils/check-user-belongs-domain.js.map +1 -1
  318. package/dist-server/utils/check-user-has-role.d.ts +1 -1
  319. package/dist-server/utils/check-user-has-role.js +2 -2
  320. package/dist-server/utils/check-user-has-role.js.map +1 -1
  321. package/dist-server/utils/get-domain-users.d.ts +1 -1
  322. package/dist-server/utils/get-domain-users.js +2 -2
  323. package/dist-server/utils/get-domain-users.js.map +1 -1
  324. package/dist-server/utils/get-user-domains.d.ts +1 -1
  325. package/dist-server/utils/get-user-domains.js +4 -4
  326. package/dist-server/utils/get-user-domains.js.map +1 -1
  327. package/helps/config/recaptcha.ja.md +49 -0
  328. package/helps/config/recaptcha.ko.md +49 -0
  329. package/helps/config/recaptcha.md +49 -0
  330. package/helps/config/recaptcha.ms.md +49 -0
  331. package/helps/config/recaptcha.zh.md +49 -0
  332. package/package.json +9 -8
@@ -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,9 +6,9 @@ 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;
@@ -21,7 +21,7 @@ exports.webAuthnGlobalPrivateRouter.get('/auth/verify-webauthn/challenge', async
21
21
  context.body = { error: 'User not authenticated' };
22
22
  return;
23
23
  }
24
- const webAuthCredentials = await (0, shell_1.getRepository)(web_auth_credential_1.WebAuthCredential).find({
24
+ const webAuthCredentials = await (0, shell_1.getRepository)(web_auth_credential_js_1.WebAuthCredential).find({
25
25
  where: { user: { id: user.id } }
26
26
  });
27
27
  if (webAuthCredentials.length === 0) {
@@ -43,7 +43,7 @@ exports.webAuthnGlobalPrivateRouter.get('/auth/verify-webauthn/challenge', async
43
43
  // Verify biometric authentication
44
44
  exports.webAuthnGlobalPrivateRouter.post('/auth/verify-webauthn',
45
45
  /* reuse webauthn-login as webauthn-verify strategy */
46
- (0, webauthn_middleware_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
46
+ (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
47
47
  const { user } = context.state;
48
48
  const { request } = context;
49
49
  const { body: reqBody } = request;
@@ -62,7 +62,7 @@ exports.webAuthnGlobalPrivateRouter.post('/auth/verify-webauthn',
62
62
  exports.webAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', async (context, next) => {
63
63
  const { user } = context.state;
64
64
  const rpID = context.hostname;
65
- 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({
66
66
  where: {
67
67
  user: { id: user.id }
68
68
  }
@@ -93,7 +93,7 @@ exports.webAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', asy
93
93
  context.body = options;
94
94
  });
95
95
  // Verify registration
96
- exports.webAuthnGlobalPrivateRouter.post('/auth/verify-registration', (0, webauthn_middleware_1.createWebAuthnMiddleware)('webauthn-register'));
96
+ exports.webAuthnGlobalPrivateRouter.post('/auth/verify-registration', (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-register'));
97
97
  // Generate sign-in challenge
98
98
  exports.webAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async (context, next) => {
99
99
  const rpID = context.hostname;
@@ -105,12 +105,12 @@ exports.webAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async
105
105
  context.body = options;
106
106
  });
107
107
  // Sign in with biometric authentication
108
- exports.webAuthnGlobalPublicRouter.post('/auth/signin-webauthn', (0, webauthn_middleware_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
108
+ exports.webAuthnGlobalPublicRouter.post('/auth/signin-webauthn', (0, webauthn_middleware_js_1.createWebAuthnMiddleware)('webauthn-login'), async (context, next) => {
109
109
  const { domain, user } = context.state;
110
110
  const { request } = context;
111
111
  const { body: reqBody } = request;
112
112
  const token = await user.sign({ subdomain: domain === null || domain === void 0 ? void 0 : domain.subdomain });
113
- (0, access_token_cookie_1.setAccessTokenCookie)(context, token);
113
+ (0, access_token_cookie_js_1.setAccessTokenCookie)(context, token);
114
114
  var redirectURL = `/auth/checkin${domain ? '/' + domain.subdomain : ''}?redirect_to=${encodeURIComponent(reqBody.redirectTo || '/')}`;
115
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. */
116
116
  context.body = { redirectURL, verified: true };
@@ -1 +1 @@
1
- {"version":3,"file":"webauthn-router.js","sourceRoot":"","sources":["../../server/router/webauthn-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport { getRepository } from '@things-factory/shell'\nimport { appPackage } from '@things-factory/env'\n\nimport { generateRegistrationOptions, generateAuthenticationOptions } from '@simplewebauthn/server'\n\nimport { WebAuthCredential } from '../service/web-auth-credential/web-auth-credential'\nimport { PublicKeyCredentialCreationOptionsJSON } from '@simplewebauthn/server/script/deps'\nimport { setAccessTokenCookie } from '../utils/access-token-cookie'\nimport { createWebAuthnMiddleware } from '../middlewares/webauthn-middleware'\n\nexport const webAuthnGlobalPublicRouter = new Router()\nexport const webAuthnGlobalPrivateRouter = new Router()\n\nconst { name: rpName } = appPackage as any\n\n// Generate authentication challenge for the currently logged-in user\nwebAuthnGlobalPrivateRouter.get('/auth/verify-webauthn/challenge', async (context, next) => {\n const { user } = context.state\n const rpID = context.hostname\n\n if (!user) {\n context.status = 401\n context.body = { error: 'User not authenticated' }\n return\n }\n\n const webAuthCredentials = await getRepository(WebAuthCredential).find({\n where: { user: { id: user.id } }\n })\n\n if (webAuthCredentials.length === 0) {\n context.status = 400\n context.body = { error: 'No biometric credentials registered for this user' }\n return\n }\n\n const options = await generateAuthenticationOptions({\n rpID,\n userVerification: 'preferred',\n allowCredentials: webAuthCredentials.map(credential => ({\n id: credential.credentialId,\n type: 'public-key'\n }))\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Verify biometric authentication\nwebAuthnGlobalPrivateRouter.post(\n '/auth/verify-webauthn',\n /* reuse webauthn-login as webauthn-verify strategy */\n createWebAuthnMiddleware('webauthn-login'),\n async (context, next) => {\n const { user } = context.state\n const { request } = context\n const { body: reqBody } = request\n\n if (!user) {\n context.status = 401\n context.body = { verified: false, message: 'User not authenticated' }\n return\n }\n\n context.body = {\n verified: true,\n message: 'Biometric authentication successful'\n }\n\n await next()\n }\n)\n\n// Generate registration challenge for the currently logged-in user\nwebAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', async (context, next) => {\n const { user } = context.state\n const rpID = context.hostname\n\n const webAuthCredentials = await getRepository(WebAuthCredential).find({\n where: {\n user: { id: user.id }\n }\n })\n\n const options: PublicKeyCredentialCreationOptionsJSON = await generateRegistrationOptions({\n rpName,\n rpID,\n userName: user.email,\n userDisplayName: user.name,\n // Don't prompt users for additional information about the authenticator\n // (Recommended for smoother UX)\n attestationType: 'none',\n // Prevent users from re-registering existing authenticators\n excludeCredentials: webAuthCredentials.map(credential => ({\n id: credential.credentialId\n // Optional\n // transports: credential.transports\n })),\n authenticatorSelection: {\n // Defaults\n residentKey: 'preferred',\n userVerification: 'preferred',\n // Optional\n authenticatorAttachment: 'platform'\n }\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Verify registration\nwebAuthnGlobalPrivateRouter.post('/auth/verify-registration', createWebAuthnMiddleware('webauthn-register'))\n\n// Generate sign-in challenge\nwebAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async (context, next) => {\n const rpID = context.hostname\n\n const options = await generateAuthenticationOptions({\n rpID,\n userVerification: 'preferred'\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Sign in with biometric authentication\nwebAuthnGlobalPublicRouter.post(\n '/auth/signin-webauthn',\n createWebAuthnMiddleware('webauthn-login'),\n async (context, next) => {\n const { domain, user } = context.state\n const { request } = context\n const { body: reqBody } = request\n\n const token = await user.sign({ subdomain: domain?.subdomain })\n setAccessTokenCookie(context, token)\n\n var redirectURL = `/auth/checkin${domain ? '/' + domain.subdomain : ''}?redirect_to=${encodeURIComponent(reqBody.redirectTo || '/')}`\n\n /* 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. */\n context.body = { redirectURL, verified: true }\n\n await next()\n }\n)\n"]}
1
+ {"version":3,"file":"webauthn-router.js","sourceRoot":"","sources":["../../server/router/webauthn-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport { getRepository } from '@things-factory/shell'\nimport { appPackage } from '@things-factory/env'\n\nimport {\n PublicKeyCredentialCreationOptionsJSON,\n generateRegistrationOptions,\n generateAuthenticationOptions\n} from '@simplewebauthn/server'\n\nimport { WebAuthCredential } from '../service/web-auth-credential/web-auth-credential.js'\nimport { setAccessTokenCookie } from '../utils/access-token-cookie.js'\nimport { createWebAuthnMiddleware } from '../middlewares/webauthn-middleware.js'\n\nexport const webAuthnGlobalPublicRouter = new Router()\nexport const webAuthnGlobalPrivateRouter = new Router()\n\nconst { name: rpName } = appPackage as any\n\n// Generate authentication challenge for the currently logged-in user\nwebAuthnGlobalPrivateRouter.get('/auth/verify-webauthn/challenge', async (context, next) => {\n const { user } = context.state\n const rpID = context.hostname\n\n if (!user) {\n context.status = 401\n context.body = { error: 'User not authenticated' }\n return\n }\n\n const webAuthCredentials = await getRepository(WebAuthCredential).find({\n where: { user: { id: user.id } }\n })\n\n if (webAuthCredentials.length === 0) {\n context.status = 400\n context.body = { error: 'No biometric credentials registered for this user' }\n return\n }\n\n const options = await generateAuthenticationOptions({\n rpID,\n userVerification: 'preferred',\n allowCredentials: webAuthCredentials.map(credential => ({\n id: credential.credentialId,\n type: 'public-key'\n }))\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Verify biometric authentication\nwebAuthnGlobalPrivateRouter.post(\n '/auth/verify-webauthn',\n /* reuse webauthn-login as webauthn-verify strategy */\n createWebAuthnMiddleware('webauthn-login'),\n async (context, next) => {\n const { user } = context.state\n const { request } = context\n const { body: reqBody } = request\n\n if (!user) {\n context.status = 401\n context.body = { verified: false, message: 'User not authenticated' }\n return\n }\n\n context.body = {\n verified: true,\n message: 'Biometric authentication successful'\n }\n\n await next()\n }\n)\n\n// Generate registration challenge for the currently logged-in user\nwebAuthnGlobalPrivateRouter.get('/auth/register-webauthn/challenge', async (context, next) => {\n const { user } = context.state\n const rpID = context.hostname\n\n const webAuthCredentials = await getRepository(WebAuthCredential).find({\n where: {\n user: { id: user.id }\n }\n })\n\n const options: PublicKeyCredentialCreationOptionsJSON = await generateRegistrationOptions({\n rpName,\n rpID,\n userName: user.email,\n userDisplayName: user.name,\n // Don't prompt users for additional information about the authenticator\n // (Recommended for smoother UX)\n attestationType: 'none',\n // Prevent users from re-registering existing authenticators\n excludeCredentials: webAuthCredentials.map(credential => ({\n id: credential.credentialId\n // Optional\n // transports: credential.transports\n })),\n authenticatorSelection: {\n // Defaults\n residentKey: 'preferred',\n userVerification: 'preferred',\n // Optional\n authenticatorAttachment: 'platform'\n }\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Verify registration\nwebAuthnGlobalPrivateRouter.post('/auth/verify-registration', createWebAuthnMiddleware('webauthn-register'))\n\n// Generate sign-in challenge\nwebAuthnGlobalPublicRouter.get('/auth/signin-webauthn/challenge', async (context, next) => {\n const rpID = context.hostname\n\n const options = await generateAuthenticationOptions({\n rpID,\n userVerification: 'preferred'\n })\n\n context.session.challenge = options.challenge\n context.body = options\n})\n\n// Sign in with biometric authentication\nwebAuthnGlobalPublicRouter.post(\n '/auth/signin-webauthn',\n createWebAuthnMiddleware('webauthn-login'),\n async (context, next) => {\n const { domain, user } = context.state\n const { request } = context\n const { body: reqBody } = request\n\n const token = await user.sign({ subdomain: domain?.subdomain })\n setAccessTokenCookie(context, token)\n\n var redirectURL = `/auth/checkin${domain ? '/' + domain.subdomain : ''}?redirect_to=${encodeURIComponent(reqBody.redirectTo || '/')}`\n\n /* 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. */\n context.body = { redirectURL, verified: true }\n\n await next()\n }\n)\n"]}
@@ -1,48 +1,48 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const env_1 = require("@things-factory/env");
4
- const middlewares_1 = require("./middlewares");
5
- const router_1 = require("./router");
6
- const access_token_cookie_1 = require("./utils/access-token-cookie");
4
+ const index_js_1 = require("./middlewares/index.js");
5
+ const index_js_2 = require("./router/index.js");
6
+ const access_token_cookie_js_1 = require("./utils/access-token-cookie.js");
7
7
  const isPathBaseDomain = !env_1.config.get('subdomain') && !env_1.config.get('useVirtualHostBasedDomain');
8
8
  process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) => {
9
- globalPublicRouter.use(router_1.siteRootRouter.routes(), router_1.siteRootRouter.allowedMethods());
10
- globalPublicRouter.use(router_1.authPublicProcessRouter.routes(), router_1.authPublicProcessRouter.allowedMethods());
9
+ globalPublicRouter.use(index_js_2.siteRootRouter.routes(), index_js_2.siteRootRouter.allowedMethods());
10
+ globalPublicRouter.use(index_js_2.authPublicProcessRouter.routes(), index_js_2.authPublicProcessRouter.allowedMethods());
11
11
  /* ssoMiddleware가 정의되어있다면, /auth/sso-signin 패스를 활성화한다. */
12
12
  if (app.ssoMiddlewares.length > 0) {
13
- router_1.authSigninRouter.get('/auth/sso-signin', app.ssoMiddlewares[0], async (context) => {
13
+ index_js_2.authSigninRouter.get('/auth/sso-signin', app.ssoMiddlewares[0], async (context) => {
14
14
  const { user } = context.state;
15
15
  const token = await user.sign();
16
- (0, access_token_cookie_1.setAccessTokenCookie)(context, token);
16
+ (0, access_token_cookie_js_1.setAccessTokenCookie)(context, token);
17
17
  context.redirect('/auth/checkin');
18
18
  });
19
19
  }
20
20
  });
21
21
  process.on('bootstrap-module-global-private-route', (app, globalPrivateRouter) => {
22
- globalPrivateRouter.use(middlewares_1.jwtAuthenticateMiddleware);
22
+ globalPrivateRouter.use(index_js_1.jwtAuthenticateMiddleware);
23
23
  /* globalPrivateRouter based nested-routers */
24
- globalPrivateRouter.use(router_1.authCheckinRouter.routes(), router_1.authCheckinRouter.allowedMethods());
25
- globalPrivateRouter.use(router_1.authPrivateProcessRouter.routes(), router_1.authPrivateProcessRouter.allowedMethods());
26
- globalPrivateRouter.use(router_1.webAuthnGlobalPrivateRouter.routes(), router_1.webAuthnGlobalPrivateRouter.allowedMethods());
24
+ globalPrivateRouter.use(index_js_2.authCheckinRouter.routes(), index_js_2.authCheckinRouter.allowedMethods());
25
+ globalPrivateRouter.use(index_js_2.authPrivateProcessRouter.routes(), index_js_2.authPrivateProcessRouter.allowedMethods());
26
+ globalPrivateRouter.use(index_js_2.webAuthnGlobalPrivateRouter.routes(), index_js_2.webAuthnGlobalPrivateRouter.allowedMethods());
27
27
  });
28
28
  process.on('bootstrap-module-domain-public-route', (app, domainPublicRouter) => {
29
29
  /* domainPublicRouter based nested-routers */
30
- domainPublicRouter.use(router_1.authSigninRouter.routes(), router_1.authSigninRouter.allowedMethods());
31
- domainPublicRouter.use(router_1.authSignupRouter.routes(), router_1.authSignupRouter.allowedMethods());
32
- domainPublicRouter.use(router_1.webAuthnGlobalPublicRouter.routes(), router_1.webAuthnGlobalPublicRouter.allowedMethods());
30
+ domainPublicRouter.use(index_js_2.authSigninRouter.routes(), index_js_2.authSigninRouter.allowedMethods());
31
+ domainPublicRouter.use(index_js_2.authSignupRouter.routes(), index_js_2.authSignupRouter.allowedMethods());
32
+ domainPublicRouter.use(index_js_2.webAuthnGlobalPublicRouter.routes(), index_js_2.webAuthnGlobalPublicRouter.allowedMethods());
33
33
  /* path '/admin/oauth/...' is deprecated. should use path '/oauth/...' for oauth2 related routing */
34
- domainPublicRouter.use('/oauth', router_1.oauth2Router.routes(), router_1.oauth2Router.allowedMethods()); // if i use context
34
+ domainPublicRouter.use('/oauth', index_js_2.oauth2Router.routes(), index_js_2.oauth2Router.allowedMethods()); // if i use context
35
35
  });
36
36
  process.on('bootstrap-module-domain-private-route', (app, domainPrivateRouter) => {
37
- domainPrivateRouter.use(middlewares_1.jwtAuthenticateMiddleware);
38
- domainPrivateRouter.use(middlewares_1.domainAuthenticateMiddleware);
37
+ domainPrivateRouter.use(index_js_1.jwtAuthenticateMiddleware);
38
+ domainPrivateRouter.use(index_js_1.domainAuthenticateMiddleware);
39
39
  /* domainPrivateRouter based nested-routers */
40
40
  if (isPathBaseDomain) {
41
41
  // pathBaseDomainRouter는 history-fallback의 경우에 인증 처리를 하기 위한 라우터이다.
42
42
  // (보통, URL 링크등을 통해서 domain path URL로 바로 요청하는 경우에 해당한다.)
43
43
  // pathBaseDomainRouter는 domain path를 domain-private-router를 사용하는 것을 전제로 한다.
44
- domainPrivateRouter.use('/domain/:domain/oauth', router_1.oauth2AuthorizeRouter.routes(), router_1.oauth2AuthorizeRouter.allowedMethods());
45
- domainPrivateRouter.use('/domain', router_1.pathBaseDomainRouter.routes(), router_1.pathBaseDomainRouter.allowedMethods());
44
+ domainPrivateRouter.use('/domain/:domain/oauth', index_js_2.oauth2AuthorizeRouter.routes(), index_js_2.oauth2AuthorizeRouter.allowedMethods());
45
+ domainPrivateRouter.use('/domain', index_js_2.pathBaseDomainRouter.routes(), index_js_2.pathBaseDomainRouter.allowedMethods());
46
46
  }
47
47
  // Client Routing : path 확장자가 없는 경우는 대부분 client 라우팅에 해당한다.
48
48
  // 즉, browser-history-fallback 으로 index.html을 send 하는 경우에, 사용자 로그인이 필요한 경우에,