@functionalcms/svelte-components 5.14.0 → 5.15.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.
@@ -1,7 +1,7 @@
1
1
  export { default as authorizationHandle } from './server-side/auth/authorizationHandle.js';
2
2
  export { default as errorHandler } from './server-side/auth/errorHandle.js';
3
- export { authenticationHandle } from './server-side/auth/user_authentication.js';
4
- export { machineAuthenticationHandle } from './server-side/auth/machine_authentication.js';
3
+ export { userAuthenticationHandle } from './server-side/auth/userAuthenticationHandle.js';
4
+ export { machineAuthenticationHandle } from './server-side/auth/machineAuthenticationHandle.js';
5
5
  export { userAuthenticationProvider } from './server-side/auth/userAuthenticationProvider.js';
6
6
  export { hookSequence } from './server-side/functionalSequence.js';
7
7
  export { sessionStorageHandler } from './server-side/handlers/sessionStorageHandler.js';
@@ -1,7 +1,7 @@
1
1
  export { default as authorizationHandle } from './server-side/auth/authorizationHandle.js';
2
2
  export { default as errorHandler } from './server-side/auth/errorHandle.js';
3
- export { authenticationHandle } from './server-side/auth/user_authentication.js';
4
- export { machineAuthenticationHandle } from './server-side/auth/machine_authentication.js';
3
+ export { userAuthenticationHandle } from './server-side/auth/userAuthenticationHandle.js';
4
+ export { machineAuthenticationHandle } from './server-side/auth/machineAuthenticationHandle.js';
5
5
  export { userAuthenticationProvider } from './server-side/auth/userAuthenticationProvider.js';
6
6
  export { hookSequence } from './server-side/functionalSequence.js';
7
7
  export { sessionStorageHandler } from './server-side/handlers/sessionStorageHandler.js';
@@ -1,4 +1,5 @@
1
1
  import type { Handle } from "@sveltejs/kit";
