@authrim/sveltekit 0.1.3 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/lib/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAgBd,MAAM,YAAY,CAAC;AAmEpB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAsbxB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/lib/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAiBd,MAAM,YAAY,CAAC;AAqEpB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAwdxB"}
package/dist/client.js CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Authrim Svelte SDK Main Entry Point
3
3
  */
4
- import { authResultToResponse, wrapWithAuthResponse, success, } from "./utils/response.js";
4
+ import { createAuthrimClient } from "@authrim/core";
5
+ import { authResultToResponse, wrapWithAuthResponse, success, fetchClientConfig, } from "./utils/index.js";
5
6
  import { PasskeyAuthImpl } from "./direct-auth/passkey.js";
6
7
  import { EmailCodeAuthImpl } from "./direct-auth/email-code.js";
7
8
  import { SocialAuthImpl } from "./direct-auth/social.js";
@@ -10,6 +11,7 @@ import { ConsentApiImpl } from "./direct-auth/consent.js";
10
11
  import { DeviceFlowApiImpl } from "./direct-auth/device-flow.js";
11
12
  import { CIBAApiImpl } from "./direct-auth/ciba.js";
12
13
  import { LoginChallengeApiImpl } from "./direct-auth/login-challenge.js";
14
+ import { createOAuthNamespace } from "./oauth/index.js";
13
15
  import { BrowserHttpClient } from "./providers/http.js";
14
16
  import { BrowserCryptoProvider } from "./providers/crypto.js";
15
17
  import { createBrowserStorage, } from "./providers/storage.js";
