@rapidrest/auth 1.0.0-beta.1

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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/lib/auth/BasicStrategy.js +82 -0
  4. package/dist/lib/auth/BasicStrategy.js.map +1 -0
  5. package/dist/lib/auth/FIDO2Strategy.js +179 -0
  6. package/dist/lib/auth/FIDO2Strategy.js.map +1 -0
  7. package/dist/lib/auth/MFAStrategy.js +219 -0
  8. package/dist/lib/auth/MFAStrategy.js.map +1 -0
  9. package/dist/lib/auth/OIDCStrategy.js +397 -0
  10. package/dist/lib/auth/OIDCStrategy.js.map +1 -0
  11. package/dist/lib/auth/OTPStrategy.js +143 -0
  12. package/dist/lib/auth/OTPStrategy.js.map +1 -0
  13. package/dist/lib/auth/PasskeyStrategy.js +185 -0
  14. package/dist/lib/auth/PasskeyStrategy.js.map +1 -0
  15. package/dist/lib/auth/TOTPStrategy.js +84 -0
  16. package/dist/lib/auth/TOTPStrategy.js.map +1 -0
  17. package/dist/lib/auth/index.js +10 -0
  18. package/dist/lib/auth/index.js.map +1 -0
  19. package/dist/lib/auth/shared.js +431 -0
  20. package/dist/lib/auth/shared.js.map +1 -0
  21. package/dist/lib/auth/types.js +12 -0
  22. package/dist/lib/auth/types.js.map +1 -0
  23. package/dist/lib/index.js +4 -0
  24. package/dist/lib/index.js.map +1 -0
  25. package/dist/lib/models/index.js +2 -0
  26. package/dist/lib/models/index.js.map +1 -0
  27. package/dist/lib/models/mongo/AliasMongo.js +77 -0
  28. package/dist/lib/models/mongo/AliasMongo.js.map +1 -0
  29. package/dist/lib/models/mongo/ProfileMongo.js +99 -0
  30. package/dist/lib/models/mongo/ProfileMongo.js.map +1 -0
  31. package/dist/lib/models/mongo/SecretMongo.js +71 -0
  32. package/dist/lib/models/mongo/SecretMongo.js.map +1 -0
  33. package/dist/lib/models/mongo/UserMongo.js +71 -0
  34. package/dist/lib/models/mongo/UserMongo.js.map +1 -0
  35. package/dist/lib/models/mongo/index.js +5 -0
  36. package/dist/lib/models/mongo/index.js.map +1 -0
  37. package/dist/lib/models/mongo.js +2 -0
  38. package/dist/lib/models/mongo.js.map +1 -0
  39. package/dist/lib/models/sql/AliasSQL.js +77 -0
  40. package/dist/lib/models/sql/AliasSQL.js.map +1 -0
  41. package/dist/lib/models/sql/ProfileSQL.js +99 -0
  42. package/dist/lib/models/sql/ProfileSQL.js.map +1 -0
  43. package/dist/lib/models/sql/SecretSQL.js +71 -0
  44. package/dist/lib/models/sql/SecretSQL.js.map +1 -0
  45. package/dist/lib/models/sql/UserSQL.js +68 -0
  46. package/dist/lib/models/sql/UserSQL.js.map +1 -0
  47. package/dist/lib/models/sql/index.js +5 -0
  48. package/dist/lib/models/sql/index.js.map +1 -0
  49. package/dist/lib/models/sql.js +2 -0
  50. package/dist/lib/models/sql.js.map +1 -0
  51. package/dist/lib/models/types.js +35 -0
  52. package/dist/lib/models/types.js.map +1 -0
  53. package/dist/lib/mongo.js +3 -0
  54. package/dist/lib/mongo.js.map +1 -0
  55. package/dist/lib/routes/BaseAliasRoute.js +10 -0
  56. package/dist/lib/routes/BaseAliasRoute.js.map +1 -0
  57. package/dist/lib/routes/BaseAuthBasicRoute.js +132 -0
  58. package/dist/lib/routes/BaseAuthBasicRoute.js.map +1 -0
  59. package/dist/lib/routes/BaseAuthFIDO2Route.js +191 -0
  60. package/dist/lib/routes/BaseAuthFIDO2Route.js.map +1 -0
  61. package/dist/lib/routes/BaseAuthMFARoute.js +310 -0
  62. package/dist/lib/routes/BaseAuthMFARoute.js.map +1 -0
  63. package/dist/lib/routes/BaseAuthOIDCRoute.js +231 -0
  64. package/dist/lib/routes/BaseAuthOIDCRoute.js.map +1 -0
  65. package/dist/lib/routes/BaseAuthOTPRoute.js +214 -0
  66. package/dist/lib/routes/BaseAuthOTPRoute.js.map +1 -0
  67. package/dist/lib/routes/BaseAuthPasskeyRoute.js +182 -0
  68. package/dist/lib/routes/BaseAuthPasskeyRoute.js.map +1 -0
  69. package/dist/lib/routes/BaseAuthTOTPRoute.js +133 -0
  70. package/dist/lib/routes/BaseAuthTOTPRoute.js.map +1 -0
  71. package/dist/lib/routes/BaseProfileRoute.js +10 -0
  72. package/dist/lib/routes/BaseProfileRoute.js.map +1 -0
  73. package/dist/lib/routes/BaseSecretRoute.js +399 -0
  74. package/dist/lib/routes/BaseSecretRoute.js.map +1 -0
  75. package/dist/lib/routes/BaseUserRoute.js +10 -0
  76. package/dist/lib/routes/BaseUserRoute.js.map +1 -0
  77. package/dist/lib/routes/UserUtils.js +78 -0
  78. package/dist/lib/routes/UserUtils.js.map +1 -0
  79. package/dist/lib/routes/index.js +13 -0
  80. package/dist/lib/routes/index.js.map +1 -0
  81. package/dist/lib/routes/mongo/BaseAliasRouteMongo.js +20 -0
  82. package/dist/lib/routes/mongo/BaseAliasRouteMongo.js.map +1 -0
  83. package/dist/lib/routes/mongo/BaseAuthBasicRouteMongo.js +14 -0
  84. package/dist/lib/routes/mongo/BaseAuthBasicRouteMongo.js.map +1 -0
  85. package/dist/lib/routes/mongo/BaseAuthFIDO2RouteMongo.js +14 -0
  86. package/dist/lib/routes/mongo/BaseAuthFIDO2RouteMongo.js.map +1 -0
  87. package/dist/lib/routes/mongo/BaseAuthMFARouteMongo.js +14 -0
  88. package/dist/lib/routes/mongo/BaseAuthMFARouteMongo.js.map +1 -0
  89. package/dist/lib/routes/mongo/BaseAuthOIDCRouteMongo.js +11 -0
  90. package/dist/lib/routes/mongo/BaseAuthOIDCRouteMongo.js.map +1 -0
  91. package/dist/lib/routes/mongo/BaseAuthOTPRouteMongo.js +14 -0
  92. package/dist/lib/routes/mongo/BaseAuthOTPRouteMongo.js.map +1 -0
  93. package/dist/lib/routes/mongo/BaseAuthPasskeyRouteMongo.js +14 -0
  94. package/dist/lib/routes/mongo/BaseAuthPasskeyRouteMongo.js.map +1 -0
  95. package/dist/lib/routes/mongo/BaseAuthTOTPRouteMongo.js +14 -0
  96. package/dist/lib/routes/mongo/BaseAuthTOTPRouteMongo.js.map +1 -0
  97. package/dist/lib/routes/mongo/BaseProfileRouteMongo.js +20 -0
  98. package/dist/lib/routes/mongo/BaseProfileRouteMongo.js.map +1 -0
  99. package/dist/lib/routes/mongo/BaseSecretRouteMongo.js +20 -0
  100. package/dist/lib/routes/mongo/BaseSecretRouteMongo.js.map +1 -0
  101. package/dist/lib/routes/mongo/BaseUserRouteMongo.js +20 -0
  102. package/dist/lib/routes/mongo/BaseUserRouteMongo.js.map +1 -0
  103. package/dist/lib/routes/mongo/index.js +12 -0
  104. package/dist/lib/routes/mongo/index.js.map +1 -0
  105. package/dist/lib/routes/mongo.js +2 -0
  106. package/dist/lib/routes/mongo.js.map +1 -0
  107. package/dist/lib/routes/sql/BaseAliasRouteSQL.js +20 -0
  108. package/dist/lib/routes/sql/BaseAliasRouteSQL.js.map +1 -0
  109. package/dist/lib/routes/sql/BaseAuthBasicRouteSQL.js +14 -0
  110. package/dist/lib/routes/sql/BaseAuthBasicRouteSQL.js.map +1 -0
  111. package/dist/lib/routes/sql/BaseAuthFIDO2RouteSQL.js +14 -0
  112. package/dist/lib/routes/sql/BaseAuthFIDO2RouteSQL.js.map +1 -0
  113. package/dist/lib/routes/sql/BaseAuthMFARouteSQL.js +14 -0
  114. package/dist/lib/routes/sql/BaseAuthMFARouteSQL.js.map +1 -0
  115. package/dist/lib/routes/sql/BaseAuthOIDCRouteSQL.js +11 -0
  116. package/dist/lib/routes/sql/BaseAuthOIDCRouteSQL.js.map +1 -0
  117. package/dist/lib/routes/sql/BaseAuthOTPRouteSQL.js +14 -0
  118. package/dist/lib/routes/sql/BaseAuthOTPRouteSQL.js.map +1 -0
  119. package/dist/lib/routes/sql/BaseAuthPasskeyRouteSQL.js +14 -0
  120. package/dist/lib/routes/sql/BaseAuthPasskeyRouteSQL.js.map +1 -0
  121. package/dist/lib/routes/sql/BaseAuthTOTPRouteSQL.js +14 -0
  122. package/dist/lib/routes/sql/BaseAuthTOTPRouteSQL.js.map +1 -0
  123. package/dist/lib/routes/sql/BaseProfileRouteSQL.js +20 -0
  124. package/dist/lib/routes/sql/BaseProfileRouteSQL.js.map +1 -0
  125. package/dist/lib/routes/sql/BaseSecretRouteSQL.js +20 -0
  126. package/dist/lib/routes/sql/BaseSecretRouteSQL.js.map +1 -0
  127. package/dist/lib/routes/sql/BaseUserRouteSQL.js +20 -0
  128. package/dist/lib/routes/sql/BaseUserRouteSQL.js.map +1 -0
  129. package/dist/lib/routes/sql/index.js +12 -0
  130. package/dist/lib/routes/sql/index.js.map +1 -0
  131. package/dist/lib/routes/sql.js +2 -0
  132. package/dist/lib/routes/sql.js.map +1 -0
  133. package/dist/lib/sql.js +3 -0
  134. package/dist/lib/sql.js.map +1 -0
  135. package/dist/types/auth/BasicStrategy.d.ts +39 -0
  136. package/dist/types/auth/FIDO2Strategy.d.ts +85 -0
  137. package/dist/types/auth/MFAStrategy.d.ts +110 -0
  138. package/dist/types/auth/OIDCStrategy.d.ts +188 -0
  139. package/dist/types/auth/OTPStrategy.d.ts +88 -0
  140. package/dist/types/auth/PasskeyStrategy.d.ts +81 -0
  141. package/dist/types/auth/TOTPStrategy.d.ts +49 -0
  142. package/dist/types/auth/index.d.ts +9 -0
  143. package/dist/types/auth/shared.d.ts +136 -0
  144. package/dist/types/auth/types.d.ts +127 -0
  145. package/dist/types/index.d.ts +3 -0
  146. package/dist/types/models/index.d.ts +1 -0
  147. package/dist/types/models/mongo/AliasMongo.d.ts +15 -0
  148. package/dist/types/models/mongo/ProfileMongo.d.ts +17 -0
  149. package/dist/types/models/mongo/SecretMongo.d.ts +14 -0
  150. package/dist/types/models/mongo/UserMongo.d.ts +14 -0
  151. package/dist/types/models/mongo/index.d.ts +4 -0
  152. package/dist/types/models/mongo.d.ts +1 -0
  153. package/dist/types/models/sql/AliasSQL.d.ts +15 -0
  154. package/dist/types/models/sql/ProfileSQL.d.ts +17 -0
  155. package/dist/types/models/sql/SecretSQL.d.ts +14 -0
  156. package/dist/types/models/sql/UserSQL.d.ts +14 -0
  157. package/dist/types/models/sql/index.d.ts +4 -0
  158. package/dist/types/models/sql.d.ts +1 -0
  159. package/dist/types/models/types.d.ts +136 -0
  160. package/dist/types/mongo.d.ts +2 -0
  161. package/dist/types/routes/BaseAliasRoute.d.ts +7 -0
  162. package/dist/types/routes/BaseAuthBasicRoute.d.ts +27 -0
  163. package/dist/types/routes/BaseAuthFIDO2Route.d.ts +50 -0
  164. package/dist/types/routes/BaseAuthMFARoute.d.ts +61 -0
  165. package/dist/types/routes/BaseAuthOIDCRoute.d.ts +33 -0
  166. package/dist/types/routes/BaseAuthOTPRoute.d.ts +53 -0
  167. package/dist/types/routes/BaseAuthPasskeyRoute.d.ts +41 -0
  168. package/dist/types/routes/BaseAuthTOTPRoute.d.ts +38 -0
  169. package/dist/types/routes/BaseProfileRoute.d.ts +7 -0
  170. package/dist/types/routes/BaseSecretRoute.d.ts +89 -0
  171. package/dist/types/routes/BaseUserRoute.d.ts +7 -0
  172. package/dist/types/routes/UserUtils.d.ts +21 -0
  173. package/dist/types/routes/index.d.ts +12 -0
  174. package/dist/types/routes/mongo/BaseAliasRouteMongo.d.ts +4 -0
  175. package/dist/types/routes/mongo/BaseAuthBasicRouteMongo.d.ts +7 -0
  176. package/dist/types/routes/mongo/BaseAuthFIDO2RouteMongo.d.ts +7 -0
  177. package/dist/types/routes/mongo/BaseAuthMFARouteMongo.d.ts +7 -0
  178. package/dist/types/routes/mongo/BaseAuthOIDCRouteMongo.d.ts +7 -0
  179. package/dist/types/routes/mongo/BaseAuthOTPRouteMongo.d.ts +7 -0
  180. package/dist/types/routes/mongo/BaseAuthPasskeyRouteMongo.d.ts +7 -0
  181. package/dist/types/routes/mongo/BaseAuthTOTPRouteMongo.d.ts +7 -0
  182. package/dist/types/routes/mongo/BaseProfileRouteMongo.d.ts +4 -0
  183. package/dist/types/routes/mongo/BaseSecretRouteMongo.d.ts +4 -0
  184. package/dist/types/routes/mongo/BaseUserRouteMongo.d.ts +4 -0
  185. package/dist/types/routes/mongo/index.d.ts +11 -0
  186. package/dist/types/routes/mongo.d.ts +1 -0
  187. package/dist/types/routes/sql/BaseAliasRouteSQL.d.ts +4 -0
  188. package/dist/types/routes/sql/BaseAuthBasicRouteSQL.d.ts +7 -0
  189. package/dist/types/routes/sql/BaseAuthFIDO2RouteSQL.d.ts +7 -0
  190. package/dist/types/routes/sql/BaseAuthMFARouteSQL.d.ts +7 -0
  191. package/dist/types/routes/sql/BaseAuthOIDCRouteSQL.d.ts +7 -0
  192. package/dist/types/routes/sql/BaseAuthOTPRouteSQL.d.ts +7 -0
  193. package/dist/types/routes/sql/BaseAuthPasskeyRouteSQL.d.ts +7 -0
  194. package/dist/types/routes/sql/BaseAuthTOTPRouteSQL.d.ts +7 -0
  195. package/dist/types/routes/sql/BaseProfileRouteSQL.d.ts +4 -0
  196. package/dist/types/routes/sql/BaseSecretRouteSQL.d.ts +4 -0
  197. package/dist/types/routes/sql/BaseUserRouteSQL.d.ts +4 -0
  198. package/dist/types/routes/sql/index.d.ts +11 -0
  199. package/dist/types/routes/sql.d.ts +1 -0
  200. package/dist/types/sql.d.ts +2 -0
  201. package/package.json +138 -0