2
+ import { Redis } from "@upstash/redis";
2
3
  export type CallbackResponse = {
3
4
  access_token: string;
4
5
  id_token?: string;
@@ -13,4 +14,4 @@ export type AuthenticationProvider = {
13
14
  handleLogin(callbackUrl: URL): Promise<SigninResponse>;
14
15
  handleCallback: (state: string, codeVerifier: string, eventUrl: URL) => Promise<CallbackResponse>;
15
16
  };
16
- export declare const authenticationHandle: (secret: string, serverUrl: string, clientId: string) => Handle;
17
+ export declare const userAuthenticationHandle: (secret: string, serverUrl: string, clientId: string, redis: Redis) => Handle;
@@ -1,17 +1,16 @@
1
1
  import { deleteCookie, loadCookie, saveCookie } from "../cookies";
2
2
  import { userAuthenticationProvider } from "./userAuthenticationProvider";
3
- import { parse } from "svelte/compiler";
3
+ import { Redis } from "@upstash/redis";
4
+ import { parseJwtToken } from "../tokenToUserParser";
4
5
  const pkceCookieName = "functionalcms_pkce";
5
6
  const stateCookieName = "functionalcms_state";
6
- const accessTokenCookie = "functionalcms_access_token";
7
- const idTokenCookie = "functionalcms_id_token";
8
- const refreshTokenCookie = "functionalcms_refresh_token";
9
- export const authenticationHandle = (secret, serverUrl, clientId) => {
7
+ const sessionCookieName = "functionalcms_sessionId";
8
+ export const userAuthenticationHandle = (secret, serverUrl, clientId, redis) => {
10
9
  const provider = userAuthenticationProvider(serverUrl, clientId);
11
10
  return async ({ event, resolve }) => {
12
11
  try {
13
12
  if (event.url.pathname === '/auth/callback') {
14
- const headers = await handleCallback(event, secret, provider);
13
+ const headers = await handleCallback(event, secret, provider, redis);
15
14
  return new Response(null, { status: 302, headers });
16
15
  }
17
16
  else if (event.url.pathname === '/auth/login') {
@@ -29,22 +28,12 @@ export const authenticationHandle = (secret, serverUrl, clientId) => {
29
28
  };
30
29
  };
31
30
  function handleLogout(event) {
32
- event.cookies.delete(accessTokenCookie, { path: "/" });
33
- event.cookies.delete(idTokenCookie, { path: "/" });
34
- event.cookies.delete(refreshTokenCookie, { path: "/" });
31
+ event.cookies.delete(sessionCookieName, { path: "/" });
32
+ // event.cookies.delete(idTokenCookie, { path: "/" });
33
+ // event.cookies.delete(refreshTokenCookie, { path: "/" });
35
34
  event.locals.user = null;
36
35
  event.locals.session = {};
37
36
  }
38
- function parseJwt(token) {
39
- const base64 = token.split('.')[1]
40
- .replace(/-/g, '+')
41
- .replace(/_/g, '/');
42
- const json = decodeURIComponent(atob(base64)
43
- .split('')
44
- .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
45
- .join(''));
46
- return JSON.parse(json);
47
- }
48
37
  async function handleLogin(event, provider, secret) {
49
38
  const callbackUrl = new URL(`${event.url.origin}/auth/callback`);
50
39
  const response = await provider.handleLogin(callbackUrl);
@@ -54,20 +43,16 @@ async function handleLogin(event, provider, secret) {
54
43
  await saveCookie(headers, secret, stateCookieName, response.state);
55
44
  return headers;
56
45
  }
57
- async function handleCallback(event, secret, provider) {
46
+ async function handleCallback(event, secret, provider, redis) {
58
47
  const expectedState = await loadCookie(event.cookies, secret, stateCookieName);
59
48
  const codeVerifier = await loadCookie(event.cookies, secret, pkceCookieName);
60
49
  const response = await provider.handleCallback(expectedState, codeVerifier, event.url);
61
50
  const headers = new Headers();
62
51
  headers.set('Location', event.url.origin);
63
- const accessToken = parseJwt(response.access_token);
64
- await saveCookie(headers, secret, accessTokenCookie, response.access_token, accessToken.exp - Math.floor(Date.now() / 1000));
65
- if (response.id_token) {
66
- await saveCookie(headers, secret, idTokenCookie, response.id_token);
67
- }
68
- if (response.refresh_token) {
69
- await saveCookie(headers, secret, refreshTokenCookie, response.refresh_token);
70
- }
52
+ const sessionId = crypto.randomUUID();
53
+ const accessToken = parseJwtToken(response.access_token);
54
+ await saveCookie(headers, secret, sessionCookieName, sessionId, accessToken.exp - Math.floor(Date.now() / 1000));
55
+ redis.set(sessionId, JSON.stringify(response.access_token), { ex: accessToken.exp - Math.floor(Date.now() / 1000) });
71
56
  await deleteCookie(event.cookies, headers, pkceCookieName);
72
57
  await deleteCookie(event.cookies, headers, stateCookieName);
73
58
  return headers;
@@ -1,2 +1,2 @@
1
- import type { AuthenticationProvider } from "./user_authentication";
1
+ import type { AuthenticationProvider } from "./userAuthenticationHandle";
2
2
  export declare const userAuthenticationProvider: (serverUrl: string, clientId: string) => AuthenticationProvider;
@@ -21,6 +21,7 @@ export const userAuthenticationProvider = (serverUrl, clientId) => {
21
21
  authUrl.searchParams.set('state', state);
22
22
  authUrl.searchParams.set('code_challenge', code_challenge);
23
23
  authUrl.searchParams.set('code_challenge_method', 'S256');
24
+ authUrl.searchParams.set('scope', 'openid profile email user.extended properties');
24
25
  return { state, codeVerifier: code_verifier, authorisationUrl: authUrl.toString() };
25
26
  };
26
27
  const handleCallback = async (state, codeVerifier, callbackUrl) => {
@@ -1,2 +1,3 @@
1
1
  import type { Handle } from "@sveltejs/kit";
2
- export declare const hookSequence: (secret: string, paraglideMiddleware: any, getTextDirection: any, settings: any, customHooks: Handle[]) => Handle;
2
+ import type { Redis } from "@upstash/redis";
3
+ export declare const hookSequence: (secret: string, redis: Redis, paraglideMiddleware: any, getTextDirection: any, settings: any, customHooks: Handle[]) => Handle;
@@ -5,6 +5,6 @@ import authorizationHandle from "./auth/authorizationHandle";
5
5
  import { userHandler } from "./handlers/userHandler";
6
6
  import { accessTokenHandler } from "./handlers/accessTokenHandler";
7
7
  import { sitemapHandle } from "./handlers/sitemapHandler";
8
- export const hookSequence = (secret, paraglideMiddleware, getTextDirection, settings, customHooks) => {
9
- return sequence(userHandler(secret), accessTokenHandler(secret), paraglideHandler(paraglideMiddleware, getTextDirection), authorizationHandle(), sitemapHandle(settings), ...customHooks, errorHandler);
8
+ export const hookSequence = (secret, redis, paraglideMiddleware, getTextDirection, settings, customHooks) => {
9
+ return sequence(accessTokenHandler(secret, redis), userHandler(), paraglideHandler(paraglideMiddleware, getTextDirection), authorizationHandle(), sitemapHandle(settings), ...customHooks, errorHandler);
10
10
  };
@@ -1,2 +1,3 @@
1
1
  import { type Handle } from '@sveltejs/kit';
2
- export declare const accessTokenHandler: (secret: string) => Handle;
2
+ import { Redis } from '@upstash/redis';
3
+ export declare const accessTokenHandler: (secret: string, redis: Redis) => Handle;
@@ -1,12 +1,14 @@
1
1
  import {} from '@sveltejs/kit';
2
2
  import { loadCookie } from '../cookies';
3
- const accessTokenCookie = "functionalcms_access_token";
4
- export const accessTokenHandler = (secret) => {
3
+ import { Redis } from '@upstash/redis';
4
+ const accessTokenCookie = "functionalcms_sessionId";
5
+ export const accessTokenHandler = (secret, redis) => {
5
6
  return async ({ event, resolve }) => {
6
7
  try {
7
- let token = await loadCookie(event.cookies, secret, accessTokenCookie);
8
- if (token) {
9
- event.locals.token = token;
8
+ let sessionId = await loadCookie(event.cookies, secret, accessTokenCookie);
9
+ if (sessionId) {
10
+ const accessToken = await redis.get(sessionId);
11
+ event.locals.token = accessToken;
10
12
  }
11
13
  }
12
14
  finally {
@@ -1,2 +1,2 @@
1
1
  import { type Handle } from '@sveltejs/kit';
2
- export declare const userHandler: (secret: string) => Handle;
2
+ export declare const userHandler: () => Handle;
@@ -1,22 +1,13 @@
1
1
  import {} from '@sveltejs/kit';
2
2
  import { loadCookie } from '../cookies';
3
- const accessTokenCookie = "functionalcms_access_token";
4
- const retrieveUser = async (idToken) => {
5
- const parts = idToken.split('.');
6
- // Base64url to string conversion
7
- const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
8
- // Use TextDecoder (available in Node.js 11+)
9
- const binString = globalThis.atob(base64);
10
- const bytes = Uint8Array.from(binString, (m) => m.codePointAt(0));
11
- const payload = JSON.parse(new TextDecoder().decode(bytes));
12
- return payload;
13
- };
14
- export const userHandler = (secret) => {
3
+ import { Redis } from '@upstash/redis';
4
+ import { parseJwtToken } from '../tokenToUserParser';
5
+ const accessTokenCookie = "functionalcms_sessionId";
6
+ export const userHandler = () => {
15
7
  return async ({ event, resolve }) => {
16
8
  try {
17
- let idToken = await loadCookie(event.cookies, secret, accessTokenCookie);
18
- if (idToken) {
19
- let user = await retrieveUser(idToken);
9
+ if (event.locals.token) {
10
+ const user = parseJwtToken(event.locals.token);
20
11
  event.locals.user = user;
21
12
  }
22
13
  }
@@ -0,0 +1 @@
1
+ export declare function parseJwtToken(token: string): any;
@@ -0,0 +1,10 @@
1
+ export function parseJwtToken(token) {
2
+ const base64 = token.split('.')[1]
3
+ .replace(/-/g, '+')
4
+ .replace(/_/g, '/');
5
+ const json = decodeURIComponent(atob(base64)
6
+ .split('')
7
+ .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
8
+ .join(''));
9
+ return JSON.parse(json);
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@functionalcms/svelte-components",
3
- "version": "5.14.0",
3
+ "version": "5.15.1",
4
4
  "license": "MIT",
5
5
  "watch": {
6
6
  "build": {