@smg-automotive/auth 6.8.0-auth0-update-instance-creation.1 → 6.8.0-auth0-update-middleware.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/dist/cjs/config/auth0.js +107 -0
- package/dist/cjs/config/auth0.js.map +1 -0
- package/dist/cjs/lib/authLinks.d.ts +12 -0
- package/dist/cjs/lib/authLinks.js +16 -0
- package/dist/cjs/lib/authLinks.js.map +1 -0
- package/dist/cjs/lib/utils.js +18 -0
- package/dist/cjs/lib/utils.js.map +1 -0
- package/dist/cjs/server/getAuth0Instance.js +40 -0
- package/dist/cjs/server/getAuth0Instance.js.map +1 -0
- package/dist/cjs/server/middleware.d.ts +11 -0
- package/dist/cjs/server/middleware.js +74 -0
- package/dist/cjs/server/middleware.js.map +1 -0
- package/dist/cjs/server.d.ts +1 -0
- package/dist/cjs/server.js +5 -1
- package/dist/cjs/server.js.map +1 -1
- package/dist/esm/config/auth0.js +105 -0
- package/dist/esm/config/auth0.js.map +1 -0
- package/dist/esm/lib/authLinks.d.ts +12 -0
- package/dist/esm/lib/authLinks.js +14 -0
- package/dist/esm/lib/authLinks.js.map +1 -0
- package/dist/esm/lib/utils.js +15 -0
- package/dist/esm/lib/utils.js.map +1 -0
- package/dist/esm/server/getAuth0Instance.js +38 -0
- package/dist/esm/server/getAuth0Instance.js.map +1 -0
- package/dist/esm/server/middleware.d.ts +11 -0
- package/dist/esm/server/middleware.js +72 -0
- package/dist/esm/server/middleware.js.map +1 -0
- package/dist/esm/server.d.ts +1 -0
- package/dist/esm/server.js +1 -1
- package/dist/esm/server.js.map +1 -1
- package/dist/server.d.ts +13 -1
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('../lib/utils.js');
|
|
4
|
+
|
|
5
|
+
const isDevelopmentEnvironment = process.env.CONFIG_ENV === 'development';
|
|
6
|
+
const proxyPathSegment = utils.ensureString(process.env.PROXY_REQUEST_PATH_SEGMENT);
|
|
7
|
+
const legacyAccessTokenName = utils.ensureString(process.env.AUTH0_CUSTOM_LEGACY_ACCESS_TOKEN_NAME);
|
|
8
|
+
const legacyRefreshTokenName = utils.ensureString(process.env.AUTH0_CUSTOM_LEGACY_REFRESH_TOKEN_NAME);
|
|
9
|
+
const defaultLocale = utils.ensureString(process.env.DEFAULT_LOCALE);
|
|
10
|
+
const supportedLocales = utils.ensureString(process.env.SUPPORTED_LOCALES)
|
|
11
|
+
.split(',')
|
|
12
|
+
.filter(Boolean);
|
|
13
|
+
const sessionCookieName = utils.ensureString(process.env.AUTH0_SESSION_NAME);
|
|
14
|
+
const audience = utils.ensureString(process.env.AUTH0_AUDIENCE);
|
|
15
|
+
const authCookieNames = utils.ensureString(process.env.AUTH0_CUSTOM_AUTH_COOKIE_NAMES)
|
|
16
|
+
.split(',')
|
|
17
|
+
.filter(Boolean);
|
|
18
|
+
if (!defaultLocale) {
|
|
19
|
+
throw new Error('[Auth-package] DEFAULT_LOCALE is not set');
|
|
20
|
+
}
|
|
21
|
+
if (supportedLocales.length === 0) {
|
|
22
|
+
throw new Error('[Auth-package] SUPPORTED_LOCALES is not set');
|
|
23
|
+
}
|
|
24
|
+
const auth0Config = {
|
|
25
|
+
// Endpoint where the user gets redirected to auth0 universal login
|
|
26
|
+
loginEndpoint: '/api/auth/login',
|
|
27
|
+
// Endpoint where the user gets redirected to auth0 universal logout
|
|
28
|
+
logoutEndpoint: '/api/auth/logout',
|
|
29
|
+
// Endpoint to fetch and refresh token
|
|
30
|
+
// TODO: this is used client side and only configurable via env variable
|
|
31
|
+
tokenEndpoint: '/auth/token',
|
|
32
|
+
// Endpoint to fetch and refresh token
|
|
33
|
+
callbackEndpoint: '/api/auth/callback',
|
|
34
|
+
// Endpoint to fetch user profile
|
|
35
|
+
// TODO: this is used client side and only configurable via env variable
|
|
36
|
+
userProfileEndpoint: '/auth/profile',
|
|
37
|
+
// Interval delay to check if the token needs to be refreshed
|
|
38
|
+
intervalDelayInMs: 10000,
|
|
39
|
+
// If the token is valid for less than the specified time to app will rotate the token
|
|
40
|
+
refreshThresholdInMs: 300000,
|
|
41
|
+
// Segment to prefix on request when run in environments with a reverse proxy
|
|
42
|
+
proxyPathSegment: '',
|
|
43
|
+
// Legacy access token name
|
|
44
|
+
legacyAccessTokenName: '',
|
|
45
|
+
// Legacy refresh token name
|
|
46
|
+
legacyRefreshTokenName: '',
|
|
47
|
+
// Interval in MS to call function that checks if the token needs to be refreshed
|
|
48
|
+
providerInterval: 10000,
|
|
49
|
+
// Debug flag to force a token refresh on every interval
|
|
50
|
+
debugForceTokenRefresh: false,
|
|
51
|
+
// Language configuration
|
|
52
|
+
languageConfig: {
|
|
53
|
+
default: defaultLocale,
|
|
54
|
+
supported: supportedLocales,
|
|
55
|
+
},
|
|
56
|
+
// A domain wide cross project cookie storing the sellerId the user want's to act as in the system
|
|
57
|
+
// Used for Multi-tenant accounts capable of multiple sellers
|
|
58
|
+
selectedSellerIdCookie: {
|
|
59
|
+
name: 'selectedSellerId',
|
|
60
|
+
httpOnly: true,
|
|
61
|
+
maxAge: 30 * 24 * 60 * 60,
|
|
62
|
+
secure: true,
|
|
63
|
+
sameSite: 'lax',
|
|
64
|
+
path: '/',
|
|
65
|
+
},
|
|
66
|
+
// A domain wide cross project cookie storing impersonated sellerId
|
|
67
|
+
// Marks a restricted back-office functionality
|
|
68
|
+
impersonatedSellerIdCookie: {
|
|
69
|
+
name: 'impersonatedSellerId',
|
|
70
|
+
httpOnly: true,
|
|
71
|
+
maxAge: 1 * 60 * 60,
|
|
72
|
+
secure: true,
|
|
73
|
+
sameSite: 'lax',
|
|
74
|
+
path: '/',
|
|
75
|
+
},
|
|
76
|
+
// Auth scopes
|
|
77
|
+
scopes: 'openid email offline_access webapp.autoscout24.ch',
|
|
78
|
+
// Global path to redirect to for auth errors must only be implemented by one project and exposed trough the proxy
|
|
79
|
+
globalAuthErrorPath: '/errors/auth',
|
|
80
|
+
// List of auth related cookies to be cleared on logout
|
|
81
|
+
authCookieNames,
|
|
82
|
+
// Name of the session cookie
|
|
83
|
+
sessionCookieName,
|
|
84
|
+
// Audience of the auth0 application
|
|
85
|
+
audience,
|
|
86
|
+
};
|
|
87
|
+
const getAuth0Config = ({ isProxied, }) => {
|
|
88
|
+
const runtimeConfig = { ...auth0Config };
|
|
89
|
+
runtimeConfig.proxyPathSegment = utils.ensureSlash(proxyPathSegment);
|
|
90
|
+
runtimeConfig.legacyAccessTokenName = legacyAccessTokenName;
|
|
91
|
+
runtimeConfig.legacyRefreshTokenName = legacyRefreshTokenName;
|
|
92
|
+
runtimeConfig.selectedSellerIdCookie.secure = !isDevelopmentEnvironment;
|
|
93
|
+
if (!isProxied) {
|
|
94
|
+
return runtimeConfig;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
...runtimeConfig,
|
|
98
|
+
loginEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.loginEndpoint}`,
|
|
99
|
+
logoutEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.logoutEndpoint}`,
|
|
100
|
+
tokenEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.tokenEndpoint}`,
|
|
101
|
+
userProfileEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.userProfileEndpoint}`,
|
|
102
|
+
callbackEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.callbackEndpoint}`,
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
exports.getAuth0Config = getAuth0Config;
|
|
107
|
+
//# sourceMappingURL=auth0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth0.js","sources":["../../../../src/config/auth0.ts"],"sourcesContent":[null],"names":["ensureString","ensureSlash"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Language } from '@smg-automotive/i18n-pkg';
|
|
2
|
+
import { Auth0Config } from 'src/types';
|
|
3
|
+
export declare const getLogoutLink: ({ returnTo, language, auth0Config, }: {
|
|
4
|
+
returnTo?: string;
|
|
5
|
+
language?: Language;
|
|
6
|
+
auth0Config: Auth0Config | null;
|
|
7
|
+
}) => string;
|
|
8
|
+
export declare const getLoginLink: ({ returnTo, language, auth0Config, }: {
|
|
9
|
+
returnTo?: string;
|
|
10
|
+
language?: Language;
|
|
11
|
+
auth0Config: Auth0Config | null;
|
|
12
|
+
}) => string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var i18nPkg = require('@smg-automotive/i18n-pkg');
|
|
4
|
+
|
|
5
|
+
const getLoginLink = ({ returnTo, language = i18nPkg.defaultLanguage, auth0Config, }) => {
|
|
6
|
+
if (!auth0Config) {
|
|
7
|
+
throw new Error('Missing auth0Config');
|
|
8
|
+
}
|
|
9
|
+
const encodedReturnTo = returnTo
|
|
10
|
+
? `&returnTo=${encodeURIComponent(returnTo)}`
|
|
11
|
+
: '';
|
|
12
|
+
return `${auth0Config.loginEndpoint}?locale=${language}${encodedReturnTo}`;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.getLoginLink = getLoginLink;
|
|
16
|
+
//# sourceMappingURL=authLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authLinks.js","sources":["../../../../src/lib/authLinks.ts"],"sourcesContent":[null],"names":["defaultLanguage"],"mappings":";;;;AAwBO,MAAM,YAAY,GAAG,CAAC,EAC3B,QAAQ,EACR,QAAQ,GAAGA,uBAAe,EAC1B,WAAW,GAKZ,KAAI;IACH,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;IACxC;IACA,MAAM,eAAe,GAAG;AACtB,UAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,QAAQ,CAAC,CAAA;UACzC,EAAE;IAEN,OAAO,CAAA,EAAG,WAAW,CAAC,aAAa,WAAW,QAAQ,CAAA,EAAG,eAAe,CAAA,CAAE;AAC5E;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ensureString = (value) => {
|
|
4
|
+
if (typeof value !== 'string') {
|
|
5
|
+
return '';
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
};
|
|
9
|
+
const ensureSlash = (path) => {
|
|
10
|
+
if (path.startsWith('/')) {
|
|
11
|
+
return path;
|
|
12
|
+
}
|
|
13
|
+
return `/${path}`;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
exports.ensureSlash = ensureSlash;
|
|
17
|
+
exports.ensureString = ensureString;
|
|
18
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/lib/utils.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAO,MAAM,YAAY,GAAG,CAAC,KAAyB,KAAI;AACxD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO,KAAK;AACd;AAEO,MAAM,WAAW,GAAG,CAAC,IAAY,KAAI;AAC1C,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AACnB;;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('@auth0/nextjs-auth0/server');
|
|
4
|
+
var auth0 = require('../config/auth0.js');
|
|
5
|
+
|
|
6
|
+
const instances = {};
|
|
7
|
+
const buildInstanceKey = ({ host, isProxied, protocol, }) => {
|
|
8
|
+
return `${protocol}-${host}-isProxied-${isProxied}`;
|
|
9
|
+
};
|
|
10
|
+
const getAuth0Instance = ({ protocol, host, isProxied, }) => {
|
|
11
|
+
const key = buildInstanceKey({ host, isProxied, protocol });
|
|
12
|
+
const instance = instances[key];
|
|
13
|
+
if (instance) {
|
|
14
|
+
return instance;
|
|
15
|
+
}
|
|
16
|
+
const auth0Config = auth0.getAuth0Config({ isProxied });
|
|
17
|
+
const appBaseUrl = `${protocol}://${host}`;
|
|
18
|
+
const newInstance = new server.Auth0Client({
|
|
19
|
+
appBaseUrl,
|
|
20
|
+
routes: {
|
|
21
|
+
login: auth0Config.loginEndpoint,
|
|
22
|
+
logout: auth0Config.logoutEndpoint,
|
|
23
|
+
callback: auth0Config.callbackEndpoint,
|
|
24
|
+
},
|
|
25
|
+
session: {
|
|
26
|
+
cookie: {
|
|
27
|
+
name: auth0Config.sessionCookieName,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
authorizationParameters: {
|
|
31
|
+
scope: auth0Config.scopes,
|
|
32
|
+
audience: auth0Config.audience,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
instances[key] = newInstance;
|
|
36
|
+
return newInstance;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
exports.getAuth0Instance = getAuth0Instance;
|
|
40
|
+
//# sourceMappingURL=getAuth0Instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAuth0Instance.js","sources":["../../../../src/server/getAuth0Instance.ts"],"sourcesContent":[null],"names":["getAuth0Config","Auth0Client"],"mappings":";;;;;AAKA,MAAM,SAAS,GAAmB,EAAE;AAQpC,MAAM,gBAAgB,GAAG,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,QAAQ,GACgB,KAAI;AAC5B,IAAA,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,EAAc,SAAS,EAAE;AACrD,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,IAAI,EACJ,SAAS,GACe,KAAiB;AACzC,IAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC3D,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC;IAC/B,IAAI,QAAQ,EAAE;AACZ,QAAA,OAAO,QAAQ;IACjB;IAEA,MAAM,WAAW,GAAGA,oBAAc,CAAC,EAAE,SAAS,EAAE,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,EAAE;AAC1C,IAAA,MAAM,WAAW,GAAG,IAAIC,kBAAW,CAAC;QAClC,UAAU;AACV,QAAA,MAAM,EAAE;YACN,KAAK,EAAE,WAAW,CAAC,aAAa;YAChC,MAAM,EAAE,WAAW,CAAC,cAAc;YAClC,QAAQ,EAAE,WAAW,CAAC,gBAAgB;AACvC,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,MAAM,EAAE;gBACN,IAAI,EAAE,WAAW,CAAC,iBAAiB;AACpC,aAAA;AACF,SAAA;AACD,QAAA,uBAAuB,EAAE;YACvB,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,QAAQ,EAAE,WAAW,CAAC,QAAQ;AAC/B,SAAA;AACF,KAAA,CAAC;AACF,IAAA,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW;AAC5B,IAAA,OAAO,WAAW;AACpB;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { Language } from '@smg-automotive/i18n-pkg';
|
|
3
|
+
export declare const authMiddleware: ({ request, isProtectedRoute, language, host, protocol, isProxied, onError, }: {
|
|
4
|
+
request: NextRequest;
|
|
5
|
+
isProtectedRoute: (path: string) => boolean;
|
|
6
|
+
language: Language;
|
|
7
|
+
host: string;
|
|
8
|
+
protocol: string;
|
|
9
|
+
isProxied: boolean;
|
|
10
|
+
onError?: (error: Error) => void;
|
|
11
|
+
}) => Promise<NextResponse>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('next/server');
|
|
4
|
+
var authLinks = require('../lib/authLinks.js');
|
|
5
|
+
var auth0 = require('../config/auth0.js');
|
|
6
|
+
var getAuth0Instance = require('./getAuth0Instance.js');
|
|
7
|
+
|
|
8
|
+
const redirectToLogin = ({ auth0Config, language, returnTo, origin, }) => {
|
|
9
|
+
const loginUrl = authLinks.getLoginLink({
|
|
10
|
+
auth0Config,
|
|
11
|
+
language,
|
|
12
|
+
returnTo,
|
|
13
|
+
});
|
|
14
|
+
return server.NextResponse.redirect(new URL(loginUrl, origin), {
|
|
15
|
+
status: 307,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
const isAuthRoute = (pathname, auth0Config) => {
|
|
19
|
+
const { loginEndpoint, logoutEndpoint, callbackEndpoint, userProfileEndpoint, tokenEndpoint, } = auth0Config;
|
|
20
|
+
return [
|
|
21
|
+
loginEndpoint,
|
|
22
|
+
logoutEndpoint,
|
|
23
|
+
callbackEndpoint,
|
|
24
|
+
userProfileEndpoint,
|
|
25
|
+
tokenEndpoint,
|
|
26
|
+
].includes(pathname);
|
|
27
|
+
};
|
|
28
|
+
const authMiddleware = async ({ request, isProtectedRoute, language, host, protocol, isProxied, onError, }) => {
|
|
29
|
+
const { origin, pathname, search } = request.nextUrl;
|
|
30
|
+
const auth0Instance = getAuth0Instance.getAuth0Instance({ host, protocol, isProxied });
|
|
31
|
+
const auth0Config = auth0.getAuth0Config({ isProxied });
|
|
32
|
+
const isAuthErrorRoute = pathname.endsWith(auth0Config.globalAuthErrorPath);
|
|
33
|
+
const authResponse = await auth0Instance.middleware(request);
|
|
34
|
+
if (isAuthErrorRoute ||
|
|
35
|
+
isAuthRoute(pathname, auth0Config) ||
|
|
36
|
+
!isProtectedRoute(pathname)) {
|
|
37
|
+
return authResponse;
|
|
38
|
+
}
|
|
39
|
+
const session = await auth0Instance.getSession(request);
|
|
40
|
+
if (!session) {
|
|
41
|
+
return redirectToLogin({
|
|
42
|
+
auth0Config,
|
|
43
|
+
language,
|
|
44
|
+
returnTo: `${pathname}${search}`,
|
|
45
|
+
origin,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
// TODO: should this use a helper
|
|
50
|
+
await auth0Instance.getAccessToken(request, authResponse);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const authError = error;
|
|
54
|
+
onError?.(authError);
|
|
55
|
+
return redirectToLogin({
|
|
56
|
+
auth0Config,
|
|
57
|
+
language,
|
|
58
|
+
returnTo: `${pathname}${search}`,
|
|
59
|
+
origin,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const responseWithCombinedHeaders = server.NextResponse.next({
|
|
63
|
+
request: {
|
|
64
|
+
headers: request.headers,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
authResponse.headers.forEach((value, key) => {
|
|
68
|
+
responseWithCombinedHeaders.headers.set(key, value);
|
|
69
|
+
});
|
|
70
|
+
return responseWithCombinedHeaders;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
exports.authMiddleware = authMiddleware;
|
|
74
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sources":["../../../../src/server/middleware.ts"],"sourcesContent":[null],"names":["getLoginLink","NextResponse","getAuth0Instance","getAuth0Config"],"mappings":";;;;;;;AAWA,MAAM,eAAe,GAAG,CAAC,EACvB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,GAMP,KAAI;IACH,MAAM,QAAQ,GAAGA,sBAAY,CAAC;QAC5B,WAAW;QACX,QAAQ;QACR,QAAQ;AACT,KAAA,CAAC;IAEF,OAAOC,mBAAY,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;AACtD,QAAA,MAAM,EAAE,GAAG;AACZ,KAAA,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,WAAwB,KAAI;AACjE,IAAA,MAAM,EACJ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GACd,GAAG,WAAW;IAEf,OAAO;QACL,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;AACd,KAAA,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtB,CAAC;MAEY,cAAc,GAAG,OAAO,EACnC,OAAO,EACP,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,GASR,KAA2B;IAC1B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO;AACpD,IAAA,MAAM,aAAa,GAAGC,iCAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAErE,MAAM,WAAW,GAAGC,oBAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IACjD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,mBAAmB,CAAC;IAE3E,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;AAE5D,IAAA,IACE,gBAAgB;AAChB,QAAA,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC;AAClC,QAAA,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC3B;AACA,QAAA,OAAO,YAAY;IACrB;IAEA,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAEvD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,eAAe,CAAC;YACrB,WAAW;YACX,QAAQ;AACR,YAAA,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAE;YAChC,MAAM;AACP,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI;;QAEF,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC;IAC3D;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,SAAS,GAAG,KAAiB;AACnC,QAAA,OAAO,GAAG,SAAS,CAAC;AAEpB,QAAA,OAAO,eAAe,CAAC;YACrB,WAAW;YACX,QAAQ;AACR,YAAA,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAE;YAChC,MAAM;AACP,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,2BAA2B,GAAGF,mBAAY,CAAC,IAAI,CAAC;AACpD,QAAA,OAAO,EAAE;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA;AACF,KAAA,CAAC;IACF,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;QAC1C,2BAA2B,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AACrD,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,2BAA2B;AACpC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { authMiddleware } from './server/middleware';
|
package/dist/cjs/server.js
CHANGED
package/dist/cjs/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ensureString, ensureSlash } from '../lib/utils.js';
|
|
2
|
+
|
|
3
|
+
const isDevelopmentEnvironment = process.env.CONFIG_ENV === 'development';
|
|
4
|
+
const proxyPathSegment = ensureString(process.env.PROXY_REQUEST_PATH_SEGMENT);
|
|
5
|
+
const legacyAccessTokenName = ensureString(process.env.AUTH0_CUSTOM_LEGACY_ACCESS_TOKEN_NAME);
|
|
6
|
+
const legacyRefreshTokenName = ensureString(process.env.AUTH0_CUSTOM_LEGACY_REFRESH_TOKEN_NAME);
|
|
7
|
+
const defaultLocale = ensureString(process.env.DEFAULT_LOCALE);
|
|
8
|
+
const supportedLocales = ensureString(process.env.SUPPORTED_LOCALES)
|
|
9
|
+
.split(',')
|
|
10
|
+
.filter(Boolean);
|
|
11
|
+
const sessionCookieName = ensureString(process.env.AUTH0_SESSION_NAME);
|
|
12
|
+
const audience = ensureString(process.env.AUTH0_AUDIENCE);
|
|
13
|
+
const authCookieNames = ensureString(process.env.AUTH0_CUSTOM_AUTH_COOKIE_NAMES)
|
|
14
|
+
.split(',')
|
|
15
|
+
.filter(Boolean);
|
|
16
|
+
if (!defaultLocale) {
|
|
17
|
+
throw new Error('[Auth-package] DEFAULT_LOCALE is not set');
|
|
18
|
+
}
|
|
19
|
+
if (supportedLocales.length === 0) {
|
|
20
|
+
throw new Error('[Auth-package] SUPPORTED_LOCALES is not set');
|
|
21
|
+
}
|
|
22
|
+
const auth0Config = {
|
|
23
|
+
// Endpoint where the user gets redirected to auth0 universal login
|
|
24
|
+
loginEndpoint: '/api/auth/login',
|
|
25
|
+
// Endpoint where the user gets redirected to auth0 universal logout
|
|
26
|
+
logoutEndpoint: '/api/auth/logout',
|
|
27
|
+
// Endpoint to fetch and refresh token
|
|
28
|
+
// TODO: this is used client side and only configurable via env variable
|
|
29
|
+
tokenEndpoint: '/auth/token',
|
|
30
|
+
// Endpoint to fetch and refresh token
|
|
31
|
+
callbackEndpoint: '/api/auth/callback',
|
|
32
|
+
// Endpoint to fetch user profile
|
|
33
|
+
// TODO: this is used client side and only configurable via env variable
|
|
34
|
+
userProfileEndpoint: '/auth/profile',
|
|
35
|
+
// Interval delay to check if the token needs to be refreshed
|
|
36
|
+
intervalDelayInMs: 10000,
|
|
37
|
+
// If the token is valid for less than the specified time to app will rotate the token
|
|
38
|
+
refreshThresholdInMs: 300000,
|
|
39
|
+
// Segment to prefix on request when run in environments with a reverse proxy
|
|
40
|
+
proxyPathSegment: '',
|
|
41
|
+
// Legacy access token name
|
|
42
|
+
legacyAccessTokenName: '',
|
|
43
|
+
// Legacy refresh token name
|
|
44
|
+
legacyRefreshTokenName: '',
|
|
45
|
+
// Interval in MS to call function that checks if the token needs to be refreshed
|
|
46
|
+
providerInterval: 10000,
|
|
47
|
+
// Debug flag to force a token refresh on every interval
|
|
48
|
+
debugForceTokenRefresh: false,
|
|
49
|
+
// Language configuration
|
|
50
|
+
languageConfig: {
|
|
51
|
+
default: defaultLocale,
|
|
52
|
+
supported: supportedLocales,
|
|
53
|
+
},
|
|
54
|
+
// A domain wide cross project cookie storing the sellerId the user want's to act as in the system
|
|
55
|
+
// Used for Multi-tenant accounts capable of multiple sellers
|
|
56
|
+
selectedSellerIdCookie: {
|
|
57
|
+
name: 'selectedSellerId',
|
|
58
|
+
httpOnly: true,
|
|
59
|
+
maxAge: 30 * 24 * 60 * 60,
|
|
60
|
+
secure: true,
|
|
61
|
+
sameSite: 'lax',
|
|
62
|
+
path: '/',
|
|
63
|
+
},
|
|
64
|
+
// A domain wide cross project cookie storing impersonated sellerId
|
|
65
|
+
// Marks a restricted back-office functionality
|
|
66
|
+
impersonatedSellerIdCookie: {
|
|
67
|
+
name: 'impersonatedSellerId',
|
|
68
|
+
httpOnly: true,
|
|
69
|
+
maxAge: 1 * 60 * 60,
|
|
70
|
+
secure: true,
|
|
71
|
+
sameSite: 'lax',
|
|
72
|
+
path: '/',
|
|
73
|
+
},
|
|
74
|
+
// Auth scopes
|
|
75
|
+
scopes: 'openid email offline_access webapp.autoscout24.ch',
|
|
76
|
+
// Global path to redirect to for auth errors must only be implemented by one project and exposed trough the proxy
|
|
77
|
+
globalAuthErrorPath: '/errors/auth',
|
|
78
|
+
// List of auth related cookies to be cleared on logout
|
|
79
|
+
authCookieNames,
|
|
80
|
+
// Name of the session cookie
|
|
81
|
+
sessionCookieName,
|
|
82
|
+
// Audience of the auth0 application
|
|
83
|
+
audience,
|
|
84
|
+
};
|
|
85
|
+
const getAuth0Config = ({ isProxied, }) => {
|
|
86
|
+
const runtimeConfig = { ...auth0Config };
|
|
87
|
+
runtimeConfig.proxyPathSegment = ensureSlash(proxyPathSegment);
|
|
88
|
+
runtimeConfig.legacyAccessTokenName = legacyAccessTokenName;
|
|
89
|
+
runtimeConfig.legacyRefreshTokenName = legacyRefreshTokenName;
|
|
90
|
+
runtimeConfig.selectedSellerIdCookie.secure = !isDevelopmentEnvironment;
|
|
91
|
+
if (!isProxied) {
|
|
92
|
+
return runtimeConfig;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
...runtimeConfig,
|
|
96
|
+
loginEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.loginEndpoint}`,
|
|
97
|
+
logoutEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.logoutEndpoint}`,
|
|
98
|
+
tokenEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.tokenEndpoint}`,
|
|
99
|
+
userProfileEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.userProfileEndpoint}`,
|
|
100
|
+
callbackEndpoint: `${runtimeConfig.proxyPathSegment}${runtimeConfig.callbackEndpoint}`,
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export { getAuth0Config };
|
|
105
|
+
//# sourceMappingURL=auth0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth0.js","sources":["../../../../src/config/auth0.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Language } from '@smg-automotive/i18n-pkg';
|
|
2
|
+
import { Auth0Config } from 'src/types';
|
|
3
|
+
export declare const getLogoutLink: ({ returnTo, language, auth0Config, }: {
|
|
4
|
+
returnTo?: string;
|
|
5
|
+
language?: Language;
|
|
6
|
+
auth0Config: Auth0Config | null;
|
|
7
|
+
}) => string;
|
|
8
|
+
export declare const getLoginLink: ({ returnTo, language, auth0Config, }: {
|
|
9
|
+
returnTo?: string;
|
|
10
|
+
language?: Language;
|
|
11
|
+
auth0Config: Auth0Config | null;
|
|
12
|
+
}) => string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defaultLanguage } from '@smg-automotive/i18n-pkg';
|
|
2
|
+
|
|
3
|
+
const getLoginLink = ({ returnTo, language = defaultLanguage, auth0Config, }) => {
|
|
4
|
+
if (!auth0Config) {
|
|
5
|
+
throw new Error('Missing auth0Config');
|
|
6
|
+
}
|
|
7
|
+
const encodedReturnTo = returnTo
|
|
8
|
+
? `&returnTo=${encodeURIComponent(returnTo)}`
|
|
9
|
+
: '';
|
|
10
|
+
return `${auth0Config.loginEndpoint}?locale=${language}${encodedReturnTo}`;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { getLoginLink };
|
|
14
|
+
//# sourceMappingURL=authLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authLinks.js","sources":["../../../../src/lib/authLinks.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAwBO,MAAM,YAAY,GAAG,CAAC,EAC3B,QAAQ,EACR,QAAQ,GAAG,eAAe,EAC1B,WAAW,GAKZ,KAAI;IACH,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;IACxC;IACA,MAAM,eAAe,GAAG;AACtB,UAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,QAAQ,CAAC,CAAA;UACzC,EAAE;IAEN,OAAO,CAAA,EAAG,WAAW,CAAC,aAAa,WAAW,QAAQ,CAAA,EAAG,eAAe,CAAA,CAAE;AAC5E;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const ensureString = (value) => {
|
|
2
|
+
if (typeof value !== 'string') {
|
|
3
|
+
return '';
|
|
4
|
+
}
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
const ensureSlash = (path) => {
|
|
8
|
+
if (path.startsWith('/')) {
|
|
9
|
+
return path;
|
|
10
|
+
}
|
|
11
|
+
return `/${path}`;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { ensureSlash, ensureString };
|
|
15
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/lib/utils.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,YAAY,GAAG,CAAC,KAAyB,KAAI;AACxD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO,KAAK;AACd;AAEO,MAAM,WAAW,GAAG,CAAC,IAAY,KAAI;AAC1C,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AACnB;;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Auth0Client } from '@auth0/nextjs-auth0/server';
|
|
2
|
+
import { getAuth0Config } from '../config/auth0.js';
|
|
3
|
+
|
|
4
|
+
const instances = {};
|
|
5
|
+
const buildInstanceKey = ({ host, isProxied, protocol, }) => {
|
|
6
|
+
return `${protocol}-${host}-isProxied-${isProxied}`;
|
|
7
|
+
};
|
|
8
|
+
const getAuth0Instance = ({ protocol, host, isProxied, }) => {
|
|
9
|
+
const key = buildInstanceKey({ host, isProxied, protocol });
|
|
10
|
+
const instance = instances[key];
|
|
11
|
+
if (instance) {
|
|
12
|
+
return instance;
|
|
13
|
+
}
|
|
14
|
+
const auth0Config = getAuth0Config({ isProxied });
|
|
15
|
+
const appBaseUrl = `${protocol}://${host}`;
|
|
16
|
+
const newInstance = new Auth0Client({
|
|
17
|
+
appBaseUrl,
|
|
18
|
+
routes: {
|
|
19
|
+
login: auth0Config.loginEndpoint,
|
|
20
|
+
logout: auth0Config.logoutEndpoint,
|
|
21
|
+
callback: auth0Config.callbackEndpoint,
|
|
22
|
+
},
|
|
23
|
+
session: {
|
|
24
|
+
cookie: {
|
|
25
|
+
name: auth0Config.sessionCookieName,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
authorizationParameters: {
|
|
29
|
+
scope: auth0Config.scopes,
|
|
30
|
+
audience: auth0Config.audience,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
instances[key] = newInstance;
|
|
34
|
+
return newInstance;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { getAuth0Instance };
|
|
38
|
+
//# sourceMappingURL=getAuth0Instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAuth0Instance.js","sources":["../../../../src/server/getAuth0Instance.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAKA,MAAM,SAAS,GAAmB,EAAE;AAQpC,MAAM,gBAAgB,GAAG,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,QAAQ,GACgB,KAAI;AAC5B,IAAA,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,EAAc,SAAS,EAAE;AACrD,CAAC;AAEM,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,EACR,IAAI,EACJ,SAAS,GACe,KAAiB;AACzC,IAAA,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC3D,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC;IAC/B,IAAI,QAAQ,EAAE;AACZ,QAAA,OAAO,QAAQ;IACjB;IAEA,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,EAAE;AAC1C,IAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,UAAU;AACV,QAAA,MAAM,EAAE;YACN,KAAK,EAAE,WAAW,CAAC,aAAa;YAChC,MAAM,EAAE,WAAW,CAAC,cAAc;YAClC,QAAQ,EAAE,WAAW,CAAC,gBAAgB;AACvC,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,MAAM,EAAE;gBACN,IAAI,EAAE,WAAW,CAAC,iBAAiB;AACpC,aAAA;AACF,SAAA;AACD,QAAA,uBAAuB,EAAE;YACvB,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,QAAQ,EAAE,WAAW,CAAC,QAAQ;AAC/B,SAAA;AACF,KAAA,CAAC;AACF,IAAA,SAAS,CAAC,GAAG,CAAC,GAAG,WAAW;AAC5B,IAAA,OAAO,WAAW;AACpB;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { Language } from '@smg-automotive/i18n-pkg';
|
|
3
|
+
export declare const authMiddleware: ({ request, isProtectedRoute, language, host, protocol, isProxied, onError, }: {
|
|
4
|
+
request: NextRequest;
|
|
5
|
+
isProtectedRoute: (path: string) => boolean;
|
|
6
|
+
language: Language;
|
|
7
|
+
host: string;
|
|
8
|
+
protocol: string;
|
|
9
|
+
isProxied: boolean;
|
|
10
|
+
onError?: (error: Error) => void;
|
|
11
|
+
}) => Promise<NextResponse>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { getLoginLink } from '../lib/authLinks.js';
|
|
3
|
+
import { getAuth0Config } from '../config/auth0.js';
|
|
4
|
+
import { getAuth0Instance } from './getAuth0Instance.js';
|
|
5
|
+
|
|
6
|
+
const redirectToLogin = ({ auth0Config, language, returnTo, origin, }) => {
|
|
7
|
+
const loginUrl = getLoginLink({
|
|
8
|
+
auth0Config,
|
|
9
|
+
language,
|
|
10
|
+
returnTo,
|
|
11
|
+
});
|
|
12
|
+
return NextResponse.redirect(new URL(loginUrl, origin), {
|
|
13
|
+
status: 307,
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const isAuthRoute = (pathname, auth0Config) => {
|
|
17
|
+
const { loginEndpoint, logoutEndpoint, callbackEndpoint, userProfileEndpoint, tokenEndpoint, } = auth0Config;
|
|
18
|
+
return [
|
|
19
|
+
loginEndpoint,
|
|
20
|
+
logoutEndpoint,
|
|
21
|
+
callbackEndpoint,
|
|
22
|
+
userProfileEndpoint,
|
|
23
|
+
tokenEndpoint,
|
|
24
|
+
].includes(pathname);
|
|
25
|
+
};
|
|
26
|
+
const authMiddleware = async ({ request, isProtectedRoute, language, host, protocol, isProxied, onError, }) => {
|
|
27
|
+
const { origin, pathname, search } = request.nextUrl;
|
|
28
|
+
const auth0Instance = getAuth0Instance({ host, protocol, isProxied });
|
|
29
|
+
const auth0Config = getAuth0Config({ isProxied });
|
|
30
|
+
const isAuthErrorRoute = pathname.endsWith(auth0Config.globalAuthErrorPath);
|
|
31
|
+
const authResponse = await auth0Instance.middleware(request);
|
|
32
|
+
if (isAuthErrorRoute ||
|
|
33
|
+
isAuthRoute(pathname, auth0Config) ||
|
|
34
|
+
!isProtectedRoute(pathname)) {
|
|
35
|
+
return authResponse;
|
|
36
|
+
}
|
|
37
|
+
const session = await auth0Instance.getSession(request);
|
|
38
|
+
if (!session) {
|
|
39
|
+
return redirectToLogin({
|
|
40
|
+
auth0Config,
|
|
41
|
+
language,
|
|
42
|
+
returnTo: `${pathname}${search}`,
|
|
43
|
+
origin,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// TODO: should this use a helper
|
|
48
|
+
await auth0Instance.getAccessToken(request, authResponse);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const authError = error;
|
|
52
|
+
onError?.(authError);
|
|
53
|
+
return redirectToLogin({
|
|
54
|
+
auth0Config,
|
|
55
|
+
language,
|
|
56
|
+
returnTo: `${pathname}${search}`,
|
|
57
|
+
origin,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const responseWithCombinedHeaders = NextResponse.next({
|
|
61
|
+
request: {
|
|
62
|
+
headers: request.headers,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
authResponse.headers.forEach((value, key) => {
|
|
66
|
+
responseWithCombinedHeaders.headers.set(key, value);
|
|
67
|
+
});
|
|
68
|
+
return responseWithCombinedHeaders;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export { authMiddleware };
|
|
72
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sources":["../../../../src/server/middleware.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAWA,MAAM,eAAe,GAAG,CAAC,EACvB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,GAMP,KAAI;IACH,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC5B,WAAW;QACX,QAAQ;QACR,QAAQ;AACT,KAAA,CAAC;IAEF,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;AACtD,QAAA,MAAM,EAAE,GAAG;AACZ,KAAA,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,WAAwB,KAAI;AACjE,IAAA,MAAM,EACJ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,GACd,GAAG,WAAW;IAEf,OAAO;QACL,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;AACd,KAAA,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtB,CAAC;MAEY,cAAc,GAAG,OAAO,EACnC,OAAO,EACP,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,GASR,KAA2B;IAC1B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO;AACpD,IAAA,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAErE,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IACjD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,mBAAmB,CAAC;IAE3E,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;AAE5D,IAAA,IACE,gBAAgB;AAChB,QAAA,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC;AAClC,QAAA,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAC3B;AACA,QAAA,OAAO,YAAY;IACrB;IAEA,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAEvD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,eAAe,CAAC;YACrB,WAAW;YACX,QAAQ;AACR,YAAA,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAE;YAChC,MAAM;AACP,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI;;QAEF,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC;IAC3D;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,SAAS,GAAG,KAAiB;AACnC,QAAA,OAAO,GAAG,SAAS,CAAC;AAEpB,QAAA,OAAO,eAAe,CAAC;YACrB,WAAW;YACX,QAAQ;AACR,YAAA,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,CAAE;YAChC,MAAM;AACP,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,2BAA2B,GAAG,YAAY,CAAC,IAAI,CAAC;AACpD,QAAA,OAAO,EAAE;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA;AACF,KAAA,CAAC;IACF,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;QAC1C,2BAA2B,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AACrD,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,2BAA2B;AACpC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { authMiddleware } from './server/middleware';
|
package/dist/esm/server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
export { authMiddleware } from './server/middleware.js';
|
|
2
2
|
//# sourceMappingURL=server.js.map
|
package/dist/esm/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { Language } from '@smg-automotive/i18n-pkg';
|
|
1
3
|
|
|
2
|
-
|
|
4
|
+
declare const authMiddleware: ({ request, isProtectedRoute, language, host, protocol, isProxied, onError, }: {
|
|
5
|
+
request: NextRequest;
|
|
6
|
+
isProtectedRoute: (path: string) => boolean;
|
|
7
|
+
language: Language;
|
|
8
|
+
host: string;
|
|
9
|
+
protocol: string;
|
|
10
|
+
isProxied: boolean;
|
|
11
|
+
onError?: (error: Error) => void;
|
|
12
|
+
}) => Promise<NextResponse>;
|
|
13
|
+
|
|
14
|
+
export { authMiddleware };
|