binoauth 0.0.11 → 0.0.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 (111) hide show
  1. package/README.md +359 -165
  2. package/dist/core/src/admin/client.d.ts +203 -0
  3. package/dist/core/src/admin/client.d.ts.map +1 -0
  4. package/dist/core/src/admin/client.js +391 -0
  5. package/dist/core/src/admin/client.js.map +1 -0
  6. package/dist/core/src/admin/index.d.ts +6 -0
  7. package/dist/core/src/admin/index.d.ts.map +1 -0
  8. package/dist/core/src/admin/index.js +5 -0
  9. package/dist/core/src/admin/index.js.map +1 -0
  10. package/dist/core/src/admin/types.d.ts +412 -0
  11. package/dist/core/src/admin/types.d.ts.map +1 -0
  12. package/dist/core/src/admin/types.js +5 -0
  13. package/dist/core/src/admin/types.js.map +1 -0
  14. package/dist/core/src/auth/client.d.ts +330 -0
  15. package/dist/core/src/auth/client.d.ts.map +1 -0
  16. package/dist/core/src/auth/client.js +408 -0
  17. package/dist/core/src/auth/client.js.map +1 -0
  18. package/dist/core/src/auth/error.d.ts +113 -0
  19. package/dist/core/src/auth/error.d.ts.map +1 -0
  20. package/dist/core/src/auth/error.js +257 -0
  21. package/dist/core/src/auth/error.js.map +1 -0
  22. package/dist/core/src/auth/flows/base-flow.d.ts +98 -0
  23. package/dist/core/src/auth/flows/base-flow.d.ts.map +1 -0
  24. package/dist/core/src/auth/flows/base-flow.js +182 -0
  25. package/dist/core/src/auth/flows/base-flow.js.map +1 -0
  26. package/dist/core/src/auth/flows/magic-link.d.ts +175 -0
  27. package/dist/core/src/auth/flows/magic-link.d.ts.map +1 -0
  28. package/dist/core/src/auth/flows/magic-link.js +228 -0
  29. package/dist/core/src/auth/flows/magic-link.js.map +1 -0
  30. package/dist/core/src/auth/flows/mfa.d.ts +81 -0
  31. package/dist/core/src/auth/flows/mfa.d.ts.map +1 -0
  32. package/dist/core/src/auth/flows/mfa.js +103 -0
  33. package/dist/core/src/auth/flows/mfa.js.map +1 -0
  34. package/dist/core/src/auth/flows/otp.d.ts +172 -0
  35. package/dist/core/src/auth/flows/otp.d.ts.map +1 -0
  36. package/dist/core/src/auth/flows/otp.js +222 -0
  37. package/dist/core/src/auth/flows/otp.js.map +1 -0
  38. package/dist/core/src/auth/flows/password.d.ts +242 -0
  39. package/dist/core/src/auth/flows/password.d.ts.map +1 -0
  40. package/dist/core/src/auth/flows/password.js +344 -0
  41. package/dist/core/src/auth/flows/password.js.map +1 -0
  42. package/dist/core/src/auth/flows/social.d.ts +209 -0
  43. package/dist/core/src/auth/flows/social.d.ts.map +1 -0
  44. package/dist/core/src/auth/flows/social.js +284 -0
  45. package/dist/core/src/auth/flows/social.js.map +1 -0
  46. package/dist/core/src/auth/index.d.ts +19 -0
  47. package/dist/core/src/auth/index.d.ts.map +1 -0
  48. package/dist/core/src/auth/index.js +32 -0
  49. package/dist/core/src/auth/index.js.map +1 -0
  50. package/dist/core/src/auth/types.d.ts +151 -0
  51. package/dist/core/src/auth/types.d.ts.map +1 -0
  52. package/dist/core/src/auth/types.js +7 -0
  53. package/dist/core/src/auth/types.js.map +1 -0
  54. package/dist/core/src/index.d.ts +53 -49
  55. package/dist/core/src/index.d.ts.map +1 -1
  56. package/dist/core/src/index.js +61 -343
  57. package/dist/core/src/index.js.map +1 -1
  58. package/dist/core/src/oauth/client.d.ts +322 -0
  59. package/dist/core/src/oauth/client.d.ts.map +1 -0
  60. package/dist/core/src/oauth/client.js +491 -0
  61. package/dist/core/src/oauth/client.js.map +1 -0
  62. package/dist/core/src/oauth/error.d.ts +18 -0
  63. package/dist/core/src/oauth/error.d.ts.map +1 -0
  64. package/dist/core/src/oauth/error.js +24 -0
  65. package/dist/core/src/oauth/error.js.map +1 -0
  66. package/dist/core/src/oauth/flows/authorization-code.d.ts +122 -0
  67. package/dist/core/src/oauth/flows/authorization-code.d.ts.map +1 -0
  68. package/dist/core/src/oauth/flows/authorization-code.js +278 -0
  69. package/dist/core/src/oauth/flows/authorization-code.js.map +1 -0
  70. package/dist/core/src/oauth/flows/base-flow.d.ts +17 -0
  71. package/dist/core/src/oauth/flows/base-flow.d.ts.map +1 -0
  72. package/dist/core/src/oauth/flows/base-flow.js +107 -0
  73. package/dist/core/src/oauth/flows/base-flow.js.map +1 -0
  74. package/dist/core/src/oauth/flows/client-credentials.d.ts +72 -0
  75. package/dist/core/src/oauth/flows/client-credentials.d.ts.map +1 -0
  76. package/dist/core/src/oauth/flows/client-credentials.js +100 -0
  77. package/dist/core/src/oauth/flows/client-credentials.js.map +1 -0
  78. package/dist/core/src/oauth/flows/device-code.d.ts +108 -0
  79. package/dist/core/src/oauth/flows/device-code.d.ts.map +1 -0
  80. package/dist/core/src/oauth/flows/device-code.js +193 -0
  81. package/dist/core/src/oauth/flows/device-code.js.map +1 -0
  82. package/dist/core/src/oauth/flows/refresh-token.d.ts +59 -0
  83. package/dist/core/src/oauth/flows/refresh-token.d.ts.map +1 -0
  84. package/dist/core/src/oauth/flows/refresh-token.js +105 -0
  85. package/dist/core/src/oauth/flows/refresh-token.js.map +1 -0
  86. package/dist/core/src/oauth/index.d.ts +12 -0
  87. package/dist/core/src/oauth/index.d.ts.map +1 -0
  88. package/dist/core/src/oauth/index.js +11 -0
  89. package/dist/core/src/oauth/index.js.map +1 -0
  90. package/dist/core/src/oauth/storage/encryption.d.ts +12 -0
  91. package/dist/core/src/oauth/storage/encryption.d.ts.map +1 -0
  92. package/dist/core/src/oauth/storage/encryption.js +76 -0
  93. package/dist/core/src/oauth/storage/encryption.js.map +1 -0
  94. package/dist/core/src/oauth/storage/index.d.ts +201 -0
  95. package/dist/core/src/oauth/storage/index.d.ts.map +1 -0
  96. package/dist/core/src/oauth/storage/index.js +322 -0
  97. package/dist/core/src/oauth/storage/index.js.map +1 -0
  98. package/dist/core/src/oauth/storage/strategies.d.ts +34 -0
  99. package/dist/core/src/oauth/storage/strategies.d.ts.map +1 -0
  100. package/dist/core/src/oauth/storage/strategies.js +100 -0
  101. package/dist/core/src/oauth/storage/strategies.js.map +1 -0
  102. package/dist/core/src/oauth/types.d.ts +261 -0
  103. package/dist/core/src/oauth/types.d.ts.map +1 -0
  104. package/dist/core/src/oauth/types.js +39 -0
  105. package/dist/core/src/oauth/types.js.map +1 -0
  106. package/dist/core/src/oauth/utils.d.ts +56 -0
  107. package/dist/core/src/oauth/utils.d.ts.map +1 -0
  108. package/dist/core/src/oauth/utils.js +140 -0
  109. package/dist/core/src/oauth/utils.js.map +1 -0
  110. package/dist/tsconfig.tsbuildinfo +1 -1
  111. package/package.json +1 -1
