@botfabrik/engine-webclient 4.101.3-alpha.0 → 4.101.3-alpha.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.
@@ -8,4 +8,4 @@ export type AuthenticatedUser = {
8
8
  };
9
9
  export declare function setUpSamlAuth(bot: BotInstance, auth: Auth, clientName: string, nsp: Namespace): void;
10
10
  export declare function storeLoginRequestToken(loginRequestToken: string, socketId: string): void;
11
- export declare function verifyLoginToken(token: string | undefined, auth: Auth | undefined, logger: Logger): AuthenticatedUser | undefined;
11
+ export declare function verifyLoginToken(token: string | undefined, auth: Auth | undefined, logger: Logger): Promise<AuthenticatedUser | undefined>;
@@ -1,6 +1,6 @@
1
1
  import { Strategy, } from '@node-saml/passport-saml';
2
2
  import express from 'express';
3
- import { sign, verify } from 'jsonwebtoken';
3
+ import { jwtVerify, SignJWT } from 'jose';
4
4
  import passport from 'passport';
5
5
  import { renderAuthErrorPage, renderAuthSuccessPage, setAuthPageHeaders, } from './auth-pages.js';
6
6
  import { signRelayState, verifyRelayState } from './relay-state.js';
@@ -34,7 +34,7 @@ export function setUpSamlAuth(bot, auth, clientName, nsp) {
34
34
  authenticateFn(req, res, next);
35
35
  });
36
36
  bot.webserver.express.post(callbackUrl, express.urlencoded({ extended: false }), (req, res, next) => {
37
- const authenticatorFn = passport.authenticate(strategyName, { session: false }, (err, user) => {
37
+ const authenticatorFn = passport.authenticate(strategyName, { session: false }, async (err, user) => {
38
38
  const lang = getLang(req);
39
39
  setAuthPageHeaders(res);
40
40
  try {
@@ -52,9 +52,11 @@ export function setUpSamlAuth(bot, auth, clientName, nsp) {
52
52
  if (!user) {
53
53
  return res.status(401).send(renderAuthErrorPage(lang));
54
54
  }
55
- const loginToken = sign(user, auth.jwtSecret, {
56
- expiresIn: '1m',
57
- });
55
+ const secret = new TextEncoder().encode(auth.jwtSecret);
56
+ const loginToken = await new SignJWT(user)
57
+ .setProtectedHeader({ alg: 'HS256' })
58
+ .setExpirationTime('1m')
59
+ .sign(secret);
58
60
  const socket = nsp.sockets.get(socketId);
59
61
  if (socket) {
60
62
  socket.emit('login-success', { loginToken });
@@ -89,14 +91,16 @@ function consumeLoginRequestToken(loginRequestToken) {
89
91
  loginTokenCache.delete(loginRequestToken);
90
92
  return { socketId: cachedLoginRequest.socketId };
91
93
  }
92
- export function verifyLoginToken(token, auth, logger) {
94
+ export async function verifyLoginToken(token, auth, logger) {
93
95
  try {
94
96
  if (auth) {
95
- const verified = verify(token || '', auth.jwtSecret);
97
+ const secret = new TextEncoder().encode(auth.jwtSecret);
98
+ const { payload } = await jwtVerify(token ?? '', secret);
99
+ const p = payload;
96
100
  return {
97
- email: verified['email'],
98
- firstName: verified['firstName'],
99
- lastName: verified['lastName'],
101
+ email: p.email ?? '',
102
+ firstName: p.firstName,
103
+ lastName: p.lastName,
100
104
  };
101
105
  }
102
106
  else {
package/dist/index.js CHANGED
@@ -127,7 +127,7 @@ const onTerminateSession = (socket, bot) => async ({ sessionId, // passed if the
127
127
  };
128
128
  const onStartChat = (socket, props, bot, clientName, environment, logger) => async ({ sessionId: sessionIdFromClient, userId: defaultUserId, querystrings, loginToken, }) => {
129
129
  try {
130
- const authenticatedUser = verifyLoginToken(loginToken, props.auth, logger);
130
+ const authenticatedUser = await verifyLoginToken(loginToken, props.auth, logger);
131
131
  const locale = extractLocale(querystrings, socket.request.headers['accept-language']);
132
132
  const sessionsCollection = bot.store.db.collection('sessions');
133
133
  const { sessionId, sessionInfo: defaultSessionInfo, isNew, } = await requestSessionData(sessionIdFromClient, querystrings, sessionsCollection, clientName, props);
@@ -1,4 +1,4 @@
1
- import { describe, expect, it, vi } from 'vitest';
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
2
  import requestSessionData from './requestSessionData.js';
3
3
  vi.mock('node:crypto', () => ({
4
4
  randomUUID: vi.fn(() => 'some-uuid'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botfabrik/engine-webclient",
3
- "version": "4.101.3-alpha.0",
3
+ "version": "4.101.3-alpha.1",
4
4
  "description": "Webclient for Botfabriks Bot Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -39,7 +39,7 @@
39
39
  "accept-language-parser": "^1.5.0",
40
40
  "express": "^5.1.0",
41
41
  "flat": "^6.0.1",
42
- "jsonwebtoken": "^9.0.2",
42
+ "jose": "^6.1.0",
43
43
  "passport": "^0.7.0"
44
44
  },
45
45
  "devDependencies": {
@@ -54,5 +54,5 @@
54
54
  "tsx": "^4.20.6",
55
55
  "typescript": "5.9.3"
56
56
  },
57
- "gitHead": "668bb5e26c514e7d091febc092c784db0dd65210"
57
+ "gitHead": "81a18be3eeb688d543b826c575714a15d9cd08a9"
58
58
  }