@authu/react 1.0.10 → 1.0.30
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 +28 -1
- package/dist/AuthUProvider.d.ts.map +1 -1
- package/dist/AuthUProvider.js +8 -0
- package/dist/PrivateRoute.d.ts.map +1 -1
- package/dist/PrivateRoute.js +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,7 +61,7 @@ function Profile() {
|
|
|
61
61
|
|
|
62
62
|
### 3. Protect Routes
|
|
63
63
|
|
|
64
|
-
Use `PrivateRoute` to protect authenticated routes:
|
|
64
|
+
Use `PrivateRoute` to protect authenticated routes. It automatically triggers the OAuth login flow when the user is not authenticated:
|
|
65
65
|
|
|
66
66
|
```tsx
|
|
67
67
|
import {PrivateRoute} from '@authu/react';
|
|
@@ -83,6 +83,27 @@ function AppRoutes() {
|
|
|
83
83
|
}
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
+
#### PrivateRoute Props
|
|
87
|
+
|
|
88
|
+
| Prop | Type | Default | Description |
|
|
89
|
+
|------|------|---------|-------------|
|
|
90
|
+
| `children` | `ReactNode` | - | Content to render when authenticated |
|
|
91
|
+
| `fallback` | `ReactNode` | `null` | Content to show while loading or redirecting |
|
|
92
|
+
| `loginOnUnauthenticated` | `boolean` | `true` | Auto-trigger login when not authenticated |
|
|
93
|
+
|
|
94
|
+
#### Automatic Login Flow
|
|
95
|
+
|
|
96
|
+
When `loginOnUnauthenticated` is `true` (default), visiting a protected route triggers:
|
|
97
|
+
|
|
98
|
+
1. `PrivateRoute` checks `isAuthenticated`
|
|
99
|
+
2. If not authenticated → calls `login()` automatically
|
|
100
|
+
3. User is redirected to AuthU login page
|
|
101
|
+
4. After login, AuthU redirects back to the app
|
|
102
|
+
5. `AuthUProvider` exchanges the code for tokens
|
|
103
|
+
6. User is now authenticated and sees the protected content
|
|
104
|
+
|
|
105
|
+
This enables seamless SSO: users logged into AuthU are automatically authenticated in the app without extra clicks.
|
|
106
|
+
|
|
86
107
|
### 4. Get Access Token for API Calls
|
|
87
108
|
|
|
88
109
|
Use `useApiToken` to get tokens for authenticated API requests:
|
|
@@ -166,6 +187,12 @@ The `--access public` flag is required for scoped packages.
|
|
|
166
187
|
|
|
167
188
|
## Changelog
|
|
168
189
|
|
|
190
|
+
### 1.0.15
|
|
191
|
+
|
|
192
|
+
- **Feature**: Added `loginOnUnauthenticated` prop to `PrivateRoute` for automatic login triggering
|
|
193
|
+
- **Feature**: Added `fallback` prop to `PrivateRoute` for custom loading states
|
|
194
|
+
- **Docs**: Improved documentation for automatic SSO flow
|
|
195
|
+
|
|
169
196
|
### 1.0.10
|
|
170
197
|
|
|
171
198
|
- **Fix**: Changed PKCE storage from `sessionStorage` to `localStorage` to prevent state/code_verifier loss during cross-domain OAuth redirects
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthUProvider.d.ts","sourceRoot":"","sources":["../src/AuthUProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAgBpB,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAO1E,UAAU,kBAAkB;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAID,wBAAgB,aAAa,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAC,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"AuthUProvider.d.ts","sourceRoot":"","sources":["../src/AuthUProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAgBpB,eAAO,MAAM,YAAY,mDAAgD,CAAC;AAO1E,UAAU,kBAAkB;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAID,wBAAgB,aAAa,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAC,EAAE,kBAAkB,2CA0UnE"}
|
package/dist/AuthUProvider.js
CHANGED
|
@@ -79,6 +79,7 @@ export function AuthUProvider({ config, children }) {
|
|
|
79
79
|
};
|
|
80
80
|
const login = useCallback(async () => {
|
|
81
81
|
const url = await getAuthorizationUrl();
|
|
82
|
+
console.log('[AuthU SDK] login() called, redirecting to:', url);
|
|
82
83
|
window.location.href = url;
|
|
83
84
|
}, [getAuthorizationUrl]);
|
|
84
85
|
const logout = useCallback(() => {
|
|
@@ -164,10 +165,12 @@ export function AuthUProvider({ config, children }) {
|
|
|
164
165
|
}, [state.accessToken, state.expiresAt, refreshTokens]);
|
|
165
166
|
useEffect(() => {
|
|
166
167
|
const handleCallback = async () => {
|
|
168
|
+
console.log('[AuthU SDK] handleCallback starting, URL:', window.location.href);
|
|
167
169
|
const params = new URLSearchParams(window.location.search);
|
|
168
170
|
const code = params.get('code');
|
|
169
171
|
const returnedState = params.get('state');
|
|
170
172
|
const error = params.get('error');
|
|
173
|
+
console.log('[AuthU SDK] handleCallback params - code:', !!code, 'state:', returnedState, 'error:', error);
|
|
171
174
|
if (error) {
|
|
172
175
|
setState(prev => ({
|
|
173
176
|
...prev,
|
|
@@ -216,11 +219,14 @@ export function AuthUProvider({ config, children }) {
|
|
|
216
219
|
return;
|
|
217
220
|
}
|
|
218
221
|
const stored = localStorage.getItem(TOKEN_STORAGE_KEY);
|
|
222
|
+
console.log('[AuthU SDK] Checking localStorage for tokens:', !!stored);
|
|
219
223
|
if (stored) {
|
|
220
224
|
try {
|
|
221
225
|
const tokens = JSON.parse(stored);
|
|
226
|
+
console.log('[AuthU SDK] Found tokens, expiresAt:', tokens.expiresAt, 'now:', Date.now(), 'valid:', tokens.expiresAt > Date.now());
|
|
222
227
|
if (tokens.expiresAt > Date.now()) {
|
|
223
228
|
const user = await fetchUserInfo(tokens.accessToken);
|
|
229
|
+
console.log('[AuthU SDK] Tokens valid, user:', user);
|
|
224
230
|
setState({
|
|
225
231
|
isLoading: false,
|
|
226
232
|
isAuthenticated: true,
|
|
@@ -234,9 +240,11 @@ export function AuthUProvider({ config, children }) {
|
|
|
234
240
|
}
|
|
235
241
|
}
|
|
236
242
|
catch {
|
|
243
|
+
console.log('[AuthU SDK] Error parsing stored tokens, removing');
|
|
237
244
|
localStorage.removeItem(TOKEN_STORAGE_KEY);
|
|
238
245
|
}
|
|
239
246
|
}
|
|
247
|
+
console.log('[AuthU SDK] No valid tokens found, setting isLoading: false');
|
|
240
248
|
setState(prev => ({ ...prev, isLoading: false }));
|
|
241
249
|
};
|
|
242
250
|
handleCallback();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrivateRoute.d.ts","sourceRoot":"","sources":["../src/PrivateRoute.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAGrC,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,QAAe,EACf,sBAA6B,EAC9B,EAAE,iBAAiB,+
|
|
1
|
+
{"version":3,"file":"PrivateRoute.d.ts","sourceRoot":"","sources":["../src/PrivateRoute.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAGrC,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,QAAe,EACf,sBAA6B,EAC9B,EAAE,iBAAiB,+TA6BnB"}
|
package/dist/PrivateRoute.js
CHANGED
|
@@ -2,14 +2,19 @@ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { useAuthU } from './useAuthU.js';
|
|
3
3
|
export function PrivateRoute({ children, fallback = null, loginOnUnauthenticated = true }) {
|
|
4
4
|
const { isLoading, isAuthenticated, login } = useAuthU();
|
|
5
|
+
console.log('[AuthU SDK PrivateRoute] isLoading:', isLoading, 'isAuthenticated:', isAuthenticated);
|
|
5
6
|
if (isLoading) {
|
|
7
|
+
console.log('[AuthU SDK PrivateRoute] Loading...');
|
|
6
8
|
return fallback;
|
|
7
9
|
}
|
|
8
10
|
if (!isAuthenticated) {
|
|
11
|
+
console.log('[AuthU SDK PrivateRoute] Not authenticated, loginOnUnauthenticated:', loginOnUnauthenticated);
|
|
9
12
|
if (loginOnUnauthenticated) {
|
|
13
|
+
console.log('[AuthU SDK PrivateRoute] Triggering login()');
|
|
10
14
|
login();
|
|
11
15
|
}
|
|
12
16
|
return fallback;
|
|
13
17
|
}
|
|
18
|
+
console.log('[AuthU SDK PrivateRoute] Authenticated, rendering children');
|
|
14
19
|
return _jsx(_Fragment, { children: children });
|
|
15
20
|
}
|