@crossauth/sveltekit 1.0.1 → 1.1.1
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 +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +16 -6181
- package/dist/sveltekitadminclientendpoints.d.ts +13 -12
- package/dist/sveltekitadminclientendpoints.js +187 -0
- package/dist/sveltekitadminendpoints.d.ts +5 -4
- package/dist/sveltekitadminendpoints.js +766 -0
- package/dist/sveltekitapikey.d.ts +4 -3
- package/dist/sveltekitapikey.js +81 -0
- package/dist/sveltekitoauthclient.d.ts +6 -4
- package/dist/sveltekitoauthclient.js +2309 -0
- package/dist/sveltekitoauthserver.d.ts +4 -4
- package/dist/sveltekitoauthserver.js +1350 -0
- package/dist/sveltekitresserver.d.ts +6 -4
- package/dist/sveltekitresserver.js +286 -0
- package/dist/sveltekitserver.d.ts +11 -9
- package/dist/sveltekitserver.js +393 -0
- package/dist/sveltekitsession.d.ts +6 -5
- package/dist/sveltekitsession.js +1112 -0
- package/dist/sveltekitsessionadapter.d.ts +2 -3
- package/dist/sveltekitsessionadapter.js +2 -0
- package/dist/sveltekitsharedclientendpoints.d.ts +7 -6
- package/dist/sveltekitsharedclientendpoints.js +630 -0
- package/dist/sveltekituserclientendpoints.d.ts +13 -12
- package/dist/sveltekituserclientendpoints.js +270 -0
- package/dist/sveltekituserendpoints.d.ts +6 -5
- package/dist/sveltekituserendpoints.js +1813 -0
- package/dist/tests/sveltekitadminclientendpoints.test.js +330 -0
- package/dist/tests/sveltekitadminendpoints.test.js +242 -0
- package/dist/tests/sveltekitapikeyserver.test.js +44 -0
- package/dist/tests/sveltekitoauthclient.test.d.ts +5 -5
- package/dist/tests/sveltekitoauthclient.test.js +1016 -0
- package/dist/tests/sveltekitoauthresserver.test.d.ts +4 -4
- package/dist/tests/sveltekitoauthresserver.test.js +185 -0
- package/dist/tests/sveltekitoauthserver.test.js +673 -0
- package/dist/tests/sveltekituserclientendpoints.test.js +244 -0
- package/dist/tests/sveltekituserendpoints.test.js +152 -0
- package/dist/tests/sveltemock.test.js +36 -0
- package/dist/tests/sveltemocks.d.ts +22 -8
- package/dist/tests/sveltemocks.js +114 -0
- package/dist/tests/sveltesessionhooks.test.js +224 -0
- package/dist/tests/testshared.d.ts +8 -8
- package/dist/tests/testshared.js +344 -0
- package/dist/utils.d.ts +1 -2
- package/dist/utils.js +123 -0
- package/package.json +23 -15
- package/dist/index.cjs +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare function oauthLogin(): Promise<{
|
|
2
|
-
server: import(
|
|
3
|
-
authServer: import(
|
|
2
|
+
server: import("..").SvelteKitServer;
|
|
3
|
+
authServer: import("@crossauth/backend").OAuthAuthorizationServer;
|
|
4
4
|
sessionCookieValue: string | undefined;
|
|
5
5
|
sessionId: string | undefined;
|
|
6
6
|
access_token: any;
|
|
7
7
|
refresh_token: any;
|
|
8
|
-
keyStorage: import(
|
|
9
|
-
userStorage: import(
|
|
8
|
+
keyStorage: import("@crossauth/backend").InMemoryKeyStorage;
|
|
9
|
+
userStorage: import("@crossauth/backend").InMemoryUserStorage;
|
|
10
10
|
}>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Copyright (c) 2026 Matthew Baker. All rights reserved. Licenced under the Apache Licence 2.0. See LICENSE file
|
|
2
|
+
import { MockRequestEvent } from './sveltemocks';
|
|
3
|
+
import { SvelteKitOAuthResourceServer } from '../sveltekitresserver';
|
|
4
|
+
import { oidcConfiguration, makeServer, getAccessToken } from './testshared';
|
|
5
|
+
import { OAuthTokenConsumer } from '@crossauth/backend';
|
|
6
|
+
import createFetchMock from 'vitest-fetch-mock';
|
|
7
|
+
import { test, expect, vi, beforeAll, afterEach } from 'vitest';
|
|
8
|
+
let fetchMocker = createFetchMock(vi);
|
|
9
|
+
fetchMocker.enableMocks();
|
|
10
|
+
beforeAll(async () => {
|
|
11
|
+
fetchMocker.doMock();
|
|
12
|
+
});
|
|
13
|
+
afterEach(async () => {
|
|
14
|
+
vi.restoreAllMocks();
|
|
15
|
+
});
|
|
16
|
+
export async function oauthLogin() {
|
|
17
|
+
const { server, keyStorage, userStorage } = await makeServer(true, false, false, true, { tokenResponseType: "saveInSessionAndReturn", enableCsrfProtection: false });
|
|
18
|
+
const { authServer } = await getAccessToken();
|
|
19
|
+
if (server.oAuthClient)
|
|
20
|
+
await server.oAuthClient.loadConfig(oidcConfiguration);
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
//fetchMocker.mockResponseOnce((request) => {return JSON.stringify({url: request.url, body: JSON.parse(request.body.toString())})});
|
|
23
|
+
fetchMocker.mockResponseOnce(async (request) => {
|
|
24
|
+
// call token with password flow
|
|
25
|
+
const body = JSON.parse(request.body?.toString() ?? "{}");
|
|
26
|
+
const firstTokenResponse = await authServer.tokenEndpoint({
|
|
27
|
+
grantType: body.grant_type,
|
|
28
|
+
client_id: body.client_id,
|
|
29
|
+
scope: body.scope,
|
|
30
|
+
client_secret: body.client_secret,
|
|
31
|
+
username: body.username,
|
|
32
|
+
password: body.password,
|
|
33
|
+
});
|
|
34
|
+
return new Response(JSON.stringify(firstTokenResponse), { headers: { "content-type": "application/json" } });
|
|
35
|
+
});
|
|
36
|
+
// password flow post endpoint
|
|
37
|
+
let postRequest = new Request(`http://server.com/passwordFlowFlow`, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
scope: "read write",
|
|
41
|
+
username: "bob",
|
|
42
|
+
password: "bobPass123",
|
|
43
|
+
}),
|
|
44
|
+
headers: { "content-type": "application/json" },
|
|
45
|
+
});
|
|
46
|
+
let event = new MockRequestEvent("1", postRequest, {});
|
|
47
|
+
if (server.oAuthClient == undefined)
|
|
48
|
+
throw new Error("server.oAuthClient is undefined");
|
|
49
|
+
const resp = await server.oAuthClient?.passwordFlowEndpoint.post(event);
|
|
50
|
+
if (!resp || !(resp instanceof Response))
|
|
51
|
+
throw "response is not an object";
|
|
52
|
+
expect(resp.status).toBe(200);
|
|
53
|
+
const body = await resp.json();
|
|
54
|
+
expect(body.ok).toBe(true);
|
|
55
|
+
expect(body.access_token).toBeDefined();
|
|
56
|
+
expect(body.refresh_token).toBeDefined();
|
|
57
|
+
const access_token = body.access_token;
|
|
58
|
+
const refresh_token = body.refresh_token;
|
|
59
|
+
let sessionCookieValue = event.cookies.get("SESSIONID");
|
|
60
|
+
let sessionId = server.sessionServer?.sessionManager.getSessionId(sessionCookieValue ?? "");
|
|
61
|
+
return { server, authServer, sessionCookieValue, sessionId, access_token, refresh_token, keyStorage, userStorage };
|
|
62
|
+
}
|
|
63
|
+
;
|
|
64
|
+
test('SvelteKitOAuthResourceServer.validAndInvalidAccessToken_authorized', async () => {
|
|
65
|
+
// login using password flow
|
|
66
|
+
const { server, authServer, access_token, userStorage } = await oauthLogin();
|
|
67
|
+
if (server.oAuthClient)
|
|
68
|
+
await server.oAuthClient.loadConfig(oidcConfiguration);
|
|
69
|
+
const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
|
|
70
|
+
expect(decodedAccessToken).toBeDefined();
|
|
71
|
+
// create resource server
|
|
72
|
+
const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
|
|
73
|
+
const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], { userStorage });
|
|
74
|
+
fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
|
|
75
|
+
await resserver.tokenConsumers[0].loadConfig();
|
|
76
|
+
fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
|
|
77
|
+
await resserver.tokenConsumers[0].loadJwks();
|
|
78
|
+
// simulate a get request on the res server
|
|
79
|
+
// authorizationCodeFlow get endpoint
|
|
80
|
+
let getRequest = new Request(`http://resserver.com/getresource`, {
|
|
81
|
+
method: "GET",
|
|
82
|
+
headers: { "authorization": "Bearer " + access_token }
|
|
83
|
+
});
|
|
84
|
+
let event = new MockRequestEvent("1", getRequest, {});
|
|
85
|
+
const resp1 = await resserver.authorized(event);
|
|
86
|
+
expect(resp1?.authorized).toBe(true);
|
|
87
|
+
expect(resp1?.tokenPayload).toBeDefined();
|
|
88
|
+
expect(resp1?.user?.username).toBe("bob");
|
|
89
|
+
// simulate an invalid get request on the res server
|
|
90
|
+
// authorizationCodeFlow get endpoint
|
|
91
|
+
getRequest = new Request(`http://resserver.com/getresource`, {
|
|
92
|
+
method: "GET",
|
|
93
|
+
headers: { "authorization": "Bearer " + access_token + "x" }
|
|
94
|
+
});
|
|
95
|
+
event = new MockRequestEvent("1", getRequest, {});
|
|
96
|
+
const resp2 = await resserver.authorized(event);
|
|
97
|
+
expect(resp2?.authorized).toBe(false);
|
|
98
|
+
expect(resp2?.tokenPayload).toBeUndefined();
|
|
99
|
+
expect(resp2?.user).toBeUndefined();
|
|
100
|
+
});
|
|
101
|
+
test('SvelteKitOAuthResourceServer.validAndInvalidAccessToken_hook', async () => {
|
|
102
|
+
// login using password flow
|
|
103
|
+
const { server, authServer, access_token, userStorage } = await oauthLogin();
|
|
104
|
+
if (server.oAuthClient)
|
|
105
|
+
await server.oAuthClient.loadConfig(oidcConfiguration);
|
|
106
|
+
const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
|
|
107
|
+
expect(decodedAccessToken).toBeDefined();
|
|
108
|
+
// create resource server
|
|
109
|
+
const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
|
|
110
|
+
const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], {
|
|
111
|
+
userStorage,
|
|
112
|
+
protectedEndpoints: {
|
|
113
|
+
"/getresource": { scope: ["read", "write"] }
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
|
|
117
|
+
await resserver.tokenConsumers[0].loadConfig();
|
|
118
|
+
fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
|
|
119
|
+
await resserver.tokenConsumers[0].loadJwks();
|
|
120
|
+
// simulate a get request on the res server
|
|
121
|
+
// authorizationCodeFlow get endpoint
|
|
122
|
+
let getRequest = new Request(`http://resserver.com/getresource`, {
|
|
123
|
+
method: "GET",
|
|
124
|
+
headers: { "authorization": "Bearer " + access_token }
|
|
125
|
+
});
|
|
126
|
+
let event = new MockRequestEvent("1", getRequest, {});
|
|
127
|
+
expect(resserver.hook).toBeDefined();
|
|
128
|
+
if (!resserver.hook)
|
|
129
|
+
throw new Error("hook undefined");
|
|
130
|
+
await resserver.hook({ event: event });
|
|
131
|
+
expect(event.locals.user?.username).toBe("bob");
|
|
132
|
+
expect(event.locals.scope?.length).toBe(2);
|
|
133
|
+
let scopes = event.locals.scope ?? [];
|
|
134
|
+
expect(["read", "write"]).toContain(scopes[0]);
|
|
135
|
+
expect(["read", "write"]).toContain(scopes[1]);
|
|
136
|
+
// simulate an invalidget request on the res server
|
|
137
|
+
// authorizationCodeFlow get endpoint
|
|
138
|
+
getRequest = new Request(`http://resserver.com/getresource`, {
|
|
139
|
+
method: "GET",
|
|
140
|
+
headers: { "authorization": "Bearer " + access_token + "x" }
|
|
141
|
+
});
|
|
142
|
+
event = new MockRequestEvent("1", getRequest, {});
|
|
143
|
+
expect(resserver.hook).toBeDefined();
|
|
144
|
+
if (!resserver.hook)
|
|
145
|
+
throw new Error("hook undefined");
|
|
146
|
+
await resserver.hook({ event: event });
|
|
147
|
+
expect(event.locals.user).toBeUndefined();
|
|
148
|
+
expect(event.locals.scope).toBeUndefined();
|
|
149
|
+
});
|
|
150
|
+
test('SvelteKitOAuthResourceServer.hook_suburl', async () => {
|
|
151
|
+
// login using password flow
|
|
152
|
+
const { server, authServer, access_token, userStorage } = await oauthLogin();
|
|
153
|
+
if (server.oAuthClient)
|
|
154
|
+
await server.oAuthClient.loadConfig(oidcConfiguration);
|
|
155
|
+
const decodedAccessToken = await authServer.validAccessToken(access_token ?? "");
|
|
156
|
+
expect(decodedAccessToken).toBeDefined();
|
|
157
|
+
// create resource server
|
|
158
|
+
const issuer = process.env["CROSSAUTH_AUTH_SERVER_BASE_URL"] ?? "";
|
|
159
|
+
const resserver = new SvelteKitOAuthResourceServer([new OAuthTokenConsumer(process.env["CROSSAUTH_OAUTH_AUDIENCE"] ?? "resourceserver", { authServerBaseUrl: issuer })], {
|
|
160
|
+
userStorage,
|
|
161
|
+
protectedEndpoints: {
|
|
162
|
+
"/getresource": { scope: ["read", "write"], suburls: true }
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
fetchMocker.mockResponseOnce(JSON.stringify(oidcConfiguration));
|
|
166
|
+
await resserver.tokenConsumers[0].loadConfig();
|
|
167
|
+
fetchMocker.mockResponseOnce(JSON.stringify(authServer.jwks()));
|
|
168
|
+
await resserver.tokenConsumers[0].loadJwks();
|
|
169
|
+
// simulate a get request on the res server
|
|
170
|
+
// authorizationCodeFlow get endpoint
|
|
171
|
+
let getRequest = new Request(`http://resserver.com/getresource/x`, {
|
|
172
|
+
method: "GET",
|
|
173
|
+
headers: { "authorization": "Bearer " + access_token }
|
|
174
|
+
});
|
|
175
|
+
let event = new MockRequestEvent("1", getRequest, {});
|
|
176
|
+
expect(resserver.hook).toBeDefined();
|
|
177
|
+
if (!resserver.hook)
|
|
178
|
+
throw new Error("hook undefined");
|
|
179
|
+
await resserver.hook({ event: event });
|
|
180
|
+
expect(event.locals.user?.username).toBe("bob");
|
|
181
|
+
expect(event.locals.scope?.length).toBe(2);
|
|
182
|
+
let scopes = event.locals.scope ?? [];
|
|
183
|
+
expect(["read", "write"]).toContain(scopes[0]);
|
|
184
|
+
expect(["read", "write"]).toContain(scopes[1]);
|
|
185
|
+
});
|