@svadmin/sso 0.8.5 → 0.8.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/sso",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
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,9 +31,14 @@
31
31
  "src"
32
32
  ],
33
33
  "peerDependencies": {
34
- "@svadmin/core": "^0.21.1"
34
+ "@svadmin/core": "^0.23.3"
35
35
  },
36
36
  "devDependencies": {
37
37
  "typescript": "^5.7.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "@svadmin/core": {
41
+ "optional": true
42
+ }
38
43
  }
39
44
  }
@@ -16,6 +16,8 @@
16
16
  * ```ts
17
17
  * import { createSSOAuthProvider } from '@svadmin/sso';
18
18
  * import { setAuthProvider } from '@svadmin/core';
19
+
20
+
19
21
  *
20
22
  * const authProvider = createSSOAuthProvider({
21
23
  * issuer: 'https://your-tenant.okta.com',
@@ -29,6 +31,19 @@
29
31
 
30
32
  import type { AuthProvider, Identity } from '@svadmin/core';
31
33
 
34
+ // Safe base64url decode for JWT payloads
35
+ function decodeJwtPayload(token: string): any {
36
+ if (!token) return null;
37
+ const parts = token.split('.');
38
+ if (parts.length < 2) return null;
39
+ const payloadStr = parts[1];
40
+ const padded = payloadStr + '='.repeat((4 - (payloadStr.length % 4)) % 4);
41
+ const binString = atob(padded.replace(/-/g, '+').replace(/_/g, '/'));
42
+ const bytes = Uint8Array.from(binString, (m) => m.codePointAt(0)!);
43
+ return JSON.parse(new TextDecoder().decode(bytes));
44
+ }
45
+
46
+
32
47
  // ─── Types ────────────────────────────────────────────────────
33
48
 
34
49
  export interface SSOConfig {
@@ -393,7 +408,7 @@ export function createSSOAuthProvider(config: SSOConfig): AuthProvider {
393
408
  // Try to extract roles/permissions from the ID token
394
409
  if (tokens.id_token) {
395
410
  try {
396
- const payload = JSON.parse(atob(tokens.id_token.split('.')[1]));
411
+ const payload = decodeJwtPayload(tokens.id_token);
397
412
  return payload.roles ?? payload.groups ?? payload.permissions ?? null;
398
413
  } catch {
399
414
  return null;