@ya-accelerators/nextjs-framework 0.0.83 → 0.0.84
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/@types/next-auth.d.ts +0 -1
- package/dist/hooks/dispatch/index.jsx +8 -4
- package/dist/hooks/dispatch/index.jsx.map +1 -1
- package/dist/hooks/toast/index.jsx +3 -0
- package/dist/hooks/toast/index.jsx.map +1 -1
- package/dist/lib/next-auth/index.d.ts +1 -0
- package/dist/lib/next-auth/index.js +126 -115
- package/dist/lib/next-auth/index.js.map +1 -1
- package/dist/lib/trpc/index.js +32 -5
- package/dist/lib/trpc/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/composite/input/dateRange/index.jsx +13 -17
- package/dist/ui/composite/input/dateRange/index.jsx.map +1 -1
- package/dist/ui/composite/input/dateTimePicker/index.jsx +5 -3
- package/dist/ui/composite/input/dateTimePicker/index.jsx.map +1 -1
- package/dist/ui/composite/input/dateTimeRange/index.jsx +14 -21
- package/dist/ui/composite/input/dateTimeRange/index.jsx.map +1 -1
- package/dist/ui/functional/signInForm/index.jsx +1 -1
- package/dist/ui/functional/signInForm/index.jsx.map +1 -1
- package/dist/ui/functional/signOutForm/index.jsx +1 -1
- package/dist/ui/functional/signOutForm/index.jsx.map +1 -1
- package/dist/ui/layout/form/index.jsx +27 -23
- package/dist/ui/layout/form/index.jsx.map +1 -1
- package/dist/ui/layout/modal/index.jsx +23 -17
- package/dist/ui/layout/modal/index.jsx.map +1 -1
- package/dist/ui/layout/root/index.jsx +2 -2
- package/dist/ui/layout/root/index.jsx.map +1 -1
- package/dist/util/date/impl.js +5 -1
- package/dist/util/date/impl.js.map +1 -1
- package/dist/util/index.js +2 -3
- package/dist/util/index.js.map +1 -1
- package/package.json +1 -1
package/@types/next-auth.d.ts
CHANGED
|
@@ -15,10 +15,14 @@ export const DispatchProvider = ({ children }) => {
|
|
|
15
15
|
if (requestShowLoading !== false) {
|
|
16
16
|
showLoading();
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
try {
|
|
19
|
+
const ret = await promise;
|
|
20
|
+
router.refresh();
|
|
21
|
+
return ret;
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
dismissLoading();
|
|
25
|
+
}
|
|
22
26
|
};
|
|
23
27
|
return <DispatchContext.Provider value={{ dispatch }}>{children}</DispatchContext.Provider>;
|
|
24
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../src/hooks/dispatch/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAK9C,MAAM,eAAe,GAAG,aAAa,CAAmB;IACtD,QAAQ,CAAI,OAAmB;QAC7B,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC3D,MAAM,QAAQ,GAAG,KAAK,WAAc,OAAmB,EAAE,kBAA4B;QACnF,IAAI,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACjC,WAAW,EAAE,CAAA;QACf,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../src/hooks/dispatch/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAK9C,MAAM,eAAe,GAAG,aAAa,CAAmB;IACtD,QAAQ,CAAI,OAAmB;QAC7B,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAA;IAC3D,MAAM,QAAQ,GAAG,KAAK,WAAc,OAAmB,EAAE,kBAA4B;QACnF,IAAI,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACjC,WAAW,EAAE,CAAA;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAA;YACzB,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,OAAO,GAAG,CAAA;QACZ,CAAC;gBAAS,CAAC;YACT,cAAc,EAAE,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IACD,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;AAC7F,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../src/hooks/toast/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAGZ,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAMjD,MAAM,YAAY,GAAG,aAAa,CAAgB;IAChD,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;IACnB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;CACvB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IACrE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAa,CAAA;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,UAAU,CAAC,OAAO,CAAC,CAAA;IAClE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAkB,CAAA;IAC5C,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAA+D,EAAE,EAAE;QAC5G,UAAU,CAAC,OAAO,CAAC,CAAA;QACnB,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;QACrC,IAAI,CAAC,EAAE,CAAC;YACN,YAAY,CAAC,CAAC,CAAC,CAAA;YACf,IAAI,CAAC,SAAS,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CACF,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,CAAC,SAAS,CAAC,CAAA;gBACrB,IAAI,CAAC,SAAS,CAAC,CAAA;YACjB,CAAC,EAAE,MAAM,CAAC,CACX,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IACD,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,UAAU,CAAC,SAAS,CAAC,CAAA;QACrB,IAAI,CAAC,SAAS,CAAC,CAAA;IACjB,CAAC,CAAA;IACD,OAAO,CACL,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CACxD;MAAA,CAAC,QAAQ,CACT;MAAA,CAAC,OAAO,IAAI,CACV,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAC9C;UAAA,CAAC,OAAO,CACV;QAAA,EAAE,KAAK,CAAC,CACT,CACH;IAAA,EAAE,YAAY,CAAC,QAAQ,CAAC,CACzB,CAAA;AACH,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../../../src/hooks/toast/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAGZ,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAMjD,MAAM,YAAY,GAAG,aAAa,CAAgB;IAChD,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;IACnB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;CACvB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAA2B,EAAE,EAAE;IACrE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAa,CAAA;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAa,UAAU,CAAC,OAAO,CAAC,CAAA;IAClE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,EAAkB,CAAA;IAC5C,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAA+D,EAAE,EAAE;QAC5G,UAAU,CAAC,OAAO,CAAC,CAAA;QACnB,QAAQ,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;QACrC,IAAI,CAAC,EAAE,CAAC;YACN,YAAY,CAAC,CAAC,CAAC,CAAA;YACf,IAAI,CAAC,SAAS,CAAC,CAAA;QACjB,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CACF,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,CAAC,SAAS,CAAC,CAAA;gBACrB,IAAI,CAAC,SAAS,CAAC,CAAA;YACjB,CAAC,EAAE,MAAM,CAAC,CACX,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IACD,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,CAAC,EAAE,CAAC;YACN,YAAY,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,UAAU,CAAC,SAAS,CAAC,CAAA;QACrB,IAAI,CAAC,SAAS,CAAC,CAAA;IACjB,CAAC,CAAA;IACD,OAAO,CACL,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CACxD;MAAA,CAAC,QAAQ,CACT;MAAA,CAAC,OAAO,IAAI,CACV,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAC9C;UAAA,CAAC,OAAO,CACV;QAAA,EAAE,KAAK,CAAC,CACT,CACH;IAAA,EAAE,YAAY,CAAC,QAAQ,CAAC,CACzB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -5,4 +5,5 @@ export type TokenSet = {
|
|
|
5
5
|
expiresAtSec: number;
|
|
6
6
|
scope?: string;
|
|
7
7
|
};
|
|
8
|
+
export declare const serverRefresh: (refreshToken: string) => Promise<TokenSet | undefined>;
|
|
8
9
|
export declare const options: (authorize?: (email: string, password: string) => Promise<TokenSet | undefined>, refresh?: (refreshToken: string) => Promise<TokenSet | undefined>, externalAuthorize?: (credential: string) => Promise<TokenSet | undefined>) => NextAuthOptions;
|
|
@@ -19,131 +19,142 @@ const dedupedRefresh = (refreshToken, refresh) => {
|
|
|
19
19
|
inflightRefreshes.set(refreshToken, p);
|
|
20
20
|
return p;
|
|
21
21
|
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
22
|
+
// The app's refresh callback, captured (deduped) when options() is wired with one, so the server-side
|
|
23
|
+
// tRPC header builder (Lib.trpc) can refresh a near-expiry access token before forwarding it on the
|
|
24
|
+
// RSC / server-action path — where the jwt callback's own refresh cannot persist a cookie. Only a
|
|
25
|
+
// non-undefined refresh is stored, so a no-arg options() call never clears an already-registered one.
|
|
26
|
+
let registeredRefresh;
|
|
27
|
+
export const serverRefresh = async (refreshToken) => registeredRefresh ? registeredRefresh(refreshToken) : undefined;
|
|
28
|
+
export const options = (authorize, refresh, externalAuthorize) => {
|
|
29
|
+
if (refresh) {
|
|
30
|
+
registeredRefresh = (refreshToken) => dedupedRefresh(refreshToken, refresh);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
secret: (() => {
|
|
34
|
+
// next build (page-data collection) evaluates this module but never signs anything —
|
|
35
|
+
// the secret is a runtime-only concern (Secrets Manager / dev .env). Build must not require it.
|
|
36
|
+
if (defaultServerEnv.NEXT_PHASE === 'phase-production-build') {
|
|
37
|
+
return defaultServerEnv.NEXTAUTH_SECRET ?? 'build-only-not-used-at-runtime';
|
|
38
|
+
}
|
|
39
|
+
if (!defaultServerEnv.NEXTAUTH_SECRET) {
|
|
40
|
+
throw new Error('NEXTAUTH_SECRET is not set');
|
|
41
|
+
}
|
|
42
|
+
if (defaultServerEnv.DEPLOY_ENV !== 'dev' &&
|
|
43
|
+
defaultServerEnv.NEXTAUTH_SECRET === 'build-only-not-used-at-runtime') {
|
|
44
|
+
throw new Error('NEXTAUTH_SECRET must be replaced with a real secret in non-dev environments');
|
|
45
|
+
}
|
|
46
|
+
return defaultServerEnv.NEXTAUTH_SECRET;
|
|
47
|
+
})(),
|
|
48
|
+
pages: {
|
|
49
|
+
signIn: '/signin',
|
|
50
|
+
},
|
|
51
|
+
session: {
|
|
52
|
+
maxAge: 60 * 60 * 24 * 30,
|
|
53
|
+
strategy: 'jwt',
|
|
54
|
+
},
|
|
55
|
+
providers: [
|
|
56
|
+
CredentialsProvider({
|
|
57
|
+
credentials: {
|
|
58
|
+
email: { type: 'email' },
|
|
59
|
+
password: { type: 'password' },
|
|
60
|
+
credential: { type: 'text' },
|
|
61
|
+
},
|
|
62
|
+
async authorize(credentials) {
|
|
63
|
+
if (!credentials) {
|
|
64
|
+
return null;
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
try {
|
|
67
|
+
// Route an app-supplied opaque credential (e.g. a MicroHub OIDC broker
|
|
68
|
+
// one-time code) through externalAuthorize; otherwise fall back to the
|
|
69
|
+
// email/password path. Either callback maps to a TokenSet or undefined.
|
|
70
|
+
let tokenSet;
|
|
71
|
+
if (credentials.credential && externalAuthorize) {
|
|
72
|
+
tokenSet = await externalAuthorize(credentials.credential);
|
|
73
|
+
}
|
|
74
|
+
else if (authorize) {
|
|
75
|
+
tokenSet = await authorize(credentials.email, credentials.password);
|
|
76
|
+
}
|
|
77
|
+
if (!tokenSet) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
tokenSet,
|
|
82
|
+
};
|
|
66
83
|
}
|
|
67
|
-
|
|
84
|
+
catch (error) {
|
|
85
|
+
// NextAuth swallows authorize() exceptions silently and returns null —
|
|
86
|
+
// operationally indistinguishable from "wrong password". Log the throw so
|
|
87
|
+
// server-side bugs in the consumer's authorize callback are visible.
|
|
88
|
+
logger.error('auth', { op: 'authorize', error });
|
|
68
89
|
return null;
|
|
69
90
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
],
|
|
94
|
+
callbacks: {
|
|
95
|
+
session: ({ session, token }) => {
|
|
96
|
+
// The access token is deliberately NOT copied onto the session: the session is serialized to the
|
|
97
|
+
// browser via /api/auth/session (SessionProvider), so exposing the bearer there hands any client
|
|
98
|
+
// script a usable credential. The server reads it from the JWT via getToken (see Lib.trpc).
|
|
99
|
+
if (token?.scope) {
|
|
100
|
+
session.scope = token.scope;
|
|
73
101
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// operationally indistinguishable from "wrong password". Log the throw so
|
|
77
|
-
// server-side bugs in the consumer's authorize callback are visible.
|
|
78
|
-
logger.error('auth', { op: 'authorize', error });
|
|
79
|
-
return null;
|
|
102
|
+
if (token?.error) {
|
|
103
|
+
session.error = token.error;
|
|
80
104
|
}
|
|
105
|
+
return session;
|
|
81
106
|
},
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
session
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const refreshed = await dedupedRefresh(token.refreshToken, refresh);
|
|
120
|
-
if (!refreshed) {
|
|
107
|
+
jwt: async ({ token, user }) => {
|
|
108
|
+
// New sign-in path: authorize() returned a TokenSet; CredentialsProvider
|
|
109
|
+
// hands it to us on `user.tokenSet`.
|
|
110
|
+
if (user?.tokenSet) {
|
|
111
|
+
token.accessToken = user.tokenSet.accessToken;
|
|
112
|
+
token.refreshToken = user.tokenSet.refreshToken;
|
|
113
|
+
token.expiresAtSec = user.tokenSet.expiresAtSec;
|
|
114
|
+
token.scope = user.tokenSet.scope;
|
|
115
|
+
token.error = undefined;
|
|
116
|
+
return token;
|
|
117
|
+
}
|
|
118
|
+
// Existing session path: refresh the access token if expiry is within
|
|
119
|
+
// the leeway. `refresh` is optional — without it, the access token
|
|
120
|
+
// simply expires and downstream calls start failing 401 until the user
|
|
121
|
+
// signs in again. The refreshToken is cleared on failure so subsequent
|
|
122
|
+
// jwt() invocations don't loop and hammer the refresh endpoint until
|
|
123
|
+
// session.maxAge.
|
|
124
|
+
if (refresh &&
|
|
125
|
+
token.refreshToken &&
|
|
126
|
+
token.expiresAtSec &&
|
|
127
|
+
Date.now() / 1000 >= token.expiresAtSec - REFRESH_LEEWAY_SEC) {
|
|
128
|
+
try {
|
|
129
|
+
const refreshed = await dedupedRefresh(token.refreshToken, refresh);
|
|
130
|
+
if (!refreshed) {
|
|
131
|
+
return { ...token, refreshToken: undefined, error: 'RefreshAccessTokenError' };
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
...token,
|
|
135
|
+
accessToken: refreshed.accessToken,
|
|
136
|
+
refreshToken: refreshed.refreshToken,
|
|
137
|
+
expiresAtSec: refreshed.expiresAtSec,
|
|
138
|
+
scope: refreshed.scope,
|
|
139
|
+
error: undefined,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
logger.error('auth', { op: 'refresh', error });
|
|
121
144
|
return { ...token, refreshToken: undefined, error: 'RefreshAccessTokenError' };
|
|
122
145
|
}
|
|
123
|
-
return {
|
|
124
|
-
...token,
|
|
125
|
-
accessToken: refreshed.accessToken,
|
|
126
|
-
refreshToken: refreshed.refreshToken,
|
|
127
|
-
expiresAtSec: refreshed.expiresAtSec,
|
|
128
|
-
scope: refreshed.scope,
|
|
129
|
-
error: undefined,
|
|
130
|
-
};
|
|
131
146
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
147
|
+
return token;
|
|
148
|
+
},
|
|
149
|
+
redirect: ({ url, baseUrl }) => {
|
|
150
|
+
if (url.startsWith('/')) {
|
|
151
|
+
return `${baseUrl}${url}`;
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (url.startsWith('/')) {
|
|
141
|
-
return `${baseUrl}${url}`;
|
|
142
|
-
}
|
|
143
|
-
const searchParams = new URLSearchParams(new URL(url).search);
|
|
144
|
-
const resolved = new URL(searchParams.get('callbackUrl') ?? '', baseUrl);
|
|
145
|
-
return resolved.origin === new URL(baseUrl).origin ? resolved.toString() : baseUrl;
|
|
153
|
+
const searchParams = new URLSearchParams(new URL(url).search);
|
|
154
|
+
const resolved = new URL(searchParams.get('callbackUrl') ?? '', baseUrl);
|
|
155
|
+
return resolved.origin === new URL(baseUrl).origin ? resolved.toString() : baseUrl;
|
|
156
|
+
},
|
|
146
157
|
},
|
|
147
|
-
}
|
|
148
|
-
}
|
|
158
|
+
};
|
|
159
|
+
};
|
|
149
160
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/next-auth/index.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AASrC,+EAA+E;AAC/E,+EAA+E;AAC/E,iFAAiF;AACjF,8EAA8E;AAC9E,+DAA+D;AAC/D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAyC,CAAA;AAE1E,MAAM,cAAc,GAAG,CACrB,YAAoB,EACpB,OAAgE,EACjC,EAAE;IACjC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3C,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IACF,iBAAiB,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,SAA8E,EAC9E,OAAiE,EACjE,iBAAyE,EACxD,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/next-auth/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/trpc/index.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { REFRESH_LEEWAY_SEC } from '../../constants';
|
|
2
|
+
import { defaultServerEnv } from '../../env';
|
|
3
|
+
import { logger } from '../../logger';
|
|
2
4
|
import { getCookieValue, setCookieValue } from '../cookie';
|
|
3
|
-
import {
|
|
5
|
+
import { serverRefresh } from '../next-auth';
|
|
4
6
|
export const setHeaderValues = async (headers, options) => setCookieValue('headers', JSON.stringify(headers), options);
|
|
5
7
|
// The `headers` cookie is client-controllable (tamperable via subdomain cookie injection or an
|
|
6
8
|
// httpOnly:false setHeaderValues call), so auth / IP / routing headers must not be accepted from it.
|
|
7
|
-
// The real authorization is applied server-side from the
|
|
9
|
+
// The real authorization is applied server-side from the JWT (getToken) below.
|
|
8
10
|
const SENSITIVE_HEADER_NAMES = new Set([
|
|
9
11
|
'authorization',
|
|
10
12
|
'cookie',
|
|
@@ -15,10 +17,36 @@ const SENSITIVE_HEADER_NAMES = new Set([
|
|
|
15
17
|
]);
|
|
16
18
|
const createDefaultHeaders = async (defaultHeaders = {}) => {
|
|
17
19
|
let baseHeaders = {};
|
|
20
|
+
let authorization;
|
|
18
21
|
if (typeof window === 'undefined') {
|
|
19
22
|
const { headers: nextHeaders } = await import('next/headers');
|
|
20
23
|
const headersList = await nextHeaders();
|
|
21
24
|
baseHeaders = { 'user-agent': headersList.get('user-agent') || 'unknown' };
|
|
25
|
+
// Read the access token from the server-side JWT (getToken decodes the same session cookie
|
|
26
|
+
// getServerSession does) rather than the session — the session no longer carries the bearer, so it is
|
|
27
|
+
// never exposed to client JS. Refresh it here when it is within the expiry leeway so an RSC /
|
|
28
|
+
// server-action call in an expired-token window forwards a fresh bearer instead of a stale one (the
|
|
29
|
+
// jwt callback's refresh cannot persist a cookie on this path). Refresh reaches the app's callback via
|
|
30
|
+
// Lib.nextAuth registration; when none is wired, the current token is forwarded unchanged.
|
|
31
|
+
const { getToken } = await import('next-auth/jwt');
|
|
32
|
+
const { NextRequest } = await import('next/server');
|
|
33
|
+
const token = await getToken({
|
|
34
|
+
req: new NextRequest('http://localhost', { headers: { cookie: headersList.get('cookie') ?? '' } }),
|
|
35
|
+
secret: defaultServerEnv.NEXTAUTH_SECRET,
|
|
36
|
+
});
|
|
37
|
+
let accessToken = token?.accessToken;
|
|
38
|
+
if (token?.refreshToken && token.expiresAtSec && Date.now() / 1000 >= token.expiresAtSec - REFRESH_LEEWAY_SEC) {
|
|
39
|
+
const refreshed = await serverRefresh(token.refreshToken).catch((error) => {
|
|
40
|
+
logger.error('auth', { op: 'refresh', error });
|
|
41
|
+
return undefined;
|
|
42
|
+
});
|
|
43
|
+
if (refreshed) {
|
|
44
|
+
accessToken = refreshed.accessToken;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (accessToken) {
|
|
48
|
+
authorization = `Bearer ${accessToken}`;
|
|
49
|
+
}
|
|
22
50
|
}
|
|
23
51
|
const savedHeaders = {};
|
|
24
52
|
const headersCookie = await getCookieValue('headers');
|
|
@@ -35,11 +63,10 @@ const createDefaultHeaders = async (defaultHeaders = {}) => {
|
|
|
35
63
|
// Ignore if JSON parse fails
|
|
36
64
|
}
|
|
37
65
|
}
|
|
38
|
-
const session = await getServerSession(nextAuthOptions());
|
|
39
66
|
return {
|
|
40
67
|
...baseHeaders,
|
|
41
68
|
...savedHeaders,
|
|
42
|
-
...(
|
|
69
|
+
...(authorization ? { authorization } : {}),
|
|
43
70
|
...defaultHeaders,
|
|
44
71
|
};
|
|
45
72
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/trpc/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/trpc/index.ts"],"names":[],"mappings":"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"}
|