@svadmin/sso 0.8.3 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/sso",
3
- "version": "0.8.3",
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.19.3"
34
+ "@svadmin/core": "^0.21.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "typescript": "^5.7.0"
@@ -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) => backend.getItem(key),
122
- setItem: (key, value) => backend.setItem(key, value),
123
- removeItem: (key) => backend.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');