@@ -0,0 +1,322 @@
1
+ import type { AuthConfig, BinoAuthConfig, StorageConfig, User, DeviceCodeResponse } from "./types";
2
+ import { TokenStorage } from "./storage";
3
+ /**
4
+ * BinoAuth OAuth 2.0 Client
5
+ *
6
+ * A comprehensive OAuth 2.0 client that supports multiple grant types
7
+ * including Authorization Code, Device Code, Client Credentials, and Refresh Token flows.
8
+ *
9
+ * Features:
10
+ * - Automatic token refresh and management
11
+ * - PKCE support for secure authentication
12
+ * - Device authorization for IoT and limited-input devices
13
+ * - Server-to-server authentication with client credentials
14
+ * - Secure token storage with encryption
15
+ * - Rate limiting and CSRF protection
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { BinoAuthOAuth, InMemoryTokenStorage } from 'binoauth';
20
+ *
21
+ * // Simple configuration using issuer
22
+ * const client = new BinoAuthOAuth({
23
+ * issuer: 'https://auth.binoauth.com',
24
+ * clientId: 'your_client_id',
25
+ * redirectUri: 'https://yourapp.com/callback',
26
+ * scope: 'openid profile email'
27
+ * }, {
28
+ * storage: new InMemoryTokenStorage(),
29
+ * clientId: 'your_client_id'
30
+ * });
31
+ *
32
+ * // Authorization Code Flow (for web/mobile apps)
33
+ * const loginUrl = await client.getLoginUrl();
34
+ * window.location.href = loginUrl;
35
+ *
36
+ * // Handle callback after user returns
37
+ * const urlParams = new URLSearchParams(window.location.search);
38
+ * await client.handleCallback(
39
+ * urlParams.get('code')!,
40
+ * urlParams.get('state')!
41
+ * );
42
+ *
43
+ * // Check authentication status
44
+ * const isLoggedIn = await client.isAuthenticated();
45
+ * if (isLoggedIn) {
46
+ * const userInfo = await client.getUserInfo();
47
+ * console.log('Logged in as:', userInfo.email);
48
+ * }
49
+ * ```
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Device Code Flow (for TVs, IoT devices, CLI tools)
54
+ * const deviceAuth = await client.requestDeviceCode();
55
+ * console.log(`Visit: ${deviceAuth.verification_uri}`);
56
+ * console.log(`Enter code: ${deviceAuth.user_code}`);
57
+ *
58
+ * // Poll for authorization
59
+ * const pollInterval = deviceAuth.interval * 1000;
60
+ * while (true) {
61
+ * try {
62
+ * await client.pollForToken(deviceAuth.device_code);
63
+ * console.log('Device authorized successfully!');
64
+ * break;
65
+ * } catch (error) {
66
+ * if (error.code === 'authorization_pending') {
67
+ * await new Promise(resolve => setTimeout(resolve, pollInterval));
68
+ * continue;
69
+ * }
70
+ * throw error;
71
+ * }
72
+ * }
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Client Credentials Flow (for server-to-server)
78
+ * client.initializeClientCredentials('your_client_secret');
79
+ * await client.getClientCredentialsTokens();
80
+ *
81
+ * // Use token for API calls
82
+ * const accessToken = await client.getAccessToken();
83
+ * const response = await fetch('/api/protected', {
84
+ * headers: { 'Authorization': `Bearer ${accessToken}` }
85
+ * });
86
+ * ```
87
+ */
88
+ export declare class BinoAuthOAuth {
89
+ private config;
90
+ private storage;
91
+ private oauthApi?;
92
+ private authCodeFlow;
93
+ private refreshFlow;
94
+ private deviceFlow;
95
+ private clientCredentialsFlow?;
96
+ /**
97
+ * Creates a new BinoAuth OAuth client
98
+ *
99
+ * @param config - OAuth configuration (can use simplified BinoAuthConfig with issuer)
100
+ * @param storageConfig - Token storage configuration
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // Simple configuration with issuer
105
+ * const client = new BinoAuthOAuth({
106
+ * issuer: 'https://auth.binoauth.com',
107
+ * clientId: 'your_client_id',
108
+ * redirectUri: 'https://yourapp.com/callback'
109
+ * }, {
110
+ * storage: new InMemoryTokenStorage(),
111
+ * clientId: 'your_client_id'
112
+ * });
113
+ *
114
+ * // Full configuration
115
+ * const client = new BinoAuthOAuth({
116
+ * clientId: 'your_client_id',
117
+ * redirectUri: 'https://yourapp.com/callback',
118
+ * authorizeEndpoint: 'https://auth.binoauth.com/api/v1/oauth/authorize',
119
+ * tokenEndpoint: 'https://auth.binoauth.com/api/v1/oauth/token',
120
+ * userInfoEndpoint: 'https://auth.binoauth.com/api/v1/oauth/userinfo'
121
+ * }, storageConfig);
122
+ * ```
123
+ */
124
+ constructor(config: BinoAuthConfig | AuthConfig, storageConfig: StorageConfig);
125
+ /**
126
+ * Initializes client credentials flow for server-to-server authentication
127
+ *
128
+ * @param clientSecret - The client secret for authentication
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * client.initializeClientCredentials('your_client_secret');
133
+ * await client.getClientCredentialsTokens();
134
+ * ```
135
+ */
136
+ initializeClientCredentials(clientSecret: string): void;
137
+ /**
138
+ * Updates the token storage instance
139
+ *
140
+ * @param tokenStorage - New token storage instance
141
+ */
142
+ setTokenStorage(tokenStorage: TokenStorage): void;
143
+ /**
144
+ * Gets the current token storage instance
145
+ *
146
+ * @returns The current token storage
147
+ */
148
+ getTokenStorage(): TokenStorage;
149
+ /**
150
+ * Generates the authorization URL for the OAuth flow
151
+ *
152
+ * @returns Promise resolving to the authorization URL
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const loginUrl = await client.getLoginUrl();
157
+ * window.location.href = loginUrl; // Redirect user to BinoAuth
158
+ * ```
159
+ */
160
+ getLoginUrl(): Promise<string>;
161
+ /**
162
+ * Handles the OAuth callback and exchanges code for tokens
163
+ *
164
+ * @param code - Authorization code from callback
165
+ * @param state - State parameter from callback
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * const urlParams = new URLSearchParams(window.location.search);
170
+ * await client.handleCallback(
171
+ * urlParams.get('code')!,
172
+ * urlParams.get('state')!
173
+ * );
174
+ * ```
175
+ */
176
+ handleCallback(code: string, state: string): Promise<void>;
177
+ /**
178
+ * Generates the logout URL
179
+ *
180
+ * @returns Promise resolving to the logout URL
181
+ */
182
+ getLogoutUrl(): Promise<string>;
183
+ /**
184
+ * Generates the logout page URL with optional return URL
185
+ *
186
+ * @param returnTo - Optional URL to redirect to after logout
187
+ * @returns Promise resolving to the logout page URL
188
+ */
189
+ getLogoutPageUrl(returnTo?: string): Promise<string>;
190
+ /**
191
+ * Initiates device authorization flow
192
+ *
193
+ * @returns Promise resolving to device authorization response
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * const deviceAuth = await client.requestDeviceCode();
198
+ * console.log(`Visit: ${deviceAuth.verification_uri}`);
199
+ * console.log(`Enter code: ${deviceAuth.user_code}`);
200
+ * ```
201
+ */
202
+ requestDeviceCode(): Promise<DeviceCodeResponse>;
203
+ /**
204
+ * Polls for token using device code
205
+ *
206
+ * @param deviceCode - Device code from requestDeviceCode()
207
+ *
208
+ * @example
209
+ * ```typescript
210
+ * try {
211
+ * await client.pollForToken(deviceAuth.device_code);
212
+ * console.log('Device authorized!');
213
+ * } catch (error) {
214
+ * if (error.code === 'authorization_pending') {
215
+ * // User hasn't entered code yet, continue polling
216
+ * }
217
+ * }
218
+ * ```
219
+ */
220
+ pollForToken(deviceCode: string): Promise<void>;
221
+ /**
222
+ * Requests tokens using client credentials flow
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * client.initializeClientCredentials('your_client_secret');
227
+ * await client.getClientCredentialsTokens();
228
+ *
229
+ * const accessToken = await client.getAccessToken();
230
+ * // Use token for server-to-server API calls
231
+ * ```
232
+ *
233
+ * @throws {AuthError} When client credentials flow is not initialized
234
+ */
235
+ getClientCredentialsTokens(): Promise<void>;
236
+ /**
237
+ * Gets a valid access token, automatically refreshing if needed
238
+ *
239
+ * @returns Promise resolving to access token or null if not authenticated
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * const accessToken = await client.getAccessToken();
244
+ * if (accessToken) {
245
+ * const response = await fetch('/api/protected', {
246
+ * headers: { 'Authorization': `Bearer ${accessToken}` }
247
+ * });
248
+ * }
249
+ * ```
250
+ */
251
+ getAccessToken(): Promise<string | null>;
252
+ /**
253
+ * Manually refreshes access tokens using refresh token
254
+ *
255
+ * @example
256
+ * ```typescript
257
+ * try {
258
+ * await client.refreshTokens();
259
+ * console.log('Tokens refreshed successfully');
260
+ * } catch (error) {
261
+ * console.log('Token refresh failed:', error.message);
262
+ * }
263
+ * ```
264
+ */
265
+ refreshTokens(): Promise<void>;
266
+ /**
267
+ * Fetches authenticated user information
268
+ *
269
+ * @returns Promise resolving to user info or null if not authenticated
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * const userInfo = await client.getUserInfo();
274
+ * if (userInfo) {
275
+ * console.log(`Welcome, ${userInfo.name}!`);
276
+ * console.log(`Email: ${userInfo.email}`);
277
+ * }
278
+ * ```
279
+ *
280
+ * @throws {AuthError} When userInfoEndpoint is missing from config
281
+ */
282
+ getUserInfo(): Promise<User | null>;
283
+ /**
284
+ * Checks if the user is currently authenticated
285
+ *
286
+ * Automatically attempts token refresh if access token is expired
287
+ * but refresh token is still valid.
288
+ *
289
+ * @returns Promise resolving to true if authenticated, false otherwise
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * if (await client.isAuthenticated()) {
294
+ * // User is logged in, show authenticated content
295
+ * const userInfo = await client.getUserInfo();
296
+ * } else {
297
+ * // User needs to log in
298
+ * const loginUrl = await client.getLoginUrl();
299
+ * window.location.href = loginUrl;
300
+ * }
301
+ * ```
302
+ */
303
+ isAuthenticated(): Promise<boolean>;
304
+ /**
305
+ * Logs out the user and revokes tokens
306
+ *
307
+ * Attempts to revoke tokens on the server if revoke endpoint is configured,
308
+ * then clears local token storage.
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * await client.logout();
313
+ * console.log('User logged out successfully');
314
+ *
315
+ * // Redirect to login page
316
+ * const loginUrl = await client.getLoginUrl();
317
+ * window.location.href = loginUrl;
318
+ * ```
319
+ */
320
+ logout(): Promise<void>;
321
+ }
322
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/oauth/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEnG,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AASzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAC,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;gBACS,MAAM,EAAE,cAAc,GAAG,UAAU,EAAE,aAAa,EAAE,aAAa;IA2B7E;;;;;;;;;;OAUG;IACH,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQvD;;;;OAIG;IACH,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAIjD;;;;OAIG;IACH,eAAe,IAAI,YAAY;IAM/B;;;;;;;;;;OAUG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC;;;;;;;;;;;;;;OAcG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM1D;;;;;;;;;;;OAWG;IACG,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAItD;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;;;;;;;;;OAaG;IACG,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjD;;;;;;;;;;;;;;OAcG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB9C;;;;;;;;;;;;OAYG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;;;;;;;;;;;;;;OAeG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA4CzC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAuBzC;;;;;;;;;;;;;;;OAeG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA0C9B"}