@autonomous-ai/auth-sdk 1.0.7
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.
- package/README.md +300 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +224 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/pkce.d.ts +34 -0
- package/dist/pkce.d.ts.map +1 -0
- package/dist/pkce.js +85 -0
- package/dist/pkce.js.map +1 -0
- package/dist/react/AuthProvider.d.ts +25 -0
- package/dist/react/AuthProvider.d.ts.map +1 -0
- package/dist/react/AuthProvider.js +111 -0
- package/dist/react/AuthProvider.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useAuth.d.ts +21 -0
- package/dist/react/useAuth.d.ts.map +1 -0
- package/dist/react/useAuth.js +23 -0
- package/dist/react/useAuth.js.map +1 -0
- package/dist/react/useCallback.d.ts +31 -0
- package/dist/react/useCallback.d.ts.map +1 -0
- package/dist/react/useCallback.js +78 -0
- package/dist/react/useCallback.js.map +1 -0
- package/dist/react/useUser.d.ts +22 -0
- package/dist/react/useUser.d.ts.map +1 -0
- package/dist/react/useUser.js +25 -0
- package/dist/react/useUser.js.map +1 -0
- package/dist/storage.d.ts +49 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +139 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +157 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +62 -0
package/dist/pkce.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PKCE (Proof Key for Code Exchange) utilities
|
|
3
|
+
* Implements RFC 7636 for OAuth2 authorization code flow security
|
|
4
|
+
*/
|
|
5
|
+
const CODE_VERIFIER_KEY = 'auth_sdk_pkce_verifier';
|
|
6
|
+
const STATE_KEY = 'auth_sdk_oauth2_state';
|
|
7
|
+
const NEXT_URL_KEY = 'auth_sdk_next_url';
|
|
8
|
+
/**
|
|
9
|
+
* Generate a cryptographically random code verifier (43-128 chars)
|
|
10
|
+
*/
|
|
11
|
+
export function generateCodeVerifier() {
|
|
12
|
+
const array = new Uint8Array(32);
|
|
13
|
+
crypto.getRandomValues(array);
|
|
14
|
+
return base64UrlEncode(array);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate code challenge from verifier using SHA-256 (S256 method)
|
|
18
|
+
*/
|
|
19
|
+
export async function generateCodeChallenge(verifier) {
|
|
20
|
+
const encoder = new TextEncoder();
|
|
21
|
+
const data = encoder.encode(verifier);
|
|
22
|
+
const hash = await crypto.subtle.digest('SHA-256', data);
|
|
23
|
+
return base64UrlEncode(new Uint8Array(hash));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate random state for CSRF protection
|
|
27
|
+
*/
|
|
28
|
+
export function generateState() {
|
|
29
|
+
const array = new Uint8Array(16);
|
|
30
|
+
crypto.getRandomValues(array);
|
|
31
|
+
return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Base64 URL encode (RFC 4648 Section 5)
|
|
35
|
+
*/
|
|
36
|
+
function base64UrlEncode(buffer) {
|
|
37
|
+
let binary = '';
|
|
38
|
+
for (let i = 0; i < buffer.byteLength; i++) {
|
|
39
|
+
binary += String.fromCharCode(buffer[i]);
|
|
40
|
+
}
|
|
41
|
+
return btoa(binary)
|
|
42
|
+
.replace(/\+/g, '-')
|
|
43
|
+
.replace(/\//g, '_')
|
|
44
|
+
.replace(/=+$/, '');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* PKCE and state storage using sessionStorage
|
|
48
|
+
* (More secure than localStorage for PKCE verifier)
|
|
49
|
+
*/
|
|
50
|
+
export const pkceStorage = {
|
|
51
|
+
setCodeVerifier(verifier) {
|
|
52
|
+
sessionStorage.setItem(CODE_VERIFIER_KEY, verifier);
|
|
53
|
+
},
|
|
54
|
+
getCodeVerifier() {
|
|
55
|
+
return sessionStorage.getItem(CODE_VERIFIER_KEY);
|
|
56
|
+
},
|
|
57
|
+
clearCodeVerifier() {
|
|
58
|
+
sessionStorage.removeItem(CODE_VERIFIER_KEY);
|
|
59
|
+
},
|
|
60
|
+
setState(state) {
|
|
61
|
+
sessionStorage.setItem(STATE_KEY, state);
|
|
62
|
+
},
|
|
63
|
+
getState() {
|
|
64
|
+
return sessionStorage.getItem(STATE_KEY);
|
|
65
|
+
},
|
|
66
|
+
clearState() {
|
|
67
|
+
sessionStorage.removeItem(STATE_KEY);
|
|
68
|
+
},
|
|
69
|
+
setNextUrl(url) {
|
|
70
|
+
sessionStorage.setItem(NEXT_URL_KEY, url);
|
|
71
|
+
},
|
|
72
|
+
getNextUrl() {
|
|
73
|
+
return sessionStorage.getItem(NEXT_URL_KEY);
|
|
74
|
+
},
|
|
75
|
+
clearNextUrl() {
|
|
76
|
+
sessionStorage.removeItem(NEXT_URL_KEY);
|
|
77
|
+
},
|
|
78
|
+
/** Clear all PKCE-related data */
|
|
79
|
+
clear() {
|
|
80
|
+
this.clearCodeVerifier();
|
|
81
|
+
this.clearState();
|
|
82
|
+
this.clearNextUrl();
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=pkce.js.map
|
package/dist/pkce.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../src/pkce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React, { type ReactNode } from 'react';
|
|
2
|
+
import type { AuthConfig, AuthContextValue, User } from '../types';
|
|
3
|
+
declare const AuthContext: React.Context<AuthContextValue | null>;
|
|
4
|
+
export interface AuthProviderProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
config: AuthConfig;
|
|
7
|
+
/** Auto-refresh tokens before expiry (default: true) */
|
|
8
|
+
autoRefresh?: boolean;
|
|
9
|
+
/** Seconds before expiry to trigger refresh (default: 60) */
|
|
10
|
+
refreshBuffer?: number;
|
|
11
|
+
/** Callback when authentication state changes */
|
|
12
|
+
onAuthChange?: (isAuthenticated: boolean, user: User | null) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function AuthProvider({ children, config, autoRefresh, refreshBuffer, onAuthChange, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
/**
|
|
16
|
+
* Hook to access auth context
|
|
17
|
+
* Must be used within AuthProvider
|
|
18
|
+
*/
|
|
19
|
+
export declare function useAuthContext(): AuthContextValue;
|
|
20
|
+
/**
|
|
21
|
+
* Get the AuthClient instance from context
|
|
22
|
+
* For advanced use cases
|
|
23
|
+
*/
|
|
24
|
+
export { AuthContext };
|
|
25
|
+
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/react/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAoB,IAAI,EAAiB,MAAM,UAAU,CAAC;AAEpG,QAAA,MAAM,WAAW,wCAA+C,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACtE;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,WAAkB,EAClB,aAAkB,EAClB,YAAY,GACb,EAAE,iBAAiB,2CA+GnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAMjD;AAED;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, useEffect, useCallback, useMemo, } from 'react';
|
|
3
|
+
import { AuthClient } from '../client';
|
|
4
|
+
const AuthContext = createContext(null);
|
|
5
|
+
export function AuthProvider({ children, config, autoRefresh = true, refreshBuffer = 60, onAuthChange, }) {
|
|
6
|
+
const [client] = useState(() => new AuthClient(config));
|
|
7
|
+
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
|
8
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
9
|
+
const [user, setUser] = useState(null);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
// Initialize auth state
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const initAuth = () => {
|
|
14
|
+
const authenticated = client.isAuthenticated();
|
|
15
|
+
const currentUser = client.getUser();
|
|
16
|
+
setIsAuthenticated(authenticated);
|
|
17
|
+
setUser(currentUser);
|
|
18
|
+
setIsLoading(false);
|
|
19
|
+
onAuthChange?.(authenticated, currentUser);
|
|
20
|
+
};
|
|
21
|
+
initAuth();
|
|
22
|
+
}, [client, onAuthChange]);
|
|
23
|
+
// Auto-refresh token before expiry
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!autoRefresh || !isAuthenticated)
|
|
26
|
+
return;
|
|
27
|
+
const checkAndRefresh = async () => {
|
|
28
|
+
if (client.isTokenExpired(refreshBuffer)) {
|
|
29
|
+
try {
|
|
30
|
+
await client.refreshToken();
|
|
31
|
+
const newUser = client.getUser();
|
|
32
|
+
setUser(newUser);
|
|
33
|
+
setIsAuthenticated(true);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
setError(err instanceof Error ? err : new Error('Token refresh failed'));
|
|
37
|
+
setIsAuthenticated(false);
|
|
38
|
+
setUser(null);
|
|
39
|
+
onAuthChange?.(false, null);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// Check immediately
|
|
44
|
+
checkAndRefresh();
|
|
45
|
+
// Check periodically (every 30 seconds)
|
|
46
|
+
const interval = setInterval(checkAndRefresh, 30000);
|
|
47
|
+
return () => clearInterval(interval);
|
|
48
|
+
}, [client, isAuthenticated, autoRefresh, refreshBuffer, onAuthChange]);
|
|
49
|
+
const login = useCallback(async (options) => {
|
|
50
|
+
setIsLoading(true);
|
|
51
|
+
setError(null);
|
|
52
|
+
try {
|
|
53
|
+
await client.authorize(options);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
setError(err instanceof Error ? err : new Error('Login failed'));
|
|
57
|
+
setIsLoading(false);
|
|
58
|
+
}
|
|
59
|
+
}, [client]);
|
|
60
|
+
const logout = useCallback((redirectUri) => {
|
|
61
|
+
client.logout(redirectUri);
|
|
62
|
+
}, [client]);
|
|
63
|
+
const getAccessToken = useCallback(() => {
|
|
64
|
+
return client.getAccessToken();
|
|
65
|
+
}, [client]);
|
|
66
|
+
const refreshToken = useCallback(async () => {
|
|
67
|
+
const tokens = await client.refreshToken();
|
|
68
|
+
const newUser = client.getUser();
|
|
69
|
+
setUser(newUser);
|
|
70
|
+
setIsAuthenticated(true);
|
|
71
|
+
onAuthChange?.(true, newUser);
|
|
72
|
+
return tokens;
|
|
73
|
+
}, [client, onAuthChange]);
|
|
74
|
+
const refreshAuthState = useCallback(() => {
|
|
75
|
+
const authenticated = client.isAuthenticated();
|
|
76
|
+
const currentUser = client.getUser();
|
|
77
|
+
setIsAuthenticated(authenticated);
|
|
78
|
+
setUser(currentUser);
|
|
79
|
+
setIsLoading(false);
|
|
80
|
+
onAuthChange?.(authenticated, currentUser);
|
|
81
|
+
}, [client, onAuthChange]);
|
|
82
|
+
const value = useMemo(() => ({
|
|
83
|
+
isAuthenticated,
|
|
84
|
+
isLoading,
|
|
85
|
+
user,
|
|
86
|
+
error,
|
|
87
|
+
login,
|
|
88
|
+
logout,
|
|
89
|
+
getAccessToken,
|
|
90
|
+
refreshToken,
|
|
91
|
+
refreshAuthState,
|
|
92
|
+
}), [isAuthenticated, isLoading, user, error, login, logout, getAccessToken, refreshToken, refreshAuthState]);
|
|
93
|
+
return _jsx(AuthContext.Provider, { value: value, children: children });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Hook to access auth context
|
|
97
|
+
* Must be used within AuthProvider
|
|
98
|
+
*/
|
|
99
|
+
export function useAuthContext() {
|
|
100
|
+
const context = useContext(AuthContext);
|
|
101
|
+
if (!context) {
|
|
102
|
+
throw new Error('useAuthContext must be used within an AuthProvider');
|
|
103
|
+
}
|
|
104
|
+
return context;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the AuthClient instance from context
|
|
108
|
+
* For advanced use cases
|
|
109
|
+
*/
|
|
110
|
+
export { AuthContext };
|
|
111
|
+
//# sourceMappingURL=AuthProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/react/AuthProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AuthProvider, useAuthContext, AuthContext } from './AuthProvider';
|
|
2
|
+
export type { AuthProviderProps } from './AuthProvider';
|
|
3
|
+
export { useAuth } from './useAuth';
|
|
4
|
+
export { useUser } from './useUser';
|
|
5
|
+
export { useAuthCallback } from './useCallback';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AuthContextValue } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to access authentication state and actions
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function LoginButton() {
|
|
8
|
+
* const { isAuthenticated, login, logout, isLoading } = useAuth();
|
|
9
|
+
*
|
|
10
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
11
|
+
*
|
|
12
|
+
* if (isAuthenticated) {
|
|
13
|
+
* return <button onClick={() => logout()}>Logout</button>;
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* return <button onClick={() => login()}>Login</button>;
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function useAuth(): AuthContextValue;
|
|
21
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/react/useAuth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,IAAI,gBAAgB,CAE1C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useAuthContext } from './AuthProvider';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to access authentication state and actions
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function LoginButton() {
|
|
8
|
+
* const { isAuthenticated, login, logout, isLoading } = useAuth();
|
|
9
|
+
*
|
|
10
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
11
|
+
*
|
|
12
|
+
* if (isAuthenticated) {
|
|
13
|
+
* return <button onClick={() => logout()}>Logout</button>;
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* return <button onClick={() => login()}>Login</button>;
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function useAuth() {
|
|
21
|
+
return useAuthContext();
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=useAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/react/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AuthConfig, CallbackResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to handle OAuth2 callback
|
|
4
|
+
* Use this on your callback page to exchange code for tokens
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* function CallbackPage() {
|
|
9
|
+
* const { isLoading, error, success } = useAuthCallback(authConfig);
|
|
10
|
+
*
|
|
11
|
+
* useEffect(() => {
|
|
12
|
+
* if (success) {
|
|
13
|
+
* navigate('/dashboard');
|
|
14
|
+
* }
|
|
15
|
+
* }, [success]);
|
|
16
|
+
*
|
|
17
|
+
* if (isLoading) return <div>Processing login...</div>;
|
|
18
|
+
* if (error) return <div>Error: {error}</div>;
|
|
19
|
+
*
|
|
20
|
+
* return null;
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function useAuthCallback(config: AuthConfig): {
|
|
25
|
+
isLoading: boolean;
|
|
26
|
+
error: string | null;
|
|
27
|
+
success: boolean;
|
|
28
|
+
result: CallbackResult | null;
|
|
29
|
+
nextUrl: string | undefined;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=useCallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCallback.d.ts","sourceRoot":"","sources":["../../src/react/useCallback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAyDA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { AuthClient } from '../client';
|
|
3
|
+
/**
|
|
4
|
+
* Hook to handle OAuth2 callback
|
|
5
|
+
* Use this on your callback page to exchange code for tokens
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* function CallbackPage() {
|
|
10
|
+
* const { isLoading, error, success } = useAuthCallback(authConfig);
|
|
11
|
+
*
|
|
12
|
+
* useEffect(() => {
|
|
13
|
+
* if (success) {
|
|
14
|
+
* navigate('/dashboard');
|
|
15
|
+
* }
|
|
16
|
+
* }, [success]);
|
|
17
|
+
*
|
|
18
|
+
* if (isLoading) return <div>Processing login...</div>;
|
|
19
|
+
* if (error) return <div>Error: {error}</div>;
|
|
20
|
+
*
|
|
21
|
+
* return null;
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function useAuthCallback(config) {
|
|
26
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
27
|
+
const [error, setError] = useState(null);
|
|
28
|
+
const [success, setSuccess] = useState(false);
|
|
29
|
+
const [result, setResult] = useState(null);
|
|
30
|
+
const [nextUrl, setNextUrl] = useState(undefined);
|
|
31
|
+
const processedRef = useRef(false);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
// Guard against double-invocation (React StrictMode)
|
|
34
|
+
if (processedRef.current)
|
|
35
|
+
return;
|
|
36
|
+
processedRef.current = true;
|
|
37
|
+
const handleCallback = async () => {
|
|
38
|
+
const params = new URLSearchParams(window.location.search);
|
|
39
|
+
const code = params.get('code');
|
|
40
|
+
const state = params.get('state');
|
|
41
|
+
const errorParam = params.get('error');
|
|
42
|
+
const errorDescription = params.get('error_description');
|
|
43
|
+
// Handle OAuth2 error response
|
|
44
|
+
if (errorParam) {
|
|
45
|
+
setError(errorDescription || errorParam);
|
|
46
|
+
setIsLoading(false);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Validate required parameters
|
|
50
|
+
if (!code || !state) {
|
|
51
|
+
setError('Missing code or state parameter');
|
|
52
|
+
setIsLoading(false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const client = new AuthClient(config);
|
|
57
|
+
const callbackResult = await client.handleCallback(code, state);
|
|
58
|
+
setResult(callbackResult);
|
|
59
|
+
if (callbackResult.success) {
|
|
60
|
+
setSuccess(true);
|
|
61
|
+
setNextUrl(callbackResult.nextUrl);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setError(callbackResult.error || 'Callback failed');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
setIsLoading(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
handleCallback();
|
|
75
|
+
}, [config]);
|
|
76
|
+
return { isLoading, error, success, result, nextUrl };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=useCallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCallback.js","sourceRoot":"","sources":["../../src/react/useCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAOhD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,qDAAqD;QACrD,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO;QACjC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAE5B,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAEzD,+BAA+B;YAC/B,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,CAAC,gBAAgB,IAAI,UAAU,CAAC,CAAC;gBACzC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,QAAQ,CAAC,iCAAiC,CAAC,CAAC;gBAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEhE,SAAS,CAAC,cAAc,CAAC,CAAC;gBAE1B,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACjE,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { User } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to get current user information
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function UserProfile() {
|
|
8
|
+
* const user = useUser();
|
|
9
|
+
*
|
|
10
|
+
* if (!user) return <div>Not logged in</div>;
|
|
11
|
+
*
|
|
12
|
+
* return (
|
|
13
|
+
* <div>
|
|
14
|
+
* <p>Email: {user.email}</p>
|
|
15
|
+
* <p>Name: {user.fullName}</p>
|
|
16
|
+
* </div>
|
|
17
|
+
* );
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function useUser(): User | null;
|
|
22
|
+
//# sourceMappingURL=useUser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUser.d.ts","sourceRoot":"","sources":["../../src/react/useUser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,IAAI,IAAI,GAAG,IAAI,CAGrC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useAuthContext } from './AuthProvider';
|
|
2
|
+
/**
|
|
3
|
+
* Hook to get current user information
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* function UserProfile() {
|
|
8
|
+
* const user = useUser();
|
|
9
|
+
*
|
|
10
|
+
* if (!user) return <div>Not logged in</div>;
|
|
11
|
+
*
|
|
12
|
+
* return (
|
|
13
|
+
* <div>
|
|
14
|
+
* <p>Email: {user.email}</p>
|
|
15
|
+
* <p>Name: {user.fullName}</p>
|
|
16
|
+
* </div>
|
|
17
|
+
* );
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function useUser() {
|
|
22
|
+
const { user } = useAuthContext();
|
|
23
|
+
return user;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=useUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUser.js","sourceRoot":"","sources":["../../src/react/useUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { JwtPayload, TokenResponse, TokenStorage, User } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Default localStorage-based token storage
|
|
4
|
+
*/
|
|
5
|
+
export declare const defaultStorage: TokenStorage;
|
|
6
|
+
/**
|
|
7
|
+
* Token manager for storing and retrieving tokens
|
|
8
|
+
*/
|
|
9
|
+
export declare class TokenManager {
|
|
10
|
+
private storage;
|
|
11
|
+
constructor(storage?: TokenStorage);
|
|
12
|
+
/**
|
|
13
|
+
* Save tokens from OAuth2 response
|
|
14
|
+
*/
|
|
15
|
+
setTokens(response: TokenResponse): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get access token
|
|
18
|
+
*/
|
|
19
|
+
getAccessToken(): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Get refresh token
|
|
22
|
+
*/
|
|
23
|
+
getRefreshToken(): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Get token expiry timestamp (in milliseconds)
|
|
26
|
+
*/
|
|
27
|
+
getTokenExpiry(): number | null;
|
|
28
|
+
/**
|
|
29
|
+
* Check if access token is expired or about to expire (within 60 seconds)
|
|
30
|
+
*/
|
|
31
|
+
isTokenExpired(bufferSeconds?: number): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if user is authenticated (has valid token)
|
|
34
|
+
*/
|
|
35
|
+
isAuthenticated(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Clear all tokens
|
|
38
|
+
*/
|
|
39
|
+
clearTokens(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Decode JWT payload (without verification)
|
|
42
|
+
*/
|
|
43
|
+
decodeToken(token: string): JwtPayload | null;
|
|
44
|
+
/**
|
|
45
|
+
* Get user info from current access token
|
|
46
|
+
*/
|
|
47
|
+
getUser(): User | null;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM7E;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAI5B,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,YAA6B;IAIlD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAYxC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAc/B;;OAEG;IACH,cAAc,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO;IAkBnD;;OAEG;IACH,eAAe,IAAI,OAAO;IAQ1B;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAa7C;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI;CAuBvB"}
|