@prsm/auth 1.0.0

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 (61) hide show
  1. package/README.md +226 -0
  2. package/index.d.ts +19 -0
  3. package/package.json +76 -0
  4. package/src/__tests__/auth.test.js +1171 -0
  5. package/src/__tests__/impersonation-test-setup.js +208 -0
  6. package/src/__tests__/impersonation.test.js +473 -0
  7. package/src/__tests__/oauth-test-setup.js +136 -0
  8. package/src/__tests__/oauth.test.js +400 -0
  9. package/src/__tests__/prsm.test.js +215 -0
  10. package/src/__tests__/test-setup.js +385 -0
  11. package/src/__tests__/totp.test.js +158 -0
  12. package/src/__tests__/two-factor-test-setup.js +331 -0
  13. package/src/__tests__/two-factor.test.js +396 -0
  14. package/src/activity-logger.js +228 -0
  15. package/src/auth-context.js +120 -0
  16. package/src/auth-functions.js +520 -0
  17. package/src/auth-manager.js +1371 -0
  18. package/src/errors.js +173 -0
  19. package/src/hooks.js +41 -0
  20. package/src/index.js +23 -0
  21. package/src/invalidation.js +166 -0
  22. package/src/middleware.js +33 -0
  23. package/src/providers/azure-provider.js +114 -0
  24. package/src/providers/base-provider.js +152 -0
  25. package/src/providers/github-provider.js +86 -0
  26. package/src/providers/google-provider.js +76 -0
  27. package/src/providers/index.js +4 -0
  28. package/src/queries.js +543 -0
  29. package/src/schema.js +261 -0
  30. package/src/totp.js +221 -0
  31. package/src/two-factor/index.js +3 -0
  32. package/src/two-factor/otp-provider.js +128 -0
  33. package/src/two-factor/totp-provider.js +98 -0
  34. package/src/two-factor/two-factor-manager.js +676 -0
  35. package/src/types.js +399 -0
  36. package/src/user-roles.js +128 -0
  37. package/src/util.js +32 -0
  38. package/types/activity-logger.d.ts +73 -0
  39. package/types/auth-context.d.ts +88 -0
  40. package/types/auth-functions.d.ts +151 -0
  41. package/types/auth-manager.d.ts +365 -0
  42. package/types/errors.d.ts +108 -0
  43. package/types/hooks.d.ts +30 -0
  44. package/types/index.d.ts +13 -0
  45. package/types/invalidation.d.ts +40 -0
  46. package/types/middleware.d.ts +11 -0
  47. package/types/providers/azure-provider.d.ts +35 -0
  48. package/types/providers/base-provider.d.ts +52 -0
  49. package/types/providers/github-provider.d.ts +29 -0
  50. package/types/providers/google-provider.d.ts +29 -0
  51. package/types/providers/index.d.ts +4 -0
  52. package/types/queries.d.ts +287 -0
  53. package/types/schema.d.ts +37 -0
  54. package/types/totp.d.ts +72 -0
  55. package/types/two-factor/index.d.ts +3 -0
  56. package/types/two-factor/otp-provider.d.ts +57 -0
  57. package/types/two-factor/totp-provider.d.ts +58 -0
  58. package/types/two-factor/two-factor-manager.d.ts +191 -0
  59. package/types/types.d.ts +688 -0
  60. package/types/user-roles.d.ts +47 -0
  61. package/types/util.d.ts +3 -0
@@ -0,0 +1,98 @@
1
+ import Otp from "../totp.js"
2
+ import hash from "@prsm/hash"
3
+
4
+ /**
5
+ * @typedef {import("../types.js").AuthConfig} AuthConfig
6
+ */
7
+
8
+ export class TotpProvider {
9
+ /**
10
+ * @param {AuthConfig} config
11
+ */
12
+ constructor(config) {
13
+ this.config = config
14
+ }
15
+
16
+ /**
17
+ * Generate a new base32 TOTP shared secret.
18
+ * @returns {string}
19
+ */
20
+ generateSecret() {
21
+ return Otp.createSecret()
22
+ }
23
+
24
+ /**
25
+ * Build an otpauth:// URI for QR-code provisioning.
26
+ * @param {string} email
27
+ * @param {string} secret
28
+ * @returns {string}
29
+ */
30
+ generateQRCode(email, secret) {
31
+ const issuer = this.config.twoFactor?.issuer || "EasyAccess"
32
+ return Otp.createTotpKeyUriForQrCode(issuer, email, secret)
33
+ }
34
+
35
+ /**
36
+ * Verify a TOTP code against a secret using the configured drift window.
37
+ * @param {string} secret
38
+ * @param {string} code
39
+ * @returns {boolean}
40
+ */
41
+ verify(secret, code) {
42
+ const window = this.config.twoFactor?.totpWindow || 1
43
+ return Otp.verifyTotp(secret, code, window)
44
+ }
45
+
46
+ /**
47
+ * Generate random alphanumeric backup codes.
48
+ * @param {number} [count]
49
+ * @returns {string[]}
50
+ */
51
+ generateBackupCodes(count = 10) {
52
+ const chars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"
53
+ const codes = []
54
+ for (let i = 0; i < count; i++) {
55
+ const bytes = crypto.getRandomValues(new Uint8Array(8))
56
+ codes.push(Array.from(bytes, (b) => chars[b % chars.length]).join(""))
57
+ }
58
+ return codes
59
+ }
60
+
61
+ /**
62
+ * Hash a set of backup codes for storage.
63
+ * @param {string[]} codes
64
+ * @returns {Promise<string[]>}
65
+ */
66
+ async hashBackupCodes(codes) {
67
+ return await Promise.all(codes.map((code) => hash.encode(code)))
68
+ }
69
+
70
+ /**
71
+ * Verify an input backup code against hashed codes.
72
+ * @param {string[]} hashedCodes
73
+ * @param {string} inputCode
74
+ * @returns {Promise<{ isValid: boolean, index: number }>}
75
+ */
76
+ async verifyBackupCode(hashedCodes, inputCode) {
77
+ for (let i = 0; i < hashedCodes.length; i++) {
78
+ if (await hash.verify(hashedCodes[i], inputCode.toUpperCase())) {
79
+ return { isValid: true, index: i }
80
+ }
81
+ }
82
+
83
+ return { isValid: false, index: -1 }
84
+ }
85
+
86
+ /**
87
+ * Mask an email address for display.
88
+ * @param {string} email
89
+ * @returns {string}
90
+ */
91
+ maskEmail(email) {
92
+ const [username, domain] = email.split("@")
93
+ if (username.length <= 2) {
94
+ return `${username[0]}***@${domain}`
95
+ }
96
+ return `${username[0]}${"*".repeat(username.length - 2)}${username[username.length - 1]}@${domain}`
97
+ }
98
+ }