@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,35 @@
1
+ /**
2
+ * @author Jean-Philippe Steinmetz
3
+ */
4
+ export class AuthResult {
5
+ constructor(other) {
6
+ this.token = other.token;
7
+ this.user = other.user;
8
+ }
9
+ }
10
+ /**
11
+ *
12
+ */
13
+ export var AliasType;
14
+ (function (AliasType) {
15
+ AliasType["EMAIL"] = "email";
16
+ AliasType["NAME"] = "name";
17
+ AliasType["OAUTH"] = "oauth";
18
+ AliasType["PHONE"] = "phone";
19
+ })(AliasType || (AliasType = {}));
20
+ export var ContactType;
21
+ (function (ContactType) {
22
+ ContactType["EMAIL"] = "email";
23
+ ContactType["PHONE"] = "phone";
24
+ })(ContactType || (ContactType = {}));
25
+ /**
26
+ *
27
+ */
28
+ export var SecretType;
29
+ (function (SecretType) {
30
+ SecretType["FIDO2"] = "fido2";
31
+ SecretType["PASSKEY"] = "passkey";
32
+ SecretType["PASSWORD"] = "password";
33
+ SecretType["TOTP"] = "totp";
34
+ })(SecretType || (SecretType = {}));
35
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/models/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,UAAU;IAInB,YAAY,KAAU;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACjB,4BAAe,CAAA;IACf,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,4BAAe,CAAA;AACnB,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB;AAmBD,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACnB,8BAAe,CAAA;IACf,8BAAe,CAAA;AACnB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB;AAmED;;GAEG;AACH,MAAM,CAAN,IAAY,UAKX;AALD,WAAY,UAAU;IAClB,6BAAe,CAAA;IACf,iCAAmB,CAAA;IACnB,mCAAqB,CAAA;IACrB,2BAAa,CAAA;AACjB,CAAC,EALW,UAAU,KAAV,UAAU,QAKrB"}
@@ -0,0 +1,3 @@
1
+ export * from "./models/mongo.js";
2
+ export * from "./routes/mongo.js";
3
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/mongo.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -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 BaseAliasRoute extends CRUDRoute {
9
+ }
10
+ //# sourceMappingURL=BaseAliasRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAliasRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAliasRoute.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,cAAgC,SAAQ,SAAY;CAAG"}
@@ -0,0 +1,132 @@
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, 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 { BasicStrategy, BasicStrategyOptions } from "../auth/BasicStrategy.js";
20
+ import { importArgon2 } from "../auth/shared.js";
21
+ import { UserUtils } from "./UserUtils.js";
22
+ const { Config, Init, Inject } = ObjectDecorators;
23
+ const { Summary, Description, Returns } = DocDecorators;
24
+ const { Auth, Get } = RouteDecorators;
25
+ const AuthUser = RouteDecorators.User;
26
+ /**
27
+ *
28
+ *
29
+ * @author Jean-Philippe Steinmetz
30
+ */
31
+ export class BaseAuthBasicRoute {
32
+ /**
33
+ * Called on server startup to initialize the route with any defaults.
34
+ */
35
+ async initialize() {
36
+ if (!this.authMiddleware) {
37
+ throw new Error("authMiddleware is not set.");
38
+ }
39
+ if (!this.objectFactory) {
40
+ throw new Error("objectFactory is not set.");
41
+ }
42
+ if (!this.secretRepo && this.secretClass) {
43
+ this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
44
+ name: this.secretClass.name,
45
+ args: [this.secretClass],
46
+ });
47
+ }
48
+ if (!this.userUtils && this.userClass && this.aliasClass) {
49
+ this.userUtils = await this.objectFactory.newInstance(UserUtils, {
50
+ name: "default",
51
+ args: [this.userClass, this.aliasClass],
52
+ });
53
+ }
54
+ const options = new BasicStrategyOptions();
55
+ options.verify = async (name, password) => {
56
+ if (!this.secretRepo) {
57
+ throw new Error("Secret repository not set.");
58
+ }
59
+ if (!this.userUtils) {
60
+ throw new Error("User repository not set.");
61
+ }
62
+ const user = await this.userUtils.lookup(name);
63
+ if (!user) {
64
+ throw new Error("Invalid name or password");
65
+ }
66
+ let secrets = await this.secretRepo.find({
67
+ userUid: user.uid,
68
+ type: SecretType.PASSWORD,
69
+ }, {
70
+ ignoreACL: true,
71
+ });
72
+ // Try all known passwords until at least one succeeds
73
+ let success = false;
74
+ for (const secret of secrets) {
75
+ const argon = await importArgon2();
76
+ success = await argon.verify(secret.data, password);
77
+ if (success) {
78
+ break;
79
+ }
80
+ }
81
+ if (!success) {
82
+ throw new Error("Invalid name or password");
83
+ }
84
+ return user;
85
+ };
86
+ const strategy = await this.objectFactory.newInstance(BasicStrategy, {
87
+ name: "default",
88
+ args: [options],
89
+ });
90
+ this.authMiddleware.register(strategy.name, strategy);
91
+ }
92
+ /**
93
+ * Authenticates the user using HTTP Basic and returns a JSON Web Token access token to be used with future API requests.
94
+ */
95
+ async authenticate(user) {
96
+ const token = await JWTUtils.createToken(this.jwtConfig, user);
97
+ return new AuthResult({
98
+ token,
99
+ user,
100
+ });
101
+ }
102
+ }
103
+ __decorate([
104
+ Inject(AuthMiddleware),
105
+ __metadata("design:type", AuthMiddleware)
106
+ ], BaseAuthBasicRoute.prototype, "authMiddleware", void 0);
107
+ __decorate([
108
+ Config("auth"),
109
+ __metadata("design:type", Object)
110
+ ], BaseAuthBasicRoute.prototype, "jwtConfig", void 0);
111
+ __decorate([
112
+ Inject(ObjectFactory),
113
+ __metadata("design:type", ObjectFactory)
114
+ ], BaseAuthBasicRoute.prototype, "objectFactory", void 0);
115
+ __decorate([
116
+ Init,
117
+ __metadata("design:type", Function),
118
+ __metadata("design:paramtypes", []),
119
+ __metadata("design:returntype", Promise)
120
+ ], BaseAuthBasicRoute.prototype, "initialize", null);
121
+ __decorate([
122
+ Summary("Authenticate Password"),
123
+ Description("Authenticates the user using HTTP Basic and returns a JSON Web Token access token to be used with future API requests."),
124
+ Returns([AuthResult, undefined]),
125
+ Auth(["basic"]),
126
+ Get(),
127
+ __param(0, AuthUser),
128
+ __metadata("design:type", Function),
129
+ __metadata("design:paramtypes", [Object]),
130
+ __metadata("design:returntype", Promise)
131
+ ], BaseAuthBasicRoute.prototype, "authenticate", null);
132
+ //# sourceMappingURL=BaseAuthBasicRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAuthBasicRoute.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthBasicRoute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
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 { FIDO2Strategy, FIDO2StrategyOptions } from "../auth/FIDO2Strategy.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
+ * Authenticates users via a registered FIDO2 hardware security key (e.g. a YubiKey) using
27
+ * WebAuthn/CTAP2. See `BaseAuthPasskeyRoute` for the software/synced-credential ("Passkey")
28
+ * counterpart of this route — both share the same underlying WebAuthn ceremony, but look up
29
+ * credentials stored as `SecretType.FIDO2` rather than `SecretType.PASSKEY`.
30
+ *
31
+ * @author Jean-Philippe Steinmetz
32
+ */
33
+ export class BaseAuthFIDO2Route {
34
+ constructor() {
35
+ /**
36
+ * The relying party configuration to use for this FIDO2 strategy. Kept separate from the Passkey
37
+ * strategy's configuration since a hardware key deployment commonly wants a different
38
+ * `authenticatorAttachment`/`residentKey` policy (see `BaseSecretRoute.fido2Config`).
39
+ */
40
+ this.fido2Config = {
41
+ rpName: "rapidrest",
42
+ rpID: "rapidrest",
43
+ origin: "http://localhost:3000",
44
+ };
45
+ }
46
+ /**
47
+ * Called on server startup to initialize the route with any defaults.
48
+ */
49
+ async initialize() {
50
+ if (!this.authMiddleware) {
51
+ throw new Error("authMiddleware is not set.");
52
+ }
53
+ if (!this.objectFactory) {
54
+ throw new Error("objectFactory is not set.");
55
+ }
56
+ if (!this.aliasRepo && this.aliasClass) {
57
+ this.aliasRepo = await this.objectFactory.newInstance(RepoUtils, {
58
+ name: this.aliasClass.name,
59
+ args: [this.aliasClass],
60
+ });
61
+ }
62
+ if (!this.secretRepo && this.secretClass) {
63
+ this.secretRepo = await this.objectFactory.newInstance(RepoUtils, {
64
+ name: this.secretClass.name,
65
+ args: [this.secretClass],
66
+ });
67
+ }
68
+ if (!this.userRepo && this.userClass) {
69
+ this.userRepo = await this.objectFactory.newInstance(RepoUtils, {
70
+ name: this.userClass.name,
71
+ args: [this.userClass],
72
+ });
73
+ }
74
+ if (!this.userUtils && this.userClass && this.aliasClass) {
75
+ this.userUtils = await this.objectFactory.newInstance(UserUtils, {
76
+ name: "default",
77
+ args: [this.userClass, this.aliasClass],
78
+ });
79
+ }
80
+ const options = new FIDO2StrategyOptions(this.fido2Config);
81
+ options.getCredentialById = this.getCredentialById.bind(this);
82
+ options.getCredentials = this.getCredentials.bind(this);
83
+ options.updateCredentialCounter = this.updateCredentialCounter.bind(this);
84
+ options.getUser = this.getUser.bind(this);
85
+ const strategy = await this.objectFactory.newInstance(FIDO2Strategy, {
86
+ name: "default",
87
+ args: [options],
88
+ });
89
+ this.authMiddleware.register(strategy.name, strategy);
90
+ }
91
+ /**
92
+ * Authenticates the user using a FIDO2 hardware security key and returns a JSON Web Token access
93
+ * token to be used with future API requests.
94
+ */
95
+ async authenticate(user) {
96
+ const token = await JWTUtils.createToken(this.jwtConfig, user);
97
+ return new AuthResult({
98
+ token,
99
+ user,
100
+ });
101
+ }
102
+ async getCredentialById(credentialId) {
103
+ if (!this.secretRepo) {
104
+ throw new Error("secretRepo is not set.");
105
+ }
106
+ const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
107
+ return secret?.data;
108
+ }
109
+ async getCredentials(id) {
110
+ if (!this.secretRepo) {
111
+ throw new Error("secretRepo is not set.");
112
+ }
113
+ if (!this.userUtils) {
114
+ throw new Error("userUtils is not set.");
115
+ }
116
+ const user = await this.userUtils.lookup(id);
117
+ if (!user) {
118
+ throw new Error("Invalid authentication request.");
119
+ }
120
+ // Retrieve all FIDO2 secrets associated with this user
121
+ const secrets = await this.secretRepo.find({ type: SecretType.FIDO2, userUid: user.uid }, { ignoreACL: true });
122
+ // Extract the credential data from the secrets and return
123
+ const results = [];
124
+ secrets.forEach((secret) => results.push(secret.data));
125
+ return results;
126
+ }
127
+ /**
128
+ * Retrieve the user associated with a given uid or alias.
129
+ *
130
+ * @param id The unqique id of the user or alias to lookup.
131
+ */
132
+ async getUser(id) {
133
+ if (!this.userUtils) {
134
+ throw new Error("userUtils is not set.");
135
+ }
136
+ return await this.userUtils.lookup(id);
137
+ }
138
+ async updateCredentialCounter(credentialId, newCounter) {
139
+ if (!this.secretRepo) {
140
+ throw new Error("secretRepo is not set.");
141
+ }
142
+ const secret = await this.secretRepo.findOne(credentialId, { ignoreACL: true });
143
+ if (secret) {
144
+ secret.data.counter = newCounter;
145
+ await this.secretRepo.update({
146
+ uid: secret.uid,
147
+ version: secret.version,
148
+ data: secret.data,
149
+ }, secret, { ignoreACL: true, recordEvent: false });
150
+ }
151
+ }
152
+ }
153
+ __decorate([
154
+ Inject(AuthMiddleware),
155
+ __metadata("design:type", AuthMiddleware)
156
+ ], BaseAuthFIDO2Route.prototype, "authMiddleware", void 0);
157
+ __decorate([
158
+ Config("auth"),
159
+ __metadata("design:type", Object)
160
+ ], BaseAuthFIDO2Route.prototype, "jwtConfig", void 0);
161
+ __decorate([
162
+ Inject(ObjectFactory),
163
+ __metadata("design:type", ObjectFactory)
164
+ ], BaseAuthFIDO2Route.prototype, "objectFactory", void 0);
165
+ __decorate([
166
+ Inject(MessagingUtils),
167
+ __metadata("design:type", MessagingUtils)
168
+ ], BaseAuthFIDO2Route.prototype, "messagingUtils", void 0);
169
+ __decorate([
170
+ Config("auth:fido2"),
171
+ __metadata("design:type", Object)
172
+ ], BaseAuthFIDO2Route.prototype, "fido2Config", void 0);
173
+ __decorate([
174
+ Init,
175
+ __metadata("design:type", Function),
176
+ __metadata("design:paramtypes", []),
177
+ __metadata("design:returntype", Promise)
178
+ ], BaseAuthFIDO2Route.prototype, "initialize", null);
179
+ __decorate([
180
+ Summary("Authenticate FIDO2"),
181
+ Description("Authenticates the user using a FIDO2 hardware security key and returns a JSON Web Token access token to be used with future API requests."),
182
+ Returns([AuthResult, undefined]),
183
+ Auth(["fido2"]),
184
+ Get(),
185
+ Post(),
186
+ __param(0, AuthUser),
187
+ __metadata("design:type", Function),
188
+ __metadata("design:paramtypes", [Object]),
189
+ __metadata("design:returntype", Promise)
190
+ ], BaseAuthFIDO2Route.prototype, "authenticate", null);
191
+ //# sourceMappingURL=BaseAuthFIDO2Route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseAuthFIDO2Route.js","sourceRoot":"","sources":["../../../src/routes/BaseAuthFIDO2Route.ts"],"names":[],"mappings":"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"}