@@ -73,6 +75,33 @@ export async function createAuthrim(config) {
73
75
  const emitter = new AuthEventEmitter();
74
76
  // Initialize stores
75
77
  const internalStores = createAuthStores();
78
+ // ==========================================================================
79
+ // OAuth (Optional)
80
+ // ==========================================================================
81
+ let oauth;
82
+ if (config.enableOAuth) {
83
+ // Fetch public client configuration from server
84
+ const clientConfig = await fetchClientConfig(config.issuer, config.clientId);
85
+ if (clientConfig) {
86
+ console.debug('[Authrim] Client configuration loaded:', {
87
+ client_id: clientConfig.client_id,
88
+ client_name: clientConfig.client_name,
89
+ login_ui_url: clientConfig.login_ui_url,
90
+ });
91
+ }
92
+ // Create core client for OAuth flows
93
+ const coreClient = await createAuthrimClient({
94
+ issuer: config.issuer,
95
+ clientId: config.clientId,
96
+ http,
97
+ crypto,
98
+ storage,
99
+ });
100
+ // Create OAuth namespace
101
+ oauth = createOAuthNamespace(coreClient, {
102
+ silentLoginRedirectUri: config.silentLoginRedirectUri,
103
+ });
104
+ }
76
105
  // Create session manager
77
106
  const sessionManager = new SessionAuthImpl({
78
107
  issuer: config.issuer,
@@ -391,6 +420,7 @@ export async function createAuthrim(config) {
391
420
  emailCode,
392
421
  social,
393
422
  session,
423
+ oauth,
394
424
  consent,
395
425
  deviceFlow,
396
426
  ciba,
@@ -0,0 +1,41 @@
1
+ /**
2
+ * OAuth Namespace for SvelteKit
3
+ *
4
+ * Provides OAuth 2.0 / OpenID Connect authentication flows
5
+ */
6
+ import type { AuthrimClient as CoreClient } from "@authrim/core";
7
+ import type { TrySilentLoginOptions, SilentLoginResult } from "../types.js";
8
+ /**
9
+ * Create OAuth namespace
10
+ */
11
+ export declare function createOAuthNamespace(coreClient: CoreClient, config: {
12
+ silentLoginRedirectUri?: string;
13
+ }): {
14
+ /**
15
+ * Try silent SSO via top-level navigation (prompt=none)
16
+ *
17
+ * Safari ITP / Chrome Third-Party Cookie Phaseout compatible.
18
+ * This function redirects to IdP and does not return.
19
+ *
20
+ * @param options - Silent login options
21
+ * @throws Error if returnTo URL is not same origin
22
+ */
23
+ trySilentLogin(options?: TrySilentLoginOptions): Promise<never>;
24
+ /**
25
+ * Handle silent login callback
26
+ *
27
+ * Call this in your callback page. Handles both silent login
28
+ * results and regular OAuth callbacks.
29
+ *
30
+ * @returns Silent login result
31
+ */
32
+ handleSilentCallback(): Promise<SilentLoginResult>;
33
+ /**
34
+ * Handle regular OAuth callback (for authorization code flow)
35
+ *
36
+ * @param callbackUrl - Full callback URL with code and state
37
+ * @returns Tokens from token exchange
38
+ */
39
+ handleCallback(callbackUrl?: string): Promise<import("@authrim/core").TokenSet>;
40
+ };
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/oauth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAc5E;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE;IACN,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;IAGC;;;;;;;;OAQG;6BAC4B,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC;IA2CrE;;;;;;;OAOG;4BAC2B,OAAO,CAAC,iBAAiB,CAAC;IA0HxD;;;;;OAKG;iCACgC,MAAM;EAK5C"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * OAuth Namespace for SvelteKit
3
+ *
4
+ * Provides OAuth 2.0 / OpenID Connect authentication flows
5
+ */
6
+ import { stringToBase64url, base64urlToString } from "@authrim/core";
7
+ /**
8
+ * Create OAuth namespace
9
+ */
10
+ export function createOAuthNamespace(coreClient, config) {
11
+ return {
12
+ /**
13
+ * Try silent SSO via top-level navigation (prompt=none)
14
+ *
15
+ * Safari ITP / Chrome Third-Party Cookie Phaseout compatible.
16
+ * This function redirects to IdP and does not return.
17
+ *
18
+ * @param options - Silent login options
19
+ * @throws Error if returnTo URL is not same origin
20
+ */
21
+ async trySilentLogin(options) {
22
+ // Browser-only feature
23
+ if (typeof window === "undefined") {
24
+ throw new Error("trySilentLogin is only available in browser");
25
+ }
26
+ const onLoginRequired = options?.onLoginRequired ?? "return";
27
+ const returnTo = options?.returnTo ?? window.location.href;
28
+ // Security: Open redirect prevention
29
+ if (!isSafeReturnTo(returnTo)) {
30
+ throw new Error("returnTo must be same origin");
31
+ }
32
+ // Encode state data (short keys to reduce URL length)
33
+ const stateData = {
34
+ t: "sl", // silent_login
35
+ lr: onLoginRequired === "login" ? "l" : "r",
36
+ rt: returnTo,
37
+ };
38
+ const state = stringToBase64url(JSON.stringify(stateData));
39
+ // Build authorization URL with prompt=none
40
+ const result = await coreClient.buildAuthorizationUrl({
41
+ redirectUri: config.silentLoginRedirectUri ??
42
+ `${window.location.origin}/callback.html`,
43
+ scope: options?.scope,
44
+ prompt: "none",
45
+ exposeState: false, // We manage state ourselves
46
+ });
47
+ // Append our custom state to the URL
48
+ const url = new URL(result.url);
49
+ url.searchParams.set("state", state);
50
+ // Redirect (this function never returns)
51
+ window.location.href = url.toString();
52
+ // TypeScript: This line is never reached
53
+ throw new Error("unreachable");
54
+ },
55
+ /**
56
+ * Handle silent login callback
57
+ *
58
+ * Call this in your callback page. Handles both silent login
59
+ * results and regular OAuth callbacks.
60
+ *
61
+ * @returns Silent login result
62
+ */
63
+ async handleSilentCallback() {
64
+ // Browser-only feature
65
+ if (typeof window === "undefined") {
66
+ return { status: "error", error: "not_browser" };
67
+ }
68
+ const params = new URLSearchParams(window.location.search);
69
+ const error = params.get("error");
70
+ const stateParam = params.get("state");
71
+ // Try to decode state
72
+ let stateData = null;
73
+ if (stateParam) {
74
+ try {
75
+ const decoded = base64urlToString(stateParam);
76
+ const parsed = JSON.parse(decoded);
77
+ // Type guard: check if this is a silent login state
78
+ if (parsed.t === "sl" &&
79
+ typeof parsed.lr === "string" &&
80
+ typeof parsed.rt === "string") {
81
+ stateData = {
82
+ t: "sl",
83
+ lr: parsed.lr,
84
+ rt: parsed.rt,
85
+ };
86
+ }
87
+ }
88
+ catch {
89
+ // Decode failed, not a silent login state
90
+ }
91
+ }
92
+ // Not a silent login callback
93
+ if (!stateData) {
94
+ // Return error to indicate this is not a silent login callback
95
+ return { status: "error", error: "not_silent_login" };
96
+ }
97
+ const returnTo = stateData.rt;
98
+ const onLoginRequired = stateData.lr === "l" ? "login" : "return";
99
+ // Security: Open redirect prevention
100
+ if (!isSafeReturnTo(returnTo)) {
101
+ return { status: "error", error: "invalid_return_to" };
102
+ }
103
+ // Handle login_required error (IdP has no session)
104
+ if (error === "login_required") {
105
+ if (onLoginRequired === "login") {
106
+ // Redirect to login screen (without prompt=none)
107
+ const loginResult = await coreClient.buildAuthorizationUrl({
108
+ redirectUri: config.silentLoginRedirectUri ??
109
+ `${window.location.origin}/callback.html`,
110
+ exposeState: false,
111
+ });
112
+ // Encode return URL in state for after login
113
+ const loginStateData = { rt: returnTo };
114
+ const loginUrl = new URL(loginResult.url);
115
+ loginUrl.searchParams.set("state", stringToBase64url(JSON.stringify(loginStateData)));
116
+ window.location.href = loginUrl.toString();
117
+ return { status: "login_required" };
118
+ }
119
+ else {
120
+ // Return to original page with error
121
+ const returnUrl = new URL(returnTo);
122
+ returnUrl.searchParams.set("sso_error", "login_required");
123
+ window.location.href = returnUrl.toString();
124
+ return { status: "login_required" };
125
+ }
126
+ }
127
+ // Handle other errors
128
+ if (error) {
129
+ const errorDescription = params.get("error_description");
130
+ const returnUrl = new URL(returnTo);
131
+ returnUrl.searchParams.set("sso_error", error);
132
+ if (errorDescription) {
133
+ returnUrl.searchParams.set("sso_error_description", errorDescription);
134
+ }
135
+ window.location.href = returnUrl.toString();
136
+ return {
137
+ status: "error",
138
+ error,
139
+ errorDescription: errorDescription ?? undefined,
140
+ };
141
+ }
142
+ // Success: Exchange code for tokens
143
+ const code = params.get("code");
144
+ if (code) {
145
+ try {
146
+ await coreClient.handleCallback(window.location.href);
147
+ // Clear sso_attempted flag on success
148
+ if (typeof sessionStorage !== "undefined") {
149
+ sessionStorage.removeItem("sso_attempted");
150
+ }
151
+ window.location.href = returnTo;
152
+ return { status: "success" };
153
+ }
154
+ catch (e) {
155
+ const errorMessage = e instanceof Error ? e.message : "Token exchange failed";
156
+ const returnUrl = new URL(returnTo);
157
+ returnUrl.searchParams.set("sso_error", "token_error");
158
+ returnUrl.searchParams.set("sso_error_description", errorMessage);
159
+ window.location.href = returnUrl.toString();
160
+ return {
161
+ status: "error",
162
+ error: "token_error",
163
+ errorDescription: errorMessage,
164
+ };
165
+ }
166
+ }
167
+ return { status: "error", error: "unknown_error" };
168
+ },
169
+ /**
170
+ * Handle regular OAuth callback (for authorization code flow)
171
+ *
172
+ * @param callbackUrl - Full callback URL with code and state
173
+ * @returns Tokens from token exchange
174
+ */
175
+ async handleCallback(callbackUrl) {
176
+ const url = callbackUrl ?? (typeof window !== "undefined" ? window.location.href : "");
177
+ return await coreClient.handleCallback(url);
178
+ },
179
+ };
180
+ }
181
+ /**
182
+ * Check if returnTo URL is safe (same origin)
183
+ * Prevents open redirect attacks
184
+ */
185
+ function isSafeReturnTo(url) {
186
+ if (typeof window === "undefined") {
187
+ return false;
188
+ }
189
+ try {
190
+ const u = new URL(url, window.location.origin);
191
+ return u.origin === window.location.origin;
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Smart Handoff SSO Handler for SvelteKit
3
+ *
4
+ * Handles handoff token verification and session management for cross-domain SSO
5
+ * in SvelteKit server-side code.
6
+ */
7
+ import type { Handle, RequestEvent } from '@sveltejs/kit';
8
+ import type { Session, User } from '@authrim/core';
9
+ import { type ServerSessionManagerOptions } from './session.js';
10
+ /**
11
+ * Handoff verification options
12
+ */
13
+ export interface HandoffVerifyOptions {
14
+ /**
15
+ * Authrim IdP URL (required if not using createAuthHandle)
16
+ */
17
+ issuer?: string;
18
+ /**
19
+ * OAuth client ID (required if not using createAuthHandle)
20
+ */
21
+ clientId?: string;
22
+ /**
23
+ * Handoff verify endpoint
24
+ * @default '/auth/external/handoff/verify'
25
+ */
26
+ verifyEndpoint?: string;
27
+ /**
28
+ * Error redirect path
29
+ * @default '/login'
30
+ */
31
+ errorRedirect?: string;
32
+ /**
33
+ * Session manager options
34
+ */
35
+ sessionOptions?: ServerSessionManagerOptions;
36
+ }
37
+ /**
38
+ * Verify handoff token from callback URL
39
+ *
40
+ * Usage in +page.server.ts:
41
+ * ```typescript
42
+ * export const load = async (event) => {
43
+ * const result = await verifyHandoffToken(event);
44
+ * if (!result.success) {
45
+ * throw redirect(302, '/login');
46
+ * }
47
+ * return { session: result.session, user: result.user };
48
+ * };
49
+ * ```
50
+ */
51
+ export declare function verifyHandoffToken(event: RequestEvent, options?: HandoffVerifyOptions): Promise<{
52
+ success: true;
53
+ session: Session;
54
+ user: User;
55
+ } | {
56
+ success: false;
57
+ error: string;
58
+ }>;
59
+ /**
60
+ * Create handoff handler for SvelteKit hooks
61
+ *
62
+ * Usage in hooks.server.ts:
63
+ * ```typescript
64
+ * import { sequence } from '@sveltejs/kit/hooks';
65
+ * import { createAuthHandle, createHandoffHandler } from '@authrim/sveltekit/server';
66
+ *
67
+ * export const handle = sequence(
68
+ * createAuthHandle({
69
+ * issuer: env.AUTHRIM_ISSUER,
70
+ * clientId: env.AUTHRIM_CLIENT_ID,
71
+ * }),
72
+ * createHandoffHandler()
73
+ * );
74
+ * ```
75
+ */
76
+ export declare function createHandoffHandler(options?: HandoffVerifyOptions): Handle;
77
+ //# sourceMappingURL=handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/lib/server/handoff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGL,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;CAC9C;AAmDD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CACN;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACpC,CA+DA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAwB3E"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Smart Handoff SSO Handler for SvelteKit
3
+ *
4
+ * Handles handoff token verification and session management for cross-domain SSO
5
+ * in SvelteKit server-side code.
6
+ */
7
+ import { redirect } from '@sveltejs/kit';
8
+ import { createServerSessionManager, } from './session.js';
9
+ /**
10
+ * Get auth config from options or event.locals
11
+ */
12
+ function getAuthConfig(event, options) {
13
+ // Try to get from options first
14
+ if (options?.issuer && options?.clientId) {
15
+ return { issuer: options.issuer, clientId: options.clientId };
16
+ }
17
+ // Fallback to event.locals (set by createAuthHandle)
18
+ const issuer = event.locals.authrim_issuer;
19
+ const clientId = event.locals.authrim_client_id;
20
+ if (!issuer || !clientId) {
21
+ throw new Error('Authrim config not found. Please provide issuer and clientId in options, or use createAuthHandle.');
22
+ }
23
+ return { issuer, clientId };
24
+ }
25
+ /**
26
+ * Verify handoff token from callback URL
27
+ *
28
+ * Usage in +page.server.ts:
29
+ * ```typescript
30
+ * export const load = async (event) => {
31
+ * const result = await verifyHandoffToken(event);
32
+ * if (!result.success) {
33
+ * throw redirect(302, '/login');
34
+ * }
35
+ * return { session: result.session, user: result.user };
36
+ * };
37
+ * ```
38
+ */
39
+ export async function verifyHandoffToken(event, options) {
40
+ const { url } = event;
41
+ const handoffToken = url.searchParams.get('handoff_token');
42
+ const state = url.searchParams.get('state');
43
+ if (!handoffToken || !state) {
44
+ return { success: false, error: 'Missing handoff token or state' };
45
+ }
46
+ try {
47
+ const { issuer, clientId } = getAuthConfig(event, options);
48
+ const verifyEndpoint = options?.verifyEndpoint || '/auth/external/handoff/verify';
49
+ const response = await fetch(`${issuer}${verifyEndpoint}`, {
50
+ method: 'POST',
51
+ headers: { 'Content-Type': 'application/json' },
52
+ body: JSON.stringify({
53
+ handoff_token: handoffToken,
54
+ state: state,
55
+ client_id: clientId,
56
+ }),
57
+ });
58
+ if (!response.ok) {
59
+ const error = await response.json().catch(() => ({}));
60
+ return {
61
+ success: false,
62
+ error: error.error_description || 'Handoff verification failed',
63
+ };
64
+ }
65
+ const data = await response.json();
66
+ // Save session to cookie
67
+ const sessionManager = createServerSessionManager(options?.sessionOptions);
68
+ const authContext = {
69
+ session: {
70
+ id: data.session.id,
71
+ userId: data.session.userId,
72
+ createdAt: data.session.createdAt,
73
+ expiresAt: data.session.expiresAt,
74
+ },
75
+ user: {
76
+ id: data.user.id,
77
+ email: data.user.email ?? undefined,
78
+ name: data.user.name ?? undefined,
79
+ emailVerified: data.user.emailVerified,
80
+ },
81
+ };
82
+ sessionManager.set(event, authContext);
83
+ return {
84
+ success: true,
85
+ session: authContext.session,
86
+ user: authContext.user,
87
+ };
88
+ }
89
+ catch (error) {
90
+ return {
91
+ success: false,
92
+ error: error instanceof Error ? error.message : 'Unknown error',
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * Create handoff handler for SvelteKit hooks
98
+ *
99
+ * Usage in hooks.server.ts:
100
+ * ```typescript
101
+ * import { sequence } from '@sveltejs/kit/hooks';
102
+ * import { createAuthHandle, createHandoffHandler } from '@authrim/sveltekit/server';
103
+ *
104
+ * export const handle = sequence(
105
+ * createAuthHandle({
106
+ * issuer: env.AUTHRIM_ISSUER,
107
+ * clientId: env.AUTHRIM_CLIENT_ID,
108
+ * }),
109
+ * createHandoffHandler()
110
+ * );
111
+ * ```
112
+ */
113
+ export function createHandoffHandler(options) {
114
+ return async ({ event, resolve }) => {
115
+ // Check if this is a handoff callback
116
+ const { url } = event;
117
+ if (url.searchParams.has('handoff_token')) {
118
+ const result = await verifyHandoffToken(event, options);
119
+ if (!result.success) {
120
+ const errorRedirect = options?.errorRedirect || '/login';
121
+ // Use 303 See Other (POST → GET redirect, safer than 302)
122
+ throw redirect(303, errorRedirect);
123
+ }
124
+ // Remove handoff token from URL
125
+ const cleanUrl = new URL(url);
126
+ cleanUrl.searchParams.delete('handoff_token');
127
+ cleanUrl.searchParams.delete('state');
128
+ // Use 303 See Other (認証後のリダイレクトに適切)
129
+ throw redirect(303, cleanUrl.toString());
130
+ }
131
+ return resolve(event);
132
+ };
133
+ }
@@ -1,4 +1,5 @@
1
1
  export { createServerSessionManager, type ServerSessionManager, type ServerSessionManagerOptions, type ServerAuthContext, } from './session.js';
2
2
  export { createAuthHandle, getServerSessionManager, getAuthFromEvent, type AuthHandleOptions, } from './handle.js';
3
3
  export { requireAuth, createAuthLoad, isAuthenticated, getUser, getSession, type AuthLoadOptions, } from './load.js';
4
+ export { verifyHandoffToken, createHandoffHandler, type HandoffVerifyOptions, } from './handoff.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,OAAO,EACP,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,EAChB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,OAAO,EACP,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { createServerSessionManager, } from './session.js';
2
2
  export { createAuthHandle, getServerSessionManager, getAuthFromEvent, } from './handle.js';
3
3
  export { requireAuth, createAuthLoad, isAuthenticated, getUser, getSession, } from './load.js';
4
+ export { verifyHandoffToken, createHandoffHandler, } from './handoff.js';
package/dist/types.d.ts CHANGED
@@ -13,6 +13,16 @@ export interface AuthrimConfig {
13
13
  issuer: string;
14
14
  clientId: string;
15
15
  storage?: StorageOptions;
16
+ /**
17
+ * Enable OAuth 2.0 / OpenID Connect flows
18
+ * Default: false
19
+ */
20
+ enableOAuth?: boolean;
21
+ /**
22
+ * Silent login redirect URI (for OAuth callback)
23
+ * Default: {origin}/callback.html
24
+ */
25
+ silentLoginRedirectUri?: string;
16
26
  }
17
27
  export interface AuthError {
18
28
  code: string;
@@ -108,6 +118,61 @@ export interface CIBANamespace {
108
118
  export interface LoginChallengeNamespace {
109
119
  getData(challengeId: string): Promise<import("./direct-auth/login-challenge.js").LoginChallengeData>;
110
120
  }
121
+ /**
122
+ * Try silent login options
123
+ */
124
+ export interface TrySilentLoginOptions {
125
+ /**
126
+ * What to do if IdP has no session (login_required)
127
+ * - 'return': Return to returnTo URL with sso_error=login_required
128
+ * - 'login': Redirect to login screen, then return after login
129
+ * Default: 'return'
130
+ */
131
+ onLoginRequired?: "return" | "login";
132
+ /**
133
+ * URL to return after silent login completes
134
+ * Default: current page URL
135
+ * Security: Must be same origin
136
+ */
137
+ returnTo?: string;
138
+ /**
139
+ * OAuth scopes to request
140
+ * Default: SDK default scopes
141
+ */
142
+ scope?: string;
143
+ }
144
+ /**
145
+ * Silent login result
146
+ */
147
+ export type SilentLoginResult = {
148
+ status: "success";
149
+ } | {
150
+ status: "login_required";
151
+ } | {
152
+ status: "error";
153
+ error: string;
154
+ errorDescription?: string;
155
+ };
156
+ export interface OAuthNamespace {
157
+ /**
158
+ * Try silent SSO via top-level navigation (prompt=none)
159
+ *
160
+ * Safari ITP / Chrome Third-Party Cookie Phaseout compatible.
161
+ * This function redirects to IdP and does not return.
162
+ */
163
+ trySilentLogin(options?: TrySilentLoginOptions): Promise<never>;
164
+ /**
165
+ * Handle silent login callback
166
+ *
167
+ * Call this in your callback page. Handles both silent login
168
+ * results and regular OAuth callbacks.
169
+ */
170
+ handleSilentCallback(): Promise<SilentLoginResult>;
171
+ /**
172
+ * Handle regular OAuth callback (for authorization code flow)
173
+ */
174
+ handleCallback(callbackUrl?: string): Promise<import("@authrim/core").TokenSet>;
175
+ }
111
176
  export interface SignInShortcuts {
112
177
  passkey(options?: PasskeyLoginOptions): Promise<AuthResponse<AuthSessionData>>;
113
178
  social(provider: SocialProvider, options?: SocialLoginOptions): Promise<AuthResponse<AuthSessionData>>;
@@ -127,6 +192,8 @@ export interface AuthrimClient {
127
192
  emailCode: EmailCodeNamespace;
128
193
  social: SocialNamespace;
129
194
  session: SessionNamespace;
195
+ /** OAuth 2.0 / OpenID Connect API (optional, enabled via config.enableOAuth) */
196
+ oauth?: OAuthNamespace;
130
197
  /** Consent flow API */
131
198
  consent: ConsentNamespace;
132
199
  /** Device flow API (RFC 8628) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Client Configuration Fetcher
3
+ *
4
+ * Fetches public client configuration from the server's Public Config API.
5
+ */
6
+ /**
7
+ * Public client configuration from server
8
+ */
9
+ export interface PublicClientConfig {
10
+ client_id: string;
11
+ client_name?: string;
12
+ logo_uri?: string;
13
+ client_uri?: string;
14
+ policy_uri?: string;
15
+ tos_uri?: string;
16
+ login_ui_url?: string;
17
+ initiate_login_uri?: string;
18
+ }
19
+ /**
20
+ * Fetch public client configuration from server
21
+ *
22
+ * This fetches configuration from the Public Config API endpoint:
23
+ * GET /oauth/clients/:client_id/config
24
+ *
25
+ * This endpoint is public (no authentication required) and cached for 5 minutes.
26
+ *
27
+ * @param issuer - Authrim issuer URL
28
+ * @param clientId - OAuth client ID
29
+ * @returns Public client configuration or null if fetch fails
30
+ */
31
+ export declare function fetchClientConfig(issuer: string, clientId: string): Promise<PublicClientConfig | null>;
32
+ //# sourceMappingURL=client-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-config.d.ts","sourceRoot":"","sources":["../../src/lib/utils/client-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA0BpC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Client Configuration Fetcher
3
+ *
4
+ * Fetches public client configuration from the server's Public Config API.
5
+ */
6
+ /**
7
+ * Fetch public client configuration from server
8
+ *
9
+ * This fetches configuration from the Public Config API endpoint:
10
+ * GET /oauth/clients/:client_id/config
11
+ *
12
+ * This endpoint is public (no authentication required) and cached for 5 minutes.
13
+ *
14
+ * @param issuer - Authrim issuer URL
15
+ * @param clientId - OAuth client ID
16
+ * @returns Public client configuration or null if fetch fails
17
+ */
18
+ export async function fetchClientConfig(issuer, clientId) {
19
+ try {
20
+ // Normalize issuer URL (remove trailing slash)
21
+ const baseUrl = issuer.replace(/\/$/, '');
22
+ const url = `${baseUrl}/oauth/clients/${encodeURIComponent(clientId)}/config`;
23
+ const response = await fetch(url, {
24
+ method: 'GET',
25
+ headers: {
26
+ 'Accept': 'application/json',
27
+ },
28
+ // Use cache to avoid unnecessary requests
29
+ cache: 'default',
30
+ });
31
+ if (!response.ok) {
32
+ console.warn(`Failed to fetch client config: ${response.status} ${response.statusText}`);
33
+ return null;
34
+ }
35
+ const config = await response.json();
36
+ return config;
37
+ }
38
+ catch (error) {
39
+ console.warn('Failed to fetch client config:', error);
40
+ return null;
41
+ }
42
+ }
@@ -1,5 +1,6 @@
1
1
  export { sanitizeForLogging, sanitizeJsonForLogging, maskValue, } from './sensitive-data.js';
2
2
  export { getAuthrimCode, mapSeverity, ERROR_CODE_MAP } from './error-mapping.js';
3
+ export { fetchClientConfig, type PublicClientConfig } from './client-config.js';
3
4
  export { convertToPublicKeyCredentialRequestOptions, convertToPublicKeyCredentialCreationOptions, assertionResponseToJSON, attestationResponseToJSON, } from './webauthn-converters.js';
4
5
  export { success, failure, failureFromParams, toAuthError, authResultToResponse, wrapWithAuthResponse, } from './response.js';
5
6
  export { AUTH_CONTEXT_KEY, setAuthContext, getAuthContext, hasAuthContext } from './context.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EACL,0CAA0C,EAC1C,2CAA2C,EAC3C,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,0CAA0C,EAC1C,2CAA2C,EAC3C,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export { sanitizeForLogging, sanitizeJsonForLogging, maskValue, } from './sensitive-data.js';
2
2
  export { getAuthrimCode, mapSeverity, ERROR_CODE_MAP } from './error-mapping.js';
3
+ export { fetchClientConfig } from './client-config.js';
3
4
  export { convertToPublicKeyCredentialRequestOptions, convertToPublicKeyCredentialCreationOptions, assertionResponseToJSON, attestationResponseToJSON, } from './webauthn-converters.js';
4
5
  export { success, failure, failureFromParams, toAuthError, authResultToResponse, wrapWithAuthResponse, } from './response.js';
5
6
  export { AUTH_CONTEXT_KEY, setAuthContext, getAuthContext, hasAuthContext } from './context.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@authrim/sveltekit",
3
3
  "packageManager": "pnpm@9.15.0",
4
- "version": "0.1.3",
4
+ "version": "0.1.5",
5
5
  "description": "SvelteKit SDK for Authrim authentication",
6
6
  "type": "module",
7
7
  "svelte": "./dist/index.js",
@@ -71,7 +71,9 @@
71
71
  "passkey",
72
72
  "webauthn",
73
73
  "social-login",
74
- "session-management"
74
+ "session-management",
75
+ "sso",
76
+ "silent-auth"
75
77
  ],
76
78
  "author": "Authrim <info@authrim.com>",
77
79
  "license": "Apache-2.0",