@smg-automotive/auth 8.2.0-lschuerch-FED-883-user-endpoint.1 → 8.2.1-instrumentation-with-debug.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 +66 -0
- package/dist/cjs/client/hooks/useUser.js +2 -2
- package/dist/cjs/client/hooks/useUser.js.map +1 -1
- package/dist/cjs/server/helpers/getAccessToken.js +12 -0
- package/dist/cjs/server/helpers/getAccessToken.js.map +1 -1
- package/dist/cjs/server/helpers/getUser.js +39 -7
- package/dist/cjs/server/helpers/getUser.js.map +1 -1
- package/dist/cjs/server/hooks/onCallbackFactory.d.ts +1 -1
- package/dist/cjs/server/hooks/onCallbackFactory.js +14 -1
- package/dist/cjs/server/hooks/onCallbackFactory.js.map +1 -1
- package/dist/cjs/server/middleware/index.js +42 -0
- package/dist/cjs/server/middleware/index.js.map +1 -1
- package/dist/cjs/server/middleware/logout.d.ts +4 -2
- package/dist/cjs/server/middleware/logout.js +34 -13
- package/dist/cjs/server/middleware/logout.js.map +1 -1
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.d.ts +2 -1
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.js +26 -4
- package/dist/cjs/server/middleware/proactivelyRefreshAccessToken.js.map +1 -1
- package/dist/cjs/server/middleware/profile.d.ts +2 -1
- package/dist/cjs/server/middleware/profile.js +27 -3
- package/dist/cjs/server/middleware/profile.js.map +1 -1
- package/dist/cjs/server/middleware/protectRoute.d.ts +2 -1
- package/dist/cjs/server/middleware/protectRoute.js +26 -2
- package/dist/cjs/server/middleware/protectRoute.js.map +1 -1
- package/dist/cjs/server/middleware/token.d.ts +2 -1
- package/dist/cjs/server/middleware/token.js +20 -1
- package/dist/cjs/server/middleware/token.js.map +1 -1
- package/dist/esm/client/hooks/useUser.js +2 -2
- package/dist/esm/client/hooks/useUser.js.map +1 -1
- package/dist/esm/server/helpers/getAccessToken.js +8 -0
- package/dist/esm/server/helpers/getAccessToken.js.map +1 -1
- package/dist/esm/server/helpers/getUser.js +35 -7
- package/dist/esm/server/helpers/getUser.js.map +1 -1
- package/dist/esm/server/hooks/onCallbackFactory.d.ts +1 -1
- package/dist/esm/server/hooks/onCallbackFactory.js +14 -1
- package/dist/esm/server/hooks/onCallbackFactory.js.map +1 -1
- package/dist/esm/server/middleware/index.js +38 -0
- package/dist/esm/server/middleware/index.js.map +1 -1
- package/dist/esm/server/middleware/logout.d.ts +4 -2
- package/dist/esm/server/middleware/logout.js +30 -13
- package/dist/esm/server/middleware/logout.js.map +1 -1
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.d.ts +2 -1
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.js +22 -4
- package/dist/esm/server/middleware/proactivelyRefreshAccessToken.js.map +1 -1
- package/dist/esm/server/middleware/profile.d.ts +2 -1
- package/dist/esm/server/middleware/profile.js +23 -3
- package/dist/esm/server/middleware/profile.js.map +1 -1
- package/dist/esm/server/middleware/protectRoute.d.ts +2 -1
- package/dist/esm/server/middleware/protectRoute.js +22 -2
- package/dist/esm/server/middleware/protectRoute.js.map +1 -1
- package/dist/esm/server/middleware/token.d.ts +2 -1
- package/dist/esm/server/middleware/token.js +16 -1
- package/dist/esm/server/middleware/token.js.map +1 -1
- package/package.json +6 -4
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
var session = require('../../lib/enrichUser/session.js');
|
|
5
6
|
var proactivelyRefreshAccessToken = require('./proactivelyRefreshAccessToken.js');
|
|
6
7
|
var combineHeaders = require('./combineHeaders.js');
|
|
7
8
|
var combineCookies = require('./combineCookies.js');
|
|
8
9
|
var addCachingHeaders = require('./addCachingHeaders.js');
|
|
9
10
|
|
|
11
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
14
|
+
|
|
15
|
+
const log = debug__default.default('@smg-automotive/auth:profile');
|
|
10
16
|
const responseHeaders = {
|
|
11
17
|
Vary: 'Cookie, Authorization',
|
|
12
18
|
'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0',
|
|
13
19
|
Pragma: 'no-cache',
|
|
14
20
|
Expires: '0',
|
|
15
21
|
};
|
|
16
|
-
const handleUserProfile = async ({ request, response, auth0Instance, auth0Config, brand, }) => {
|
|
22
|
+
const handleUserProfile = async ({ requestId, request, response, auth0Instance, auth0Config, brand, }) => {
|
|
17
23
|
if (request.nextUrl.pathname !== auth0Config.userProfileEndpoint)
|
|
18
24
|
return;
|
|
25
|
+
log('Handling user profile request', { requestId, brand });
|
|
19
26
|
const session$1 = await auth0Instance.getSession(request);
|
|
20
27
|
if (!session$1) {
|
|
28
|
+
log('No session found for profile request', { requestId });
|
|
21
29
|
return new server.NextResponse(null, {
|
|
22
30
|
status: 204,
|
|
23
31
|
headers: responseHeaders,
|
|
@@ -25,17 +33,30 @@ const handleUserProfile = async ({ request, response, auth0Instance, auth0Config
|
|
|
25
33
|
}
|
|
26
34
|
try {
|
|
27
35
|
const user = session$1.user;
|
|
36
|
+
log('User found, refreshing token and enriching', {
|
|
37
|
+
requestId,
|
|
38
|
+
userId: user.userId,
|
|
39
|
+
sellerId: user.sellerId,
|
|
40
|
+
});
|
|
28
41
|
const { token } = await proactivelyRefreshAccessToken.proactivelyRefreshAccessToken({
|
|
42
|
+
requestId,
|
|
29
43
|
request,
|
|
30
44
|
response,
|
|
31
45
|
auth0Instance,
|
|
32
46
|
auth0Config,
|
|
33
47
|
});
|
|
48
|
+
log('Token refreshed, enriching user', { requestId });
|
|
34
49
|
const enrichedUser = await session.enrichUser({
|
|
35
50
|
user,
|
|
36
51
|
accessToken: token,
|
|
37
52
|
brand,
|
|
38
53
|
});
|
|
54
|
+
log('User enriched successfully', {
|
|
55
|
+
requestId,
|
|
56
|
+
userId: enrichedUser.userId,
|
|
57
|
+
sellerId: enrichedUser.sellerId,
|
|
58
|
+
hasEntitlements: !!enrichedUser.entitlements,
|
|
59
|
+
});
|
|
39
60
|
const userResponse = server.NextResponse.json(enrichedUser);
|
|
40
61
|
const responseWithCombinedHeaders = combineHeaders.combineHeaders({
|
|
41
62
|
middlewareResponse: userResponse,
|
|
@@ -51,8 +72,11 @@ const handleUserProfile = async ({ request, response, auth0Instance, auth0Config
|
|
|
51
72
|
return responseWithCombinedHeaders;
|
|
52
73
|
}
|
|
53
74
|
catch (error) {
|
|
54
|
-
|
|
55
|
-
|
|
75
|
+
log('User Profile error loading entitlements', {
|
|
76
|
+
requestId,
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
79
|
+
});
|
|
56
80
|
let responseCode = 'UNKNOWN_AUTH_ERROR';
|
|
57
81
|
if (error &&
|
|
58
82
|
typeof error === 'object' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sources":["../../../../../src/server/middleware/profile.ts"],"sourcesContent":[null],"names":["session","NextResponse","proactivelyRefreshAccessToken","enrichUser","combineHeaders","addCachingHeaders","combineCookies"],"mappings":"
|
|
1
|
+
{"version":3,"file":"profile.js","sources":["../../../../../src/server/middleware/profile.ts"],"sourcesContent":[null],"names":["debug","session","NextResponse","proactivelyRefreshAccessToken","enrichUser","combineHeaders","addCachingHeaders","combineCookies"],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import { NextRequest, NextResponse } from 'next/server';
|
|
|
2
2
|
import { Language } from '@smg-automotive/i18n-pkg';
|
|
3
3
|
import { Auth0Client } from '@auth0/nextjs-auth0/server';
|
|
4
4
|
import { Auth0Config } from 'src/types';
|
|
5
|
-
export declare const protectRoute: ({ isProtected, auth0Instance, auth0Config, language, request, response, onError, }: {
|
|
5
|
+
export declare const protectRoute: ({ requestId, isProtected, auth0Instance, auth0Config, language, request, response, onError, }: {
|
|
6
|
+
requestId: string;
|
|
6
7
|
isProtected: boolean;
|
|
7
8
|
auth0Instance: Auth0Client;
|
|
8
9
|
auth0Config: Auth0Config;
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
var authLinks = require('../../lib/authLinks.js');
|
|
5
6
|
var proactivelyRefreshAccessToken = require('./proactivelyRefreshAccessToken.js');
|
|
6
7
|
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
11
|
+
|
|
12
|
+
const log = debug__default.default('@smg-automotive/auth:protectRoute');
|
|
7
13
|
const redirectToLogin = ({ auth0Config, language, returnTo, origin, }) => {
|
|
8
14
|
const loginUrl = authLinks.getLoginLink({
|
|
9
15
|
auth0Config,
|
|
@@ -14,13 +20,23 @@ const redirectToLogin = ({ auth0Config, language, returnTo, origin, }) => {
|
|
|
14
20
|
status: 307,
|
|
15
21
|
});
|
|
16
22
|
};
|
|
17
|
-
const protectRoute = async ({ isProtected, auth0Instance, auth0Config, language, request, response, onError, }) => {
|
|
18
|
-
const session = await auth0Instance.getSession(request);
|
|
23
|
+
const protectRoute = async ({ requestId, isProtected, auth0Instance, auth0Config, language, request, response, onError, }) => {
|
|
19
24
|
const { pathname, search, origin } = request.nextUrl;
|
|
25
|
+
log('Checking route protection', { requestId, pathname, isProtected });
|
|
26
|
+
const session = await auth0Instance.getSession(request);
|
|
27
|
+
log('Session check', {
|
|
28
|
+
requestId,
|
|
29
|
+
hasSession: !!session,
|
|
30
|
+
hasUser: !!session?.user,
|
|
31
|
+
});
|
|
20
32
|
if (!isProtected && !session?.user) {
|
|
33
|
+
log('Route not protected and no user session, allowing', { requestId });
|
|
21
34
|
return response;
|
|
22
35
|
}
|
|
23
36
|
if (!session && isProtected) {
|
|
37
|
+
log('Protected route without session, redirecting to login', {
|
|
38
|
+
requestId,
|
|
39
|
+
});
|
|
24
40
|
return redirectToLogin({
|
|
25
41
|
auth0Config,
|
|
26
42
|
language,
|
|
@@ -29,15 +45,23 @@ const protectRoute = async ({ isProtected, auth0Instance, auth0Config, language,
|
|
|
29
45
|
});
|
|
30
46
|
}
|
|
31
47
|
try {
|
|
48
|
+
log('Refreshing token for protected route', { requestId });
|
|
32
49
|
await proactivelyRefreshAccessToken.proactivelyRefreshAccessToken({
|
|
50
|
+
requestId,
|
|
33
51
|
request,
|
|
34
52
|
response,
|
|
35
53
|
auth0Instance,
|
|
36
54
|
auth0Config,
|
|
37
55
|
});
|
|
56
|
+
log('Token refreshed successfully, allowing access', { requestId });
|
|
38
57
|
}
|
|
39
58
|
catch (error) {
|
|
40
59
|
const authError = error;
|
|
60
|
+
log('Token refresh failed for protected route', {
|
|
61
|
+
requestId,
|
|
62
|
+
message: authError.message,
|
|
63
|
+
code: authError.code,
|
|
64
|
+
});
|
|
41
65
|
onError?.(authError);
|
|
42
66
|
return redirectToLogin({
|
|
43
67
|
auth0Config,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protectRoute.js","sources":["../../../../../src/server/middleware/protectRoute.ts"],"sourcesContent":[null],"names":["getLoginLink","NextResponse","proactivelyRefreshAccessToken"],"mappings":"
|
|
1
|
+
{"version":3,"file":"protectRoute.js","sources":["../../../../../src/server/middleware/protectRoute.ts"],"sourcesContent":[null],"names":["debug","getLoginLink","NextResponse","proactivelyRefreshAccessToken"],"mappings":";;;;;;;;;;;AAWA,MAAM,GAAG,GAAGA,sBAAK,CAAC,mCAAmC,CAAC;AAEtD,MAAM,eAAe,GAAG,CAAC,EACvB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,GAMP,KAAkB;IACjB,MAAM,QAAQ,GAAGC,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;AAEM,MAAM,YAAY,GAAG,OAAO,EACjC,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,GAUR,KAAkC;IACjC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO;IACpD,GAAG,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAEtE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IACvD,GAAG,CAAC,eAAe,EAAE;QACnB,SAAS;QACT,UAAU,EAAE,CAAC,CAAC,OAAO;AACrB,QAAA,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI;AACzB,KAAA,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AAClC,QAAA,GAAG,CAAC,mDAAmD,EAAE,EAAE,SAAS,EAAE,CAAC;AACvE,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE;QAC3B,GAAG,CAAC,uDAAuD,EAAE;YAC3D,SAAS;AACV,SAAA,CAAC;AACF,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;AACF,QAAA,GAAG,CAAC,sCAAsC,EAAE,EAAE,SAAS,EAAE,CAAC;AAC1D,QAAA,MAAMC,2DAA6B,CAAC;YAClC,SAAS;YACT,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;AACZ,SAAA,CAAC;AACF,QAAA,GAAG,CAAC,+CAA+C,EAAE,EAAE,SAAS,EAAE,CAAC;IACrE;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,SAAS,GAAG,KAAiB;QACnC,GAAG,CAAC,0CAA0C,EAAE;YAC9C,SAAS;YACT,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;AACrB,SAAA,CAAC;AACF,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;AACF;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { Auth0Client } from '@auth0/nextjs-auth0/server';
|
|
3
3
|
import { Auth0Config } from 'src/types';
|
|
4
|
-
export declare const handleAccessTokenRequest: ({ request, response, auth0Instance, auth0Config, onError, }: {
|
|
4
|
+
export declare const handleAccessTokenRequest: ({ requestId, request, response, auth0Instance, auth0Config, onError, }: {
|
|
5
|
+
requestId: string;
|
|
5
6
|
request: NextRequest;
|
|
6
7
|
response: NextResponse;
|
|
7
8
|
auth0Instance: Auth0Client;
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var debug = require('debug');
|
|
4
5
|
var errors = require('@auth0/nextjs-auth0/errors');
|
|
5
6
|
var proactivelyRefreshAccessToken = require('./proactivelyRefreshAccessToken.js');
|
|
6
7
|
var combineHeaders = require('./combineHeaders.js');
|
|
7
8
|
var combineCookies = require('./combineCookies.js');
|
|
8
9
|
var addCachingHeaders = require('./addCachingHeaders.js');
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var debug__default = /*#__PURE__*/_interopDefaultCompat(debug);
|
|
14
|
+
|
|
15
|
+
const log = debug__default.default('@smg-automotive/auth:token');
|
|
16
|
+
const handleAccessTokenRequest = async ({ requestId, request, response, auth0Instance, auth0Config, onError, }) => {
|
|
11
17
|
if (request.nextUrl.pathname !== auth0Config.tokenEndpoint)
|
|
12
18
|
return;
|
|
19
|
+
log('Handling access token request', {
|
|
20
|
+
requestId,
|
|
21
|
+
pathname: request.nextUrl.pathname,
|
|
22
|
+
});
|
|
13
23
|
const session = await auth0Instance.getSession(request);
|
|
14
24
|
if (!session) {
|
|
25
|
+
log('Access token request failed: no session', { requestId });
|
|
15
26
|
return server.NextResponse.json({
|
|
16
27
|
error: {
|
|
17
28
|
message: 'The user does not have an active session.',
|
|
@@ -22,12 +33,15 @@ const handleAccessTokenRequest = async ({ request, response, auth0Instance, auth
|
|
|
22
33
|
});
|
|
23
34
|
}
|
|
24
35
|
try {
|
|
36
|
+
log('Refreshing access token', { requestId });
|
|
25
37
|
const { token, expiresAt } = await proactivelyRefreshAccessToken.proactivelyRefreshAccessToken({
|
|
38
|
+
requestId,
|
|
26
39
|
request,
|
|
27
40
|
response,
|
|
28
41
|
auth0Instance,
|
|
29
42
|
auth0Config,
|
|
30
43
|
});
|
|
44
|
+
log('Access token refreshed successfully', { requestId, expiresAt });
|
|
31
45
|
const tokenResponse = server.NextResponse.json({
|
|
32
46
|
token,
|
|
33
47
|
expiresAt,
|
|
@@ -47,6 +61,11 @@ const handleAccessTokenRequest = async ({ request, response, auth0Instance, auth
|
|
|
47
61
|
}
|
|
48
62
|
catch (error) {
|
|
49
63
|
const authError = error;
|
|
64
|
+
log('Access token request error', {
|
|
65
|
+
requestId,
|
|
66
|
+
message: authError.message,
|
|
67
|
+
code: authError.code,
|
|
68
|
+
});
|
|
50
69
|
onError?.(authError);
|
|
51
70
|
return server.NextResponse.json({ error: { message: authError.message, code: authError.code } }, { status: 401 });
|
|
52
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sources":["../../../../../src/server/middleware/token.ts"],"sourcesContent":[null],"names":["NextResponse","AccessTokenErrorCode","proactivelyRefreshAccessToken","combineHeaders","addCachingHeaders","combineCookies"],"mappings":"
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../../../../src/server/middleware/token.ts"],"sourcesContent":[null],"names":["debug","NextResponse","AccessTokenErrorCode","proactivelyRefreshAccessToken","combineHeaders","addCachingHeaders","combineCookies"],"mappings":";;;;;;;;;;;;;;AAYA,MAAM,GAAG,GAAGA,sBAAK,CAAC,4BAA4B,CAAC;MAElC,wBAAwB,GAAG,OAAO,EAC7C,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,WAAW,EACX,OAAO,GAQR,KAAkC;IACjC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,WAAW,CAAC,aAAa;QAAE;IAE5D,GAAG,CAAC,+BAA+B,EAAE;QACnC,SAAS;AACT,QAAA,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;AACnC,KAAA,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC;IAEvD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,GAAG,CAAC,yCAAyC,EAAE,EAAE,SAAS,EAAE,CAAC;QAC7D,OAAOC,mBAAY,CAAC,IAAI,CACtB;AACE,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,EAAE,2CAA2C;gBACpD,IAAI,EAAEC,2BAAoB,CAAC,eAAe;AAC3C,aAAA;SACF,EACD;AACE,YAAA,MAAM,EAAE,GAAG;AACZ,SAAA,CACF;IACH;AAEA,IAAA,IAAI;AACF,QAAA,GAAG,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,CAAC;QAC7C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAMC,2DAA6B,CAAC;YAC/D,SAAS;YACT,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;AACZ,SAAA,CAAC;QACF,GAAG,CAAC,qCAAqC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACpE,QAAA,MAAM,aAAa,GAAGF,mBAAY,CAAC,IAAI,CAAC;YACtC,KAAK;YACL,SAAS;AACV,SAAA,CAAC;QACF,MAAM,2BAA2B,GAAGG,6BAAc,CAAC;AACjD,YAAA,kBAAkB,EAAE,aAAa;AACjC,YAAA,YAAY,EAAE,QAAQ;AACtB,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;QACFC,mCAAiB,CAAC,2BAA2B,CAAC;;AAE9C,QAAAC,6BAAc,CAAC;AACb,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,cAAc,EAAE,2BAA2B;AAC5C,SAAA,CAAC;AACF,QAAA,OAAO,2BAA2B;IACpC;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,SAAS,GAAG,KAAiB;QACnC,GAAG,CAAC,4BAA4B,EAAE;YAChC,SAAS;YACT,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;AACrB,SAAA,CAAC;AACF,QAAA,OAAO,GAAG,SAAS,CAAC;AACpB,QAAA,OAAOL,mBAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,EAC/D,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB;IACH;AACF;;;;"}
|
|
@@ -20,14 +20,14 @@ const userFetcher = async (url) => {
|
|
|
20
20
|
console.error('Failed to fetch user profile', error);
|
|
21
21
|
throw new Error('Failed to parse user endpoint response');
|
|
22
22
|
}
|
|
23
|
-
if (responseBody.error?.code) {
|
|
23
|
+
if (responseBody && responseBody.error?.code) {
|
|
24
24
|
throw new Error(responseBody.error.code);
|
|
25
25
|
}
|
|
26
26
|
throw new Error('Unauthorized');
|
|
27
27
|
};
|
|
28
28
|
const useUser = () => {
|
|
29
29
|
const config = useAuthConfig();
|
|
30
|
-
const { data, error, isLoading, mutate } = useSWR(config.userProfileEndpoint, userFetcher);
|
|
30
|
+
const { data, error, isLoading, mutate } = useSWR(config.userProfileEndpoint, userFetcher, { shouldRetryOnError: false });
|
|
31
31
|
const invalidate = useCallback(() => mutate(), [mutate]);
|
|
32
32
|
return {
|
|
33
33
|
user: data ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUser.js","sources":["../../../../../src/client/hooks/useUser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AASA;AACE;AACA;AACE;;;AAIF;AACE;AAEA;AACE;;;;;AAIF;AAEA
|
|
1
|
+
{"version":3,"file":"useUser.js","sources":["../../../../../src/client/hooks/useUser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AASA;AACE;AACA;AACE;;;AAIF;AACE;AAEA;AACE;;;;;AAIF;AAEA;;;;;AAOF;AACF;AAEO;AACL;;AAQA;;;;;;;AAQF;;"}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
1
2
|
import { getAuth0Instance } from '../getAuth0Instance.js';
|
|
2
3
|
|
|
4
|
+
const log = debug('@smg-automotive/auth:token');
|
|
3
5
|
const getAccessToken = async ({ protocol, host, context, }) => {
|
|
6
|
+
log('Getting access token', {
|
|
7
|
+
host,
|
|
8
|
+
protocol,
|
|
9
|
+
hasRequest: !!context?.request,
|
|
10
|
+
});
|
|
4
11
|
const auth0Instance = getAuth0Instance({ protocol, host });
|
|
5
12
|
const { token } = context?.request
|
|
6
13
|
? await auth0Instance.getAccessToken(context.request, context.response)
|
|
7
14
|
: await auth0Instance.getAccessToken();
|
|
15
|
+
log('Access token retrieved', { tokenLength: token?.length || 0 });
|
|
8
16
|
return token;
|
|
9
17
|
};
|
|
10
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.js","sources":["../../../../../src/server/helpers/getAccessToken.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getAccessToken.js","sources":["../../../../../src/server/helpers/getAccessToken.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAMA,MAAM,GAAG,GAAG,KAAK,CAAC,4BAA4B,CAAC;AAExC,MAAM,cAAc,GAAG,OAAO,EACnC,QAAQ,EACR,IAAI,EACJ,OAAO,GACwC,KAAI;IACnD,GAAG,CAAC,sBAAsB,EAAE;QAC1B,IAAI;QACJ,QAAQ;AACR,QAAA,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO;AAC/B,KAAA,CAAC;IACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1D,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE;AACzB,UAAE,MAAM,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ;AACtE,UAAE,MAAM,aAAa,CAAC,cAAc,EAAE;AACxC,IAAA,GAAG,CAAC,wBAAwB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;AAClE,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -1,33 +1,61 @@
|
|
|
1
|
+
import debug from 'debug';
|
|
1
2
|
import { getAccessToken } from './getAccessToken.js';
|
|
2
3
|
import { getAuth0Instance } from '../getAuth0Instance.js';
|
|
3
4
|
import { enrichUser } from '../../lib/enrichUser/session.js';
|
|
4
5
|
|
|
6
|
+
const log = debug('@smg-automotive/auth:user');
|
|
5
7
|
const getSessionData = async ({ protocol, host, context, }) => {
|
|
8
|
+
log('Retrieving session data', {
|
|
9
|
+
host,
|
|
10
|
+
protocol,
|
|
11
|
+
hasRequest: !!context?.request,
|
|
12
|
+
});
|
|
6
13
|
const auth0Instance = getAuth0Instance({ host, protocol });
|
|
7
|
-
|
|
8
|
-
? auth0Instance.getSession(context.request)
|
|
9
|
-
: auth0Instance.getSession();
|
|
14
|
+
const session = context?.request
|
|
15
|
+
? await auth0Instance.getSession(context.request)
|
|
16
|
+
: await auth0Instance.getSession();
|
|
17
|
+
log('Session retrieved', { hasSession: !!session, hasUser: !!session?.user });
|
|
18
|
+
return session;
|
|
10
19
|
};
|
|
11
20
|
const getUser = async ({ context, host, protocol, }) => {
|
|
21
|
+
log('Getting user', { host, protocol });
|
|
12
22
|
const sessionData = await getSessionData({ host, protocol, context });
|
|
13
|
-
if (!sessionData || !sessionData.user)
|
|
23
|
+
if (!sessionData || !sessionData.user) {
|
|
24
|
+
log('No session or user found');
|
|
14
25
|
return null;
|
|
15
|
-
|
|
26
|
+
}
|
|
27
|
+
const user = sessionData.user;
|
|
28
|
+
log('User retrieved', {
|
|
29
|
+
userId: user.userId,
|
|
30
|
+
sellerId: user.sellerId,
|
|
31
|
+
});
|
|
32
|
+
return user;
|
|
16
33
|
};
|
|
17
34
|
const getEnrichedUser = async ({ brand, context, host, protocol, }) => {
|
|
35
|
+
log('Getting enriched user', { brand, host, protocol });
|
|
18
36
|
const user = await getUser({ host, protocol, context });
|
|
19
|
-
if (!user)
|
|
37
|
+
if (!user) {
|
|
38
|
+
log('No user found, cannot enrich');
|
|
20
39
|
return null;
|
|
40
|
+
}
|
|
41
|
+
log('Retrieving access token for enrichment');
|
|
21
42
|
const accessToken = await getAccessToken({
|
|
22
43
|
host,
|
|
23
44
|
protocol,
|
|
24
45
|
context,
|
|
25
46
|
});
|
|
26
|
-
|
|
47
|
+
log('Access token retrieved, enriching user');
|
|
48
|
+
const enrichedUser = await enrichUser({
|
|
27
49
|
user,
|
|
28
50
|
accessToken,
|
|
29
51
|
brand,
|
|
30
52
|
});
|
|
53
|
+
log('User enriched successfully', {
|
|
54
|
+
userId: enrichedUser.userId,
|
|
55
|
+
sellerId: enrichedUser.sellerId,
|
|
56
|
+
hasEntitlements: !!enrichedUser.entitlements,
|
|
57
|
+
});
|
|
58
|
+
return enrichedUser;
|
|
31
59
|
};
|
|
32
60
|
|
|
33
61
|
export { getEnrichedUser, getUser };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUser.js","sources":["../../../../../src/server/helpers/getUser.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getUser.js","sources":["../../../../../src/server/helpers/getUser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAYA,MAAM,GAAG,GAAG,KAAK,CAAC,2BAA2B,CAAC;AAE9C,MAAM,cAAc,GAAG,OAAO,EAC5B,QAAQ,EACR,IAAI,EACJ,OAAO,GACwC,KAAI;IACnD,GAAG,CAAC,yBAAyB,EAAE;QAC7B,IAAI;QACJ,QAAQ;AACR,QAAA,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO;AAC/B,KAAA,CAAC;IACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE1D,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE;UACrB,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO;AAChD,UAAE,MAAM,aAAa,CAAC,UAAU,EAAE;AAEpC,IAAA,GAAG,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7E,IAAA,OAAO,OAAO;AAChB,CAAC;AAEM,MAAM,OAAO,GAAG,OAAO,EAC5B,OAAO,EACP,IAAI,EACJ,QAAQ,GAEY,KAAiC;IACrD,GAAG,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvC,IAAA,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACrE,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QACrC,GAAG,CAAC,0BAA0B,CAAC;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAmB;IAC5C,GAAG,CAAC,gBAAgB,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,KAAA,CAAC;AACF,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,eAAe,GAAG,OAAO,EACpC,KAAK,EACL,OAAO,EACP,IAAI,EACJ,QAAQ,GAIP,KAAyC;IAC1C,GAAG,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvD,IAAA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE;QACT,GAAG,CAAC,8BAA8B,CAAC;AACnC,QAAA,OAAO,IAAI;IACb;IAEA,GAAG,CAAC,wCAAwC,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;QACvC,IAAI;QACJ,QAAQ;QACR,OAAO;AACR,KAAA,CAAC;IACF,GAAG,CAAC,wCAAwC,CAAC;AAC7C,IAAA,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC;QACpC,IAAI;QACJ,WAAW;QACX,KAAK;AACN,KAAA,CAAC;IACF,GAAG,CAAC,4BAA4B,EAAE;QAChC,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAC/B,QAAA,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY;AAC7C,KAAA,CAAC;AACF,IAAA,OAAO,YAAY;AACrB;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
2
|
import type { OnCallbackContext, SessionData } from '@auth0/nextjs-auth0/types';
|
|
3
|
-
import type
|
|
3
|
+
import { type SdkError } from '@auth0/nextjs-auth0/errors';
|
|
4
4
|
import { Auth0Config } from 'src/types';
|
|
5
5
|
export declare const onCallbackFactory: ({ auth0Config, appBaseUrl, onError, }: {
|
|
6
6
|
auth0Config: Auth0Config;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
2
|
import { cookies } from 'next/headers';
|
|
3
3
|
import { decodeJwt } from 'jose';
|
|
4
|
+
import { AccessTokenError, OAuth2Error } from '@auth0/nextjs-auth0/errors';
|
|
4
5
|
|
|
5
6
|
const createCallbackResponse = (context, appBaseUrl) => NextResponse.redirect(new URL(context.returnTo || '/', appBaseUrl));
|
|
6
7
|
const getLocaleFromContext = ({ returnTo }, appBaseUrl) => {
|
|
@@ -51,8 +52,8 @@ const handleAuth0Error = ({ error, auth0Config, appBaseUrl, localeFromUrl, onErr
|
|
|
51
52
|
return NextResponse.redirect(new URL(`/${locale}${auth0Config.globalAuthErrorPath}${errorCodeQuery}`, appBaseUrl));
|
|
52
53
|
};
|
|
53
54
|
const onCallbackFactory = ({ auth0Config, appBaseUrl, onError, }) => async (error, context, session) => {
|
|
55
|
+
const localeFromUrl = getLocaleFromContext(context, appBaseUrl);
|
|
54
56
|
if (error) {
|
|
55
|
-
const localeFromUrl = getLocaleFromContext(context, appBaseUrl);
|
|
56
57
|
return handleAuth0Error({
|
|
57
58
|
error,
|
|
58
59
|
auth0Config,
|
|
@@ -68,6 +69,18 @@ const onCallbackFactory = ({ auth0Config, appBaseUrl, onError, }) => async (erro
|
|
|
68
69
|
const decodedToken = session.tokenSet.accessToken
|
|
69
70
|
? decodeJwt(session.tokenSet.accessToken)
|
|
70
71
|
: null;
|
|
72
|
+
if (decodedToken && !decodedToken.complete) {
|
|
73
|
+
return handleAuth0Error({
|
|
74
|
+
error: new AccessTokenError(incompleteTokenErrorCode, incompleteTokenErrorCode, new OAuth2Error({
|
|
75
|
+
code: incompleteTokenErrorCode,
|
|
76
|
+
message: incompleteTokenErrorCode,
|
|
77
|
+
})),
|
|
78
|
+
auth0Config,
|
|
79
|
+
appBaseUrl,
|
|
80
|
+
localeFromUrl,
|
|
81
|
+
onError,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
71
84
|
const availableSellerIds = decodedToken?.sellerIds ?? null;
|
|
72
85
|
let selectedSellerId = cookieStore.get(auth0Config.selectedSellerIdCookie.name)?.value ??
|
|
73
86
|
decodedToken?.sellerIds[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onCallbackFactory.js","sources":["../../../../../src/server/hooks/onCallbackFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"onCallbackFactory.js","sources":["../../../../../src/server/hooks/onCallbackFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
+
import debug from 'debug';
|
|
2
3
|
import { getAuth0Config } from '../../config/auth0.js';
|
|
3
4
|
import { getAuth0Instance } from '../getAuth0Instance.js';
|
|
4
5
|
import { handleAccessTokenRequest } from './token.js';
|
|
@@ -8,6 +9,17 @@ import { handleCrossDomainLogout, deleteRelatedSessionCookies } from './logout.j
|
|
|
8
9
|
import { addLoginParams } from './login.js';
|
|
9
10
|
import { combineHeaders } from './combineHeaders.js';
|
|
10
11
|
|
|
12
|
+
const log = debug('@smg-automotive/auth:middleware');
|
|
13
|
+
const generateRequestId = () => {
|
|
14
|
+
// UUID v4 format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
|
|
15
|
+
// where x is any hex digit and y is one of 8, 9, A, B
|
|
16
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
17
|
+
// eslint-disable-next-line sonarjs/pseudo-random
|
|
18
|
+
const r = (Math.random() * 16) | 0;
|
|
19
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
20
|
+
return v.toString(16);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
11
23
|
const isAuthRoute = (pathname, auth0Config) => {
|
|
12
24
|
const { loginEndpoint, logoutEndpoint, callbackEndpoint, userProfileEndpoint, tokenEndpoint, } = auth0Config;
|
|
13
25
|
return [
|
|
@@ -19,34 +31,49 @@ const isAuthRoute = (pathname, auth0Config) => {
|
|
|
19
31
|
].includes(pathname);
|
|
20
32
|
};
|
|
21
33
|
const authMiddleware = async ({ request, isProtectedRoute, language, host, protocol, onError, brand, }) => {
|
|
34
|
+
const requestId = generateRequestId();
|
|
22
35
|
const { pathname } = request.nextUrl;
|
|
36
|
+
log('Processing request', {
|
|
37
|
+
requestId,
|
|
38
|
+
pathname,
|
|
39
|
+
host,
|
|
40
|
+
protocol,
|
|
41
|
+
method: request.method,
|
|
42
|
+
});
|
|
23
43
|
const auth0Instance = getAuth0Instance({
|
|
24
44
|
host,
|
|
25
45
|
protocol,
|
|
26
46
|
});
|
|
27
47
|
const auth0Config = getAuth0Config();
|
|
28
48
|
const isAuthErrorRoute = pathname.endsWith(auth0Config.globalAuthErrorPath);
|
|
49
|
+
log('Auth route check', { requestId, pathname, isAuthErrorRoute });
|
|
29
50
|
const crossDomainLogoutResult = handleCrossDomainLogout({
|
|
51
|
+
requestId,
|
|
30
52
|
host,
|
|
31
53
|
protocol,
|
|
32
54
|
request,
|
|
33
55
|
auth0Config,
|
|
34
56
|
});
|
|
35
57
|
if (crossDomainLogoutResult) {
|
|
58
|
+
log('Cross-domain logout detected, redirecting', { requestId });
|
|
36
59
|
return crossDomainLogoutResult;
|
|
37
60
|
}
|
|
38
61
|
addLoginParams({
|
|
39
62
|
request,
|
|
40
63
|
auth0Config,
|
|
41
64
|
});
|
|
65
|
+
log('Calling Auth0 middleware', { requestId });
|
|
42
66
|
const authResponse = await auth0Instance.middleware(request);
|
|
67
|
+
log('Auth0 middleware completed', { requestId, status: authResponse.status });
|
|
43
68
|
deleteRelatedSessionCookies({
|
|
69
|
+
requestId,
|
|
44
70
|
host,
|
|
45
71
|
request,
|
|
46
72
|
response: authResponse,
|
|
47
73
|
auth0Config,
|
|
48
74
|
});
|
|
49
75
|
const accessTokenRequestResult = await handleAccessTokenRequest({
|
|
76
|
+
requestId,
|
|
50
77
|
request,
|
|
51
78
|
response: authResponse,
|
|
52
79
|
auth0Instance,
|
|
@@ -54,9 +81,11 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
54
81
|
onError,
|
|
55
82
|
});
|
|
56
83
|
if (accessTokenRequestResult) {
|
|
84
|
+
log('Access token request handled', { requestId });
|
|
57
85
|
return accessTokenRequestResult;
|
|
58
86
|
}
|
|
59
87
|
const handleUserProfileResult = await handleUserProfile({
|
|
88
|
+
requestId,
|
|
60
89
|
request,
|
|
61
90
|
response: authResponse,
|
|
62
91
|
auth0Instance,
|
|
@@ -64,13 +93,17 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
64
93
|
brand,
|
|
65
94
|
});
|
|
66
95
|
if (handleUserProfileResult) {
|
|
96
|
+
log('User profile request handled', { requestId });
|
|
67
97
|
return handleUserProfileResult;
|
|
68
98
|
}
|
|
69
99
|
if (isAuthRoute(pathname, auth0Config) || isAuthErrorRoute) {
|
|
100
|
+
log('Auth route, returning response', { requestId });
|
|
70
101
|
return authResponse;
|
|
71
102
|
}
|
|
72
103
|
const isProtected = !isAuthErrorRoute && isProtectedRoute(pathname);
|
|
104
|
+
log('Route protection check', { requestId, pathname, isProtected });
|
|
73
105
|
const protectRouteResult = await protectRoute({
|
|
106
|
+
requestId,
|
|
74
107
|
isProtected,
|
|
75
108
|
auth0Instance,
|
|
76
109
|
auth0Config,
|
|
@@ -80,8 +113,13 @@ const authMiddleware = async ({ request, isProtectedRoute, language, host, proto
|
|
|
80
113
|
onError,
|
|
81
114
|
});
|
|
82
115
|
if (protectRouteResult) {
|
|
116
|
+
log('Route protection handled', {
|
|
117
|
+
requestId,
|
|
118
|
+
redirected: protectRouteResult.status === 307,
|
|
119
|
+
});
|
|
83
120
|
return protectRouteResult;
|
|
84
121
|
}
|
|
122
|
+
log('Request completed, combining headers', { requestId });
|
|
85
123
|
return combineHeaders({
|
|
86
124
|
middlewareResponse: NextResponse.next({
|
|
87
125
|
request: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../src/server/middleware/index.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/server/middleware/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from 'next/server';
|
|
2
2
|
import { Auth0Config } from 'src/types';
|
|
3
|
-
export declare const handleCrossDomainLogout: ({ host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }: {
|
|
3
|
+
export declare const handleCrossDomainLogout: ({ requestId, host, protocol, request, auth0Config: { languageConfig, logoutEndpoint }, }: {
|
|
4
|
+
requestId: string;
|
|
4
5
|
host: string;
|
|
5
6
|
protocol: string;
|
|
6
7
|
request: NextRequest;
|
|
7
8
|
auth0Config: Auth0Config;
|
|
8
9
|
}) => NextResponse | void;
|
|
9
|
-
export declare const deleteRelatedSessionCookies: ({ host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }: {
|
|
10
|
+
export declare const deleteRelatedSessionCookies: ({ requestId, host, request, response, auth0Config: { logoutEndpoint, authCookieNames, legacyAccessTokenName, legacyRefreshTokenName, }, }: {
|
|
11
|
+
requestId: string;
|
|
10
12
|
host: string;
|
|
11
13
|
request: NextRequest;
|
|
12
14
|
response: NextResponse;
|