@svadmin/sso 0.8.4 → 0.8.5
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/package.json +2 -2
- package/src/auth-provider.ts +16 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svadmin/sso",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "OIDC/OAuth2 SSO AuthProvider plugin for svadmin — supports Okta, Azure AD, Cognito, Keycloak, Google",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"src"
|
|
32
32
|
],
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@svadmin/core": "^0.
|
|
34
|
+
"@svadmin/core": "^0.21.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"typescript": "^5.7.0"
|
package/src/auth-provider.ts
CHANGED
|
@@ -116,11 +116,10 @@ const STORAGE_PREFIX = 'svadmin_sso_';
|
|
|
116
116
|
|
|
117
117
|
function getStorage(config: SSOConfig): TokenStorage {
|
|
118
118
|
if (config.storage && typeof config.storage === 'object') return config.storage;
|
|
119
|
-
const backend = config.storage === 'session' ? sessionStorage : localStorage;
|
|
120
119
|
return {
|
|
121
|
-
getItem: (key) =>
|
|
122
|
-
setItem: (key, value) =>
|
|
123
|
-
removeItem: (key) =>
|
|
120
|
+
getItem: (key) => typeof window !== 'undefined' ? (config.storage === 'session' ? sessionStorage : localStorage).getItem(key) : null,
|
|
121
|
+
setItem: (key, value) => { if (typeof window !== 'undefined') (config.storage === 'session' ? sessionStorage : localStorage).setItem(key, value); },
|
|
122
|
+
removeItem: (key) => { if (typeof window !== 'undefined') (config.storage === 'session' ? sessionStorage : localStorage).removeItem(key); },
|
|
124
123
|
};
|
|
125
124
|
}
|
|
126
125
|
|
|
@@ -264,6 +263,9 @@ export function createSSOAuthProvider(config: SSOConfig): AuthProvider {
|
|
|
264
263
|
|
|
265
264
|
return {
|
|
266
265
|
async login() {
|
|
266
|
+
if (typeof window === 'undefined') {
|
|
267
|
+
return { success: false, error: { message: 'SSO login requires a browser environment' } };
|
|
268
|
+
}
|
|
267
269
|
const cfg = await discover();
|
|
268
270
|
const { verifier, challenge } = await createPKCEChallenge();
|
|
269
271
|
const state = generateRandomString(32);
|
|
@@ -293,7 +295,7 @@ export function createSSOAuthProvider(config: SSOConfig): AuthProvider {
|
|
|
293
295
|
const tokens = getTokens();
|
|
294
296
|
clearTokens();
|
|
295
297
|
|
|
296
|
-
if (cfg.end_session_endpoint && tokens?.id_token) {
|
|
298
|
+
if (typeof window !== 'undefined' && cfg.end_session_endpoint && tokens?.id_token) {
|
|
297
299
|
const params = new URLSearchParams({
|
|
298
300
|
id_token_hint: tokens.id_token,
|
|
299
301
|
...(config.postLogoutRedirectUri
|
|
@@ -311,6 +313,15 @@ export function createSSOAuthProvider(config: SSOConfig): AuthProvider {
|
|
|
311
313
|
},
|
|
312
314
|
|
|
313
315
|
async check() {
|
|
316
|
+
// SSR: no tokens, no callback — return unauthenticated
|
|
317
|
+
if (typeof window === 'undefined') {
|
|
318
|
+
const tokens = getTokens();
|
|
319
|
+
if (tokens && (!tokens.expires_at || tokens.expires_at > Math.floor(Date.now() / 1000))) {
|
|
320
|
+
return { authenticated: true };
|
|
321
|
+
}
|
|
322
|
+
return { authenticated: false, logout: true };
|
|
323
|
+
}
|
|
324
|
+
|
|
314
325
|
// Handle callback — exchange authorization code for tokens
|
|
315
326
|
const url = new URL(window.location.href);
|
|
316
327
|
const code = url.searchParams.get('code');
|