@@ -0,0 +1,214 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ ///////////////////////////////////////////////////////////////////////////////
14
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
15
+ ///////////////////////////////////////////////////////////////////////////////
16
+ import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
17
+ import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
18
+ import { AliasType, AuthResult } from "../models/types.js";
19
+ import { OTPStrategy, OTPStrategyOptions } from "../auth/OTPStrategy.js";
20
+ import { OTPContactType } from "../auth/types.js";
21
+ import { UserUtils } from "./UserUtils.js";
22
+ const { Config, Init, Inject } = ObjectDecorators;
23
+ const { Summary, Description, Returns } = DocDecorators;
24
+ const { Auth, Get, Post } = RouteDecorators;
25
+ const AuthUser = RouteDecorators.User;
26
+ /**
27
+ *
28
+ *
29
+ * @author Jean-Philippe Steinmetz
30
+ */
31
+ export class BaseAuthOTPRoute {
32
+ constructor() {
33
+ /** The name of the messaging template to use for sending notifications. */
34
+ this.template = "login-otp";
35
+ }
36
+ /**
37
+ * Called on server startup to initialize the route with any defaults.
38
+ */
39
+ async initialize() {
40
+ if (!this.authMiddleware) {
41
+ throw new Error("authMiddleware is not set.");
42
+ }
43
+ if (!this.objectFactory) {
44
+ throw new Error("objectFactory is not set.");
45
+ }
46
+ if (!this.aliasRepo && this.aliasClass) {
47
+ this.aliasRepo = await this.objectFactory.newInstance(RepoUtils, {
48
+ name: this.aliasClass.name,
49
+ args: [this.aliasClass],
50
+ });
51
+ }
52
+ if (!this.secretRepo && this.secretClass) {
53
+ this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
54
+ name: this.secretClass.name,
55
+ args: [this.secretClass],
56
+ });
57
+ }
58
+ if (!this.userRepo && this.userClass) {
59
+ this.userRepo = await this.objectFactory.newInstance(RepoUtils, {
60
+ name: this.userClass.name,
61
+ args: [this.userClass],
62
+ });
63
+ }
64
+ if (!this.userUtils && this.userClass && this.aliasClass) {
65
+ this.userUtils = await this.objectFactory.newInstance(UserUtils, {
66
+ name: "default",
67
+ args: [this.userClass, this.aliasClass],
68
+ });
69
+ }
70
+ const options = new OTPStrategyOptions();
71
+ options.getContact = this.getContact.bind(this);
72
+ options.getContacts = this.getContacts.bind(this);
73
+ options.getUser = this.getUser.bind(this);
74
+ options.notifyContact = this.notifyContact.bind(this);
75
+ const strategy = await this.objectFactory.newInstance(OTPStrategy, {
76
+ name: "default",
77
+ args: [options],
78
+ });
79
+ this.authMiddleware.register(strategy.name, strategy);
80
+ }
81
+ /**
82
+ * Authenticates the user using OTP and returns a JSON Web Token access token to be used with future API requests.
83
+ */
84
+ async authenticate(user) {
85
+ const token = await JWTUtils.createToken(this.jwtConfig, user);
86
+ return new AuthResult({
87
+ token,
88
+ user,
89
+ });
90
+ }
91
+ convertAliasType(type) {
92
+ switch (type) {
93
+ case AliasType.EMAIL:
94
+ return OTPContactType.EMAIL;
95
+ case AliasType.PHONE:
96
+ return OTPContactType.SMS;
97
+ default:
98
+ throw new Error("Unsupported type: " + type);
99
+ }
100
+ }
101
+ /**
102
+ * Retrieves the alias with the given unique id.
103
+ * @param id The unique id of the alias to retrieve.
104
+ * @returns The alias if found, otherwise `undefined`.
105
+ */
106
+ async getContact(id) {
107
+ if (!this.aliasRepo) {
108
+ throw new Error("aliasRepo is not set.");
109
+ }
110
+ const alias = await this.aliasRepo.findOne(id, { ignoreACL: true });
111
+ return alias
112
+ ? {
113
+ contact: alias.alias,
114
+ type: this.convertAliasType(alias.type),
115
+ verified: alias.verified,
116
+ }
117
+ : undefined;
118
+ }
119
+ /**
120
+ * Retrieves all aliases for the user with the given id.
121
+ *
122
+ * @param id The unique id of the user to lookup.
123
+ */
124
+ async getContacts(id) {
125
+ if (!this.aliasRepo) {
126
+ throw new Error("aliasRepo is not set.");
127
+ }
128
+ if (!this.userRepo) {
129
+ throw new Error("userRepo is not set.");
130
+ }
131
+ // The provided id may be the user's uid or an alias itself. First attempt to retrieve a user
132
+ // and if found use that id. Otherwise, try looking up the alias itself. Once at least one alias
133
+ // is found we can use it to look-up all others for a given userUid.
134
+ let user = await this.userRepo.findOne(id, { ignoreACL: true });
135
+ let aliases = await this.aliasRepo.find(user ? { userUid: user.uid } : { alias: id }, {
136
+ ignoreACL: true,
137
+ });
138
+ if (!user && aliases.length > 0) {
139
+ aliases = await this.aliasRepo.find({ userUid: aliases[0].userUid }, { ignoreACL: true });
140
+ user = aliases.length > 0 ? await this.userRepo.findOne(aliases[0].userUid) : undefined;
141
+ }
142
+ // Filter aliases to only those that can be notified
143
+ aliases.filter((alias) => [AliasType.EMAIL, AliasType.PHONE].includes(alias.type));
144
+ const results = [];
145
+ for (const alias of aliases) {
146
+ results.push({
147
+ contact: alias.alias,
148
+ type: this.convertAliasType(alias.type),
149
+ verified: alias.verified,
150
+ });
151
+ }
152
+ return results;
153
+ }
154
+ /**
155
+ * Retrieves the user with the given unique id.
156
+ * @param uid The unique id of the user to retrieve.
157
+ * @returns The user if found, otherwise `undefined`.
158
+ */
159
+ async getUser(uid) {
160
+ if (!this.userUtils) {
161
+ throw new Error("userUtils is not set.");
162
+ }
163
+ return this.userUtils.lookup(uid);
164
+ }
165
+ async notifyContact(contact, totp) {
166
+ switch (contact.type) {
167
+ case OTPContactType.EMAIL:
168
+ void this.messagingUtils?.sendEmail(this.template, { totp }, {
169
+ to: contact.contact,
170
+ });
171
+ break;
172
+ case OTPContactType.SMS:
173
+ void this.messagingUtils?.sendSMS(this.template, { totp }, {
174
+ to: contact.contact,
175
+ });
176
+ break;
177
+ }
178
+ }
179
+ }
180
+ __decorate([
181
+ Inject(AuthMiddleware),
182
+ __metadata("design:type", AuthMiddleware)
183
+ ], BaseAuthOTPRoute.prototype, "authMiddleware", void 0);
184
+ __decorate([
185
+ Config("auth"),
186
+ __metadata("design:type", Object)
187
+ ], BaseAuthOTPRoute.prototype, "jwtConfig", void 0);
188
+ __decorate([
189
+ Inject(ObjectFactory),
190
+ __metadata("design:type", ObjectFactory)
191
+ ], BaseAuthOTPRoute.prototype, "objectFactory", void 0);
192
+ __decorate([
193
+ Inject(MessagingUtils),
194
+ __metadata("design:type", MessagingUtils)
195
+ ], BaseAuthOTPRoute.prototype, "messagingUtils", void 0);
196
+ __decorate([
197
+ Init,
198
+ __metadata("design:type", Function),
199
+ __metadata("design:paramtypes", []),
200
+ __metadata("design:returntype", Promise)
201
+ ], BaseAuthOTPRoute.prototype, "initialize", null);
202
+ __decorate([
203
+ Summary("Authenticate OTP"),
204
+ Description("Authenticates the user using TOTP and returns a JSON Web Token access token to be used with future API requests."),
205
+ Returns([AuthResult, undefined]),
206
+ Auth(["otp"]),
207
+ Get(),
208
+ Post(),
209
+ __param(0, AuthUser),
210
+ __metadata("design:type", Function),
211
+ __metadata("design:paramtypes", [Object]),
212
+ __metadata("design:returntype", Promise)
213
+ ], BaseAuthOTPRoute.prototype, "authenticate", null);
214
+ //# sourceMappingURL=BaseAuthOTPRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAuthOTPRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthOTPRoute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ ///////////////////////////////////////////////////////////////////////////////
14
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
15
+ ///////////////////////////////////////////////////////////////////////////////
16
+ import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
17
+ import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
18
+ import { AuthResult, SecretType } from "../models/types.js";
19
+ import { PasskeyStrategy, PasskeyStrategyOptions } from "../auth/PasskeyStrategy.js";
20
+ import { UserUtils } from "./UserUtils.js";
21
+ const { Config, Init, Inject } = ObjectDecorators;
22
+ const { Summary, Description, Returns } = DocDecorators;
23
+ const { Auth, Get, Post } = RouteDecorators;
24
+ const AuthUser = RouteDecorators.User;
25
+ /**
26
+ *
27
+ *
28
+ * @author Jean-Philippe Steinmetz
29
+ */
30
+ export class BaseAuthPasskeyRoute {
31
+ constructor() {
32
+ this.passkeyConfig = {
33
+ rpName: "rapidrest",
34
+ rpID: "rapidrest",
35
+ origin: "http://localhost:3000",
36
+ };
37
+ }
38
+ /**
39
+ * Called on server startup to initialize the route with any defaults.
40
+ */
41
+ async initialize() {
42
+ if (!this.authMiddleware) {
43
+ throw new Error("authMiddleware is not set.");
44
+ }
45
+ if (!this.objectFactory) {
46
+ throw new Error("objectFactory is not set.");
47
+ }
48
+ if (!this.aliasRepo && this.aliasClass) {
49
+ this.aliasRepo = await this.objectFactory.newInstance(RepoUtils, {
50
+ name: this.aliasClass.name,
51
+ args: [this.aliasClass],
52
+ });
53
+ }
54
+ if (!this.secretRepo && this.secretClass) {
55
+ this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
56
+ name: this.secretClass.name,
57
+ args: [this.secretClass],
58
+ });
59
+ }
60
+ if (!this.userRepo && this.userClass) {
61
+ this.userRepo = await this.objectFactory.newInstance(RepoUtils, {
62
+ name: this.userClass.name,
63
+ args: [this.userClass],
64
+ });
65
+ }
66
+ if (!this.userUtils && this.userClass && this.aliasClass) {
67
+ this.userUtils = await this.objectFactory.newInstance(UserUtils, {
68
+ name: "default",
69
+ args: [this.userClass, this.aliasClass],
70
+ });
71
+ }
72
+ const options = new PasskeyStrategyOptions(this.passkeyConfig);
73
+ options.getCredentialById = this.getCredentialById.bind(this);
74
+ options.getCredentials = this.getCredentials.bind(this);
75
+ options.updateCredentialCounter = this.updateCredentialCounter.bind(this);
76
+ options.getUser = this.getUser.bind(this);
77
+ const strategy = await this.objectFactory.newInstance(PasskeyStrategy, {
78
+ name: "default",
79
+ args: [options],
80
+ });
81
+ this.authMiddleware.register(strategy.name, strategy);
82
+ }
83
+ /**
84
+ * Authenticates the user using Passkey and returns a JSON Web Token access token to be used with future API requests.
85
+ */
86
+ async authenticate(user) {
87
+ const token = await JWTUtils.createToken(this.jwtConfig, user);
88
+ return new AuthResult({
89
+ token,
90
+ user,
91
+ });
92
+ }
93
+ async getCredentialById(credentialId) {
94
+ if (!this.secretRepo) {
95
+ throw new Error("secretRepo is not set.");
96
+ }
97
+ const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
98
+ return secret?.data;
99
+ }
100
+ async getCredentials(id) {
101
+ if (!this.secretRepo) {
102
+ throw new Error("secretRepo is not set.");
103
+ }
104
+ if (!this.userUtils) {
105
+ throw new Error("userUtils is not set.");
106
+ }
107
+ const user = await this.userUtils.lookup(id);
108
+ if (!user) {
109
+ throw new Error("Invalid authentication request.");
110
+ }
111
+ // Retrieve all passkey secrets associated with this user
112
+ const secrets = await this.secretRepo.find({ type: SecretType.PASSKEY, userUid: user.uid }, { ignoreACL: true });
113
+ // Extract the passkey credential data from the secrets and return
114
+ const results = [];
115
+ secrets.forEach((secret) => results.push(secret.data));
116
+ return results;
117
+ }
118
+ /**
119
+ * Retrieve the user associated with a given uid or alias.
120
+ *
121
+ * @param id The unqique id of the user or alias to lookup.
122
+ */
123
+ async getUser(id) {
124
+ if (!this.userUtils) {
125
+ throw new Error("userUtils is not set.");
126
+ }
127
+ return await this.userUtils.lookup(id);
128
+ }
129
+ async updateCredentialCounter(credentialId, newCounter) {
130
+ if (!this.secretRepo) {
131
+ throw new Error("secretRepo is not set.");
132
+ }
133
+ const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
134
+ if (secret) {
135
+ secret.data.counter = newCounter;
136
+ await this.secretRepo.update({
137
+ uid: secret.uid,
138
+ version: secret.version,
139
+ data: secret.data,
140
+ }, secret, { ignoreACL: true, recordEvent: false });
141
+ }
142
+ }
143
+ }
144
+ __decorate([
145
+ Inject(AuthMiddleware),
146
+ __metadata("design:type", AuthMiddleware)
147
+ ], BaseAuthPasskeyRoute.prototype, "authMiddleware", void 0);
148
+ __decorate([
149
+ Config("auth"),
150
+ __metadata("design:type", Object)
151
+ ], BaseAuthPasskeyRoute.prototype, "jwtConfig", void 0);
152
+ __decorate([
153
+ Inject(ObjectFactory),
154
+ __metadata("design:type", ObjectFactory)
155
+ ], BaseAuthPasskeyRoute.prototype, "objectFactory", void 0);
156
+ __decorate([
157
+ Inject(MessagingUtils),
158
+ __metadata("design:type", MessagingUtils)
159
+ ], BaseAuthPasskeyRoute.prototype, "messagingUtils", void 0);
160
+ __decorate([
161
+ Config("auth:passkey"),
162
+ __metadata("design:type", Object)
163
+ ], BaseAuthPasskeyRoute.prototype, "passkeyConfig", void 0);
164
+ __decorate([
165
+ Init,
166
+ __metadata("design:type", Function),
167
+ __metadata("design:paramtypes", []),
168
+ __metadata("design:returntype", Promise)
169
+ ], BaseAuthPasskeyRoute.prototype, "initialize", null);
170
+ __decorate([
171
+ Summary("Authenticate Passkey"),
172
+ Description("Authenticates the user using Passkey and returns a JSON Web Token access token to be used with future API requests."),
173
+ Returns([AuthResult, undefined]),
174
+ Auth(["passkey"]),
175
+ Get(),
176
+ Post(),
177
+ __param(0, AuthUser),
178
+ __metadata("design:type", Function),
179
+ __metadata("design:paramtypes", [Object]),
180
+ __metadata("design:returntype", Promise)
181
+ ], BaseAuthPasskeyRoute.prototype, "authenticate", null);
182
+ //# sourceMappingURL=BaseAuthPasskeyRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAuthPasskeyRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthPasskeyRoute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ ///////////////////////////////////////////////////////////////////////////////
14
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
15
+ ///////////////////////////////////////////////////////////////////////////////
16
+ import { JWTUtils, MessagingUtils, ObjectDecorators } from "@rapidrest/core";
17
+ import { RouteDecorators, DocDecorators, RepoUtils, AuthMiddleware, ObjectFactory } from "@rapidrest/service-core";
18
+ import { AuthResult, SecretType } from "../models/types.js";
19
+ import { TOTPStrategy, TOTPStrategyOptions } from "../auth/TOTPStrategy.js";
20
+ import { UserUtils } from "./UserUtils.js";
21
+ const { Config, Init, Inject } = ObjectDecorators;
22
+ const { Summary, Description, Returns } = DocDecorators;
23
+ const { Auth, Get, Post } = RouteDecorators;
24
+ const AuthUser = RouteDecorators.User;
25
+ /**
26
+ *
27
+ *
28
+ * @author Jean-Philippe Steinmetz
29
+ */
30
+ export class BaseAuthTOTPRoute {
31
+ constructor() {
32
+ /** The name of the messaging template to use for sending notifications. */
33
+ this.template = "login-otp";
34
+ }
35
+ /**
36
+ * Called on server startup to initialize the route with any defaults.
37
+ */
38
+ async initialize() {
39
+ if (!this.authMiddleware) {
40
+ throw new Error("authMiddleware is not set.");
41
+ }
42
+ if (!this.objectFactory) {
43
+ throw new Error("objectFactory is not set.");
44
+ }
45
+ if (!this.secretRepo && this.secretClass) {
46
+ this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
47
+ name: this.secretClass.name,
48
+ args: [this.secretClass],
49
+ });
50
+ }
51
+ if (!this.userUtils && this.userClass && this.aliasClass) {
52
+ this.userUtils = await this.objectFactory.newInstance(UserUtils, {
53
+ name: "default",
54
+ args: [this.userClass, this.aliasClass],
55
+ });
56
+ }
57
+ const options = new TOTPStrategyOptions();
58
+ options.getSecrets = this.getSecrets.bind(this);
59
+ options.getUser = this.getUser.bind(this);
60
+ const strategy = await this.objectFactory.newInstance(TOTPStrategy, {
61
+ name: "default",
62
+ args: [options],
63
+ });
64
+ this.authMiddleware.register(strategy.name, strategy);
65
+ }
66
+ /**
67
+ * Authenticates the user using TOTP and returns a JSON Web Token access token to be used with future API requests.
68
+ */
69
+ async authenticate(user) {
70
+ const token = await JWTUtils.createToken(this.jwtConfig, user);
71
+ return new AuthResult({
72
+ token,
73
+ user,
74
+ });
75
+ }
76
+ async getSecrets(uid) {
77
+ if (!this.secretRepo) {
78
+ throw new Error("secretRepo is not set.");
79
+ }
80
+ const results = [];
81
+ const secrets = await this.secretRepo.find({ type: SecretType.TOTP, userUid: uid }, { ignoreACL: true });
82
+ for (const secret of secrets) {
83
+ results.push(secret.data);
84
+ }
85
+ return results;
86
+ }
87
+ /**
88
+ * Retrieves the user with the given unique id.
89
+ * @param uid The unique id of the user to retrieve.
90
+ * @returns The user if found, otherwise `undefined`.
91
+ */
92
+ async getUser(uid) {
93
+ if (!this.userUtils) {
94
+ throw new Error("userUtils is not set.");
95
+ }
96
+ return await this.userUtils.lookup(uid);
97
+ }
98
+ }
99
+ __decorate([
100
+ Inject(AuthMiddleware),
101
+ __metadata("design:type", AuthMiddleware)
102
+ ], BaseAuthTOTPRoute.prototype, "authMiddleware", void 0);
103
+ __decorate([
104
+ Config("auth"),
105
+ __metadata("design:type", Object)
106
+ ], BaseAuthTOTPRoute.prototype, "jwtConfig", void 0);
107
+ __decorate([
108
+ Inject(ObjectFactory),
109
+ __metadata("design:type", ObjectFactory)
110
+ ], BaseAuthTOTPRoute.prototype, "objectFactory", void 0);
111
+ __decorate([
112
+ Inject(MessagingUtils),
113
+ __metadata("design:type", MessagingUtils)
114
+ ], BaseAuthTOTPRoute.prototype, "messagingUtils", void 0);
115
+ __decorate([
116
+ Init,
117
+ __metadata("design:type", Function),
118
+ __metadata("design:paramtypes", []),
119
+ __metadata("design:returntype", Promise)
120
+ ], BaseAuthTOTPRoute.prototype, "initialize", null);
121
+ __decorate([
122
+ Summary("Authenticate TOTP"),
123
+ Description("Authenticates the user using TTOTP and returns a JSON Web Token access token to be used with future API requests."),
124
+ Returns([AuthResult, undefined]),
125
+ Auth(["totp"]),
126
+ Get(),
127
+ Post(),
128
+ __param(0, AuthUser),
129
+ __metadata("design:type", Function),
130
+ __metadata("design:paramtypes", [Object]),
131
+ __metadata("design:returntype", Promise)
132
+ ], BaseAuthTOTPRoute.prototype, "authenticate", null);
133
+ //# sourceMappingURL=BaseAuthTOTPRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAuthTOTPRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthTOTPRoute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ ///////////////////////////////////////////////////////////////////////////////
4
+ import { CRUDRoute } from "@rapidrest/service-core";
5
+ /**
6
+ * @author Jean-Philippe Steinmetz
7
+ */
8
+ export class BaseProfileRoute extends CRUDRoute {
9
+ }
10
+ //# sourceMappingURL=BaseProfileRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseProfileRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseProfileRoute.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAgB,gBAAoC,SAAQ,SAAY;CAAG"}