@logto/next 1.0.0-beta.1 → 1.0.0-beta.11
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 +44 -0
- package/lib/index.d.ts +7 -23
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +15 -42
- package/lib/index.js.map +1 -1
- package/lib/module.js +15 -44
- package/lib/module.js.map +1 -1
- package/package.json +13 -13
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Logto Next.js SDK
|
|
2
|
+
[](https://www.npmjs.com/package/@logto/next)
|
|
3
|
+
[](https://github.com/logto-io/js/actions/workflows/main.yml)
|
|
4
|
+
[](https://app.codecov.io/gh/logto-io/js?branch=master)
|
|
5
|
+
|
|
6
|
+
The Logto Next.js SDK written in TypeScript. Check out our [integration guide](https://docs.logto.io/docs/recipes/integrate-logto/next) or [docs](https://docs.logto.io/sdk/JavaScript/next/) for more information.
|
|
7
|
+
|
|
8
|
+
We also provide [集成指南](https://docs.logto.io/zh-cn/docs/recipes/integrate-logto/next/) and [文档](https://docs.logto.io/zh-cn/sdk/JavaScript/next/) in Simplified Chinese.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
### Using npm
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @logto/next
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Using yarn
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
yarn add @logto/next
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Using pnpm
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
pnpm add @logto/next
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Get sample
|
|
31
|
+
|
|
32
|
+
A sample project can be found at [Next.js Sample](https://github.com/logto-io/js/tree/master/packages/next-sample)
|
|
33
|
+
|
|
34
|
+
Check out the source code and try it with ease.
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
pnpm i && pnpm start
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Resources
|
|
41
|
+
|
|
42
|
+
[](https://logto.io/)
|
|
43
|
+
[](https://docs.logto.io/sdk/JavaScript/next/)
|
|
44
|
+
[](https://discord.gg/UEPaF3j5e6)
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LogtoConfig, GetContextParameters } from "@logto/node";
|
|
2
2
|
import { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from "next";
|
|
3
3
|
declare module 'iron-session' {
|
|
4
4
|
interface IronSessionData {
|
|
@@ -8,38 +8,22 @@ declare module 'iron-session' {
|
|
|
8
8
|
refreshToken?: string;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
declare module 'http' {
|
|
12
|
-
interface IncomingMessage {
|
|
13
|
-
user: LogtoUser;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
11
|
type LogtoNextConfig = LogtoConfig & {
|
|
17
12
|
cookieSecret: string;
|
|
18
13
|
cookieSecure: boolean;
|
|
19
14
|
baseUrl: string;
|
|
20
15
|
};
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
claims?: IdTokenClaims;
|
|
24
|
-
accessToken?: string;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* @getAccessToken: if set to true, will try to get an access token and attach to req.user,
|
|
28
|
-
* if unable to grant an access token, will set req.user.isAuthenticated to false,
|
|
29
|
-
* this can make sure the refresh token is not revoked and still valid, so is considered more secure.
|
|
30
|
-
*/
|
|
31
|
-
type WithLogtoConfig = {
|
|
32
|
-
getAccessToken?: boolean;
|
|
33
|
-
};
|
|
16
|
+
export { ReservedScope, UserScope } from '@logto/node';
|
|
17
|
+
export type { LogtoContext } from '@logto/node';
|
|
34
18
|
export default class LogtoClient {
|
|
35
19
|
constructor(config: LogtoNextConfig);
|
|
36
20
|
handleSignIn: (redirectUri?: string) => NextApiHandler;
|
|
37
21
|
handleSignInCallback: (redirectTo?: string) => NextApiHandler;
|
|
38
22
|
handleSignOut: (redirectUri?: string) => NextApiHandler;
|
|
39
|
-
handleUser: (
|
|
40
|
-
handleAuthRoutes: (configs?:
|
|
41
|
-
withLogtoApiRoute: (handler: NextApiHandler, config?:
|
|
42
|
-
withLogtoSsr: <P extends Record<string, unknown> = Record<string, unknown>>(handler: (context: GetServerSidePropsContext) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,
|
|
23
|
+
handleUser: (configs?: GetContextParameters) => NextApiHandler<any>;
|
|
24
|
+
handleAuthRoutes: (configs?: GetContextParameters) => NextApiHandler;
|
|
25
|
+
withLogtoApiRoute: (handler: NextApiHandler, config?: GetContextParameters) => NextApiHandler;
|
|
26
|
+
withLogtoSsr: <P extends Record<string, unknown> = Record<string, unknown>>(handler: (context: GetServerSidePropsContext) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>, configs?: GetContextParameters) => (context: GetServerSidePropsContext<import("querystring").ParsedUrlQuery, import("next").PreviewData>) => Promise<GetServerSidePropsResult<P>>;
|
|
43
27
|
private get ironSessionConfigs();
|
|
44
28
|
}
|
|
45
29
|
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;ACMA,eAAe,cAAc,CAAC;
|
|
1
|
+
{"mappings":";;ACMA,eAAe,cAAc,CAAC;IAG5B,UAAU,eAAe;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CACF;AAED,uBAA8B,WAAW,GAAG;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;ACZF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;gBAG+B,MAAM,EAAE,eAAe;IAEpD,YAAY,4BAET,cAAc,CASa;IAE9B,oBAAoB,2BAAuC,cAAc,CAS3C;IAE9B,aAAa,4BAAwC,cAAc,CAWrC;IAE9B,UAAU,aAAc,oBAAoB,yBAG9B;IAEd,gBAAgB,aACH,oBAAoB,KAAG,cAAc,CAqB9C;IAEJ,iBAAiB,YACN,cAAc,WACf,oBAAoB,KAC3B,cAAc,CAQa;IAE9B,YAAY,mFAEC,yBAAyB,mFAE3B,oBAAoB,oJAQD;IAa9B,OAAO,KAAK,kBAAkB,GAS7B;CAOF","sources":["packages/next/src/src/storage.ts","packages/next/src/src/types.ts","packages/next/src/src/index.ts","packages/next/src/index.ts"],"sourcesContent":[null,null,null,"import { IncomingMessage } from 'http';\n\nimport NodeClient, { GetContextParameters } from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig } from './types';\n\nexport { ReservedScope, UserScope } from '@logto/node';\n\nexport type { LogtoContext } from '@logto/node';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (configs?: GetContextParameters) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, configs);\n\n handleAuthRoutes =\n (configs?: GetContextParameters): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (\n handler: NextApiHandler,\n config: GetContextParameters = {}\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n configs: GetContextParameters = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, configs);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(this.config, {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n });\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, configs: GetContextParameters) {\n const nodeClient = this.createNodeClient(request);\n\n return nodeClient.getContext(configs);\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map"}
|
package/lib/index.js
CHANGED
|
@@ -14,6 +14,8 @@ function $parcel$export(e, n, v, s) {
|
|
|
14
14
|
$parcel$defineInteropFlag(module.exports);
|
|
15
15
|
|
|
16
16
|
$parcel$export(module.exports, "default", () => $3556748a90dddf6c$export$2e2bcd8739ae039);
|
|
17
|
+
$parcel$export(module.exports, "ReservedScope", () => $3556748a90dddf6c$re_export$ReservedScope);
|
|
18
|
+
$parcel$export(module.exports, "UserScope", () => $3556748a90dddf6c$re_export$UserScope);
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
class $1abf01985e812f74$export$2e2bcd8739ae039 {
|
|
@@ -25,12 +27,12 @@ class $1abf01985e812f74$export$2e2bcd8739ae039 {
|
|
|
25
27
|
this.request.session[key] = value;
|
|
26
28
|
this.sessionChanged = true;
|
|
27
29
|
}
|
|
28
|
-
getItem(key) {
|
|
30
|
+
async getItem(key) {
|
|
29
31
|
const value = this.request.session[key];
|
|
30
32
|
if (value === undefined) return null;
|
|
31
33
|
return String(value);
|
|
32
34
|
}
|
|
33
|
-
removeItem(key) {
|
|
35
|
+
async removeItem(key) {
|
|
34
36
|
this.request.session[key] = undefined;
|
|
35
37
|
this.sessionChanged = true;
|
|
36
38
|
}
|
|
@@ -42,9 +44,10 @@ class $1abf01985e812f74$export$2e2bcd8739ae039 {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
|
|
47
|
+
|
|
45
48
|
class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
46
|
-
constructor(
|
|
47
|
-
this.config =
|
|
49
|
+
constructor(config){
|
|
50
|
+
this.config = config;
|
|
48
51
|
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`)=>(0, $j3Dy6$ironsessionnext.withIronSessionApiRoute)(async (request, response)=>{
|
|
49
52
|
const nodeClient = this.createNodeClient(request);
|
|
50
53
|
await nodeClient.signIn(redirectUri);
|
|
@@ -66,9 +69,9 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
66
69
|
await this.storage?.save();
|
|
67
70
|
if (this.navigateUrl) response.redirect(this.navigateUrl);
|
|
68
71
|
}, this.ironSessionConfigs);
|
|
69
|
-
this.handleUser = (
|
|
72
|
+
this.handleUser = (configs)=>this.withLogtoApiRoute((request, response)=>{
|
|
70
73
|
response.json(request.user);
|
|
71
|
-
},
|
|
74
|
+
}, configs);
|
|
72
75
|
this.handleAuthRoutes = (configs)=>(request, response)=>{
|
|
73
76
|
const { action: action } = request.query;
|
|
74
77
|
if (action === "sign-in") return this.handleSignIn()(request, response);
|
|
@@ -78,7 +81,7 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
78
81
|
response.status(404).end();
|
|
79
82
|
};
|
|
80
83
|
this.withLogtoApiRoute = (handler, config = {})=>(0, $j3Dy6$ironsessionnext.withIronSessionApiRoute)(async (request, response)=>{
|
|
81
|
-
const user = await this.getLogtoUserFromRequest(request, config
|
|
84
|
+
const user = await this.getLogtoUserFromRequest(request, config);
|
|
82
85
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
|
83
86
|
Object.defineProperty(request, "user", {
|
|
84
87
|
enumerable: true,
|
|
@@ -86,8 +89,8 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
86
89
|
});
|
|
87
90
|
return handler(request, response);
|
|
88
91
|
}, this.ironSessionConfigs);
|
|
89
|
-
this.withLogtoSsr = (handler,
|
|
90
|
-
const user = await this.getLogtoUserFromRequest(context.req,
|
|
92
|
+
this.withLogtoSsr = (handler, configs = {})=>(0, $j3Dy6$ironsessionnext.withIronSessionSsr)(async (context)=>{
|
|
93
|
+
const user = await this.getLogtoUserFromRequest(context.req, configs);
|
|
91
94
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
|
92
95
|
Object.defineProperty(context.req, "user", {
|
|
93
96
|
enumerable: true,
|
|
@@ -98,10 +101,7 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
98
101
|
}
|
|
99
102
|
createNodeClient(request) {
|
|
100
103
|
this.storage = new (0, $1abf01985e812f74$export$2e2bcd8739ae039)(request);
|
|
101
|
-
return new (0, ($parcel$interopDefault($j3Dy6$logtonode)))({
|
|
102
|
-
...this.config,
|
|
103
|
-
persistAccessToken: this.config.persistAccessToken ?? true
|
|
104
|
-
}, {
|
|
104
|
+
return new (0, ($parcel$interopDefault($j3Dy6$logtonode)))(this.config, {
|
|
105
105
|
storage: this.storage,
|
|
106
106
|
navigate: (url)=>{
|
|
107
107
|
this.navigateUrl = url;
|
|
@@ -118,36 +118,9 @@ class $3556748a90dddf6c$export$2e2bcd8739ae039 {
|
|
|
118
118
|
}
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
|
-
async getLogtoUserFromRequest(request,
|
|
121
|
+
async getLogtoUserFromRequest(request, configs) {
|
|
122
122
|
const nodeClient = this.createNodeClient(request);
|
|
123
|
-
|
|
124
|
-
if (!isAuthenticated) {
|
|
125
|
-
const user = {
|
|
126
|
-
isAuthenticated: isAuthenticated
|
|
127
|
-
};
|
|
128
|
-
return user;
|
|
129
|
-
}
|
|
130
|
-
if (!getAccessToken) {
|
|
131
|
-
const user = {
|
|
132
|
-
isAuthenticated: isAuthenticated,
|
|
133
|
-
claims: nodeClient.getIdTokenClaims()
|
|
134
|
-
};
|
|
135
|
-
return user;
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
const accessToken = await nodeClient.getAccessToken();
|
|
139
|
-
await this.storage?.save();
|
|
140
|
-
const user = {
|
|
141
|
-
isAuthenticated: isAuthenticated,
|
|
142
|
-
claims: nodeClient.getIdTokenClaims(),
|
|
143
|
-
accessToken: accessToken
|
|
144
|
-
};
|
|
145
|
-
return user;
|
|
146
|
-
} catch {
|
|
147
|
-
return {
|
|
148
|
-
isAuthenticated: false
|
|
149
|
-
};
|
|
150
|
-
}
|
|
123
|
+
return nodeClient.getContext(configs);
|
|
151
124
|
}
|
|
152
125
|
}
|
|
153
126
|
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n handleAuthRoutes =\n (configs?: WithLogtoConfig): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
|
|
1
|
+
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient, { GetContextParameters } from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig } from './types';\n\nexport { ReservedScope, UserScope } from '@logto/node';\n\nexport type { LogtoContext } from '@logto/node';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (configs?: GetContextParameters) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, configs);\n\n handleAuthRoutes =\n (configs?: GetContextParameters): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (\n handler: NextApiHandler,\n config: GetContextParameters = {}\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n configs: GetContextParameters = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, configs);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(this.config, {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n });\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, configs: GetContextParameters) {\n const nodeClient = this.createNodeClient(request);\n\n return nodeClient.getContext(configs);\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n async getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n async removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
|
package/lib/module.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import $a8eQ2$logtonode from "@logto/node";
|
|
1
|
+
import $a8eQ2$logtonode, {ReservedScope as $7d6712a39300ba99$re_export$ReservedScope, UserScope as $7d6712a39300ba99$re_export$UserScope} from "@logto/node";
|
|
2
2
|
import {withIronSessionApiRoute as $a8eQ2$withIronSessionApiRoute, withIronSessionSsr as $a8eQ2$withIronSessionSsr} from "iron-session/next";
|
|
3
3
|
|
|
4
4
|
|
|
@@ -12,12 +12,12 @@ class $8fa7922f9b3d24ed$export$2e2bcd8739ae039 {
|
|
|
12
12
|
this.request.session[key] = value;
|
|
13
13
|
this.sessionChanged = true;
|
|
14
14
|
}
|
|
15
|
-
getItem(key) {
|
|
15
|
+
async getItem(key) {
|
|
16
16
|
const value = this.request.session[key];
|
|
17
17
|
if (value === undefined) return null;
|
|
18
18
|
return String(value);
|
|
19
19
|
}
|
|
20
|
-
removeItem(key) {
|
|
20
|
+
async removeItem(key) {
|
|
21
21
|
this.request.session[key] = undefined;
|
|
22
22
|
this.sessionChanged = true;
|
|
23
23
|
}
|
|
@@ -29,9 +29,10 @@ class $8fa7922f9b3d24ed$export$2e2bcd8739ae039 {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
|
|
32
33
|
class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
33
|
-
constructor(
|
|
34
|
-
this.config =
|
|
34
|
+
constructor(config){
|
|
35
|
+
this.config = config;
|
|
35
36
|
this.handleSignIn = (redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`)=>(0, $a8eQ2$withIronSessionApiRoute)(async (request, response)=>{
|
|
36
37
|
const nodeClient = this.createNodeClient(request);
|
|
37
38
|
await nodeClient.signIn(redirectUri);
|
|
@@ -53,9 +54,9 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
53
54
|
await this.storage?.save();
|
|
54
55
|
if (this.navigateUrl) response.redirect(this.navigateUrl);
|
|
55
56
|
}, this.ironSessionConfigs);
|
|
56
|
-
this.handleUser = (
|
|
57
|
+
this.handleUser = (configs)=>this.withLogtoApiRoute((request, response)=>{
|
|
57
58
|
response.json(request.user);
|
|
58
|
-
},
|
|
59
|
+
}, configs);
|
|
59
60
|
this.handleAuthRoutes = (configs)=>(request, response)=>{
|
|
60
61
|
const { action: action } = request.query;
|
|
61
62
|
if (action === "sign-in") return this.handleSignIn()(request, response);
|
|
@@ -65,7 +66,7 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
65
66
|
response.status(404).end();
|
|
66
67
|
};
|
|
67
68
|
this.withLogtoApiRoute = (handler, config = {})=>(0, $a8eQ2$withIronSessionApiRoute)(async (request, response)=>{
|
|
68
|
-
const user = await this.getLogtoUserFromRequest(request, config
|
|
69
|
+
const user = await this.getLogtoUserFromRequest(request, config);
|
|
69
70
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
|
70
71
|
Object.defineProperty(request, "user", {
|
|
71
72
|
enumerable: true,
|
|
@@ -73,8 +74,8 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
73
74
|
});
|
|
74
75
|
return handler(request, response);
|
|
75
76
|
}, this.ironSessionConfigs);
|
|
76
|
-
this.withLogtoSsr = (handler,
|
|
77
|
-
const user = await this.getLogtoUserFromRequest(context.req,
|
|
77
|
+
this.withLogtoSsr = (handler, configs = {})=>(0, $a8eQ2$withIronSessionSsr)(async (context)=>{
|
|
78
|
+
const user = await this.getLogtoUserFromRequest(context.req, configs);
|
|
78
79
|
// eslint-disable-next-line @silverhand/fp/no-mutating-methods
|
|
79
80
|
Object.defineProperty(context.req, "user", {
|
|
80
81
|
enumerable: true,
|
|
@@ -85,10 +86,7 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
85
86
|
}
|
|
86
87
|
createNodeClient(request) {
|
|
87
88
|
this.storage = new (0, $8fa7922f9b3d24ed$export$2e2bcd8739ae039)(request);
|
|
88
|
-
return new (0, $a8eQ2$logtonode)({
|
|
89
|
-
...this.config,
|
|
90
|
-
persistAccessToken: this.config.persistAccessToken ?? true
|
|
91
|
-
}, {
|
|
89
|
+
return new (0, $a8eQ2$logtonode)(this.config, {
|
|
92
90
|
storage: this.storage,
|
|
93
91
|
navigate: (url)=>{
|
|
94
92
|
this.navigateUrl = url;
|
|
@@ -105,39 +103,12 @@ class $7d6712a39300ba99$export$2e2bcd8739ae039 {
|
|
|
105
103
|
}
|
|
106
104
|
};
|
|
107
105
|
}
|
|
108
|
-
async getLogtoUserFromRequest(request,
|
|
106
|
+
async getLogtoUserFromRequest(request, configs) {
|
|
109
107
|
const nodeClient = this.createNodeClient(request);
|
|
110
|
-
|
|
111
|
-
if (!isAuthenticated) {
|
|
112
|
-
const user = {
|
|
113
|
-
isAuthenticated: isAuthenticated
|
|
114
|
-
};
|
|
115
|
-
return user;
|
|
116
|
-
}
|
|
117
|
-
if (!getAccessToken) {
|
|
118
|
-
const user = {
|
|
119
|
-
isAuthenticated: isAuthenticated,
|
|
120
|
-
claims: nodeClient.getIdTokenClaims()
|
|
121
|
-
};
|
|
122
|
-
return user;
|
|
123
|
-
}
|
|
124
|
-
try {
|
|
125
|
-
const accessToken = await nodeClient.getAccessToken();
|
|
126
|
-
await this.storage?.save();
|
|
127
|
-
const user = {
|
|
128
|
-
isAuthenticated: isAuthenticated,
|
|
129
|
-
claims: nodeClient.getIdTokenClaims(),
|
|
130
|
-
accessToken: accessToken
|
|
131
|
-
};
|
|
132
|
-
return user;
|
|
133
|
-
} catch {
|
|
134
|
-
return {
|
|
135
|
-
isAuthenticated: false
|
|
136
|
-
};
|
|
137
|
-
}
|
|
108
|
+
return nodeClient.getContext(configs);
|
|
138
109
|
}
|
|
139
110
|
}
|
|
140
111
|
|
|
141
112
|
|
|
142
|
-
export {$7d6712a39300ba99$export$2e2bcd8739ae039 as default};
|
|
113
|
+
export {$7d6712a39300ba99$export$2e2bcd8739ae039 as default, $7d6712a39300ba99$re_export$ReservedScope as ReservedScope, $7d6712a39300ba99$re_export$UserScope as UserScope};
|
|
143
114
|
//# sourceMappingURL=module.js.map
|
package/lib/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;AAAA;;ACIe;IAEb,YAA6B,OAAwB,CAAE;aAA1B,OAAwB,GAAxB,OAAwB;aAD7C,cAAc,GAAG,KAAK;KAC2B;IAEzD,MAAM,OAAO,CAAC,GAAe,EAAE,KAAa,EAAE;QAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;IAED,OAAO,CAAC,GAAe,EAAE;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,AAAC;QAExC,IAAI,KAAK,KAAK,SAAS,EACrB,OAAO,IAAI,CAAC;QAGd,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;IAED,UAAU,CAAC,GAAe,EAAE;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;IAED,MAAM,IAAI,GAAG;QACX,IAAI,CAAC,IAAI,CAAC,cAAc,EACtB,OAAO;QAGT,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;KAC7B;CACF;;;ADzBc;IAGb,YAA6B,OAAuB,CAAE;aAAzB,MAAuB,GAAvB,OAAuB;aAEpD,YAAY,GAAG,CACb,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,GAEjE,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAClD,MAAM,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACrC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,WAAW,EAClB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAEvC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,oBAAoB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GACtD,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAElD,IAAI,OAAO,CAAC,GAAG,EAAE;oBACf,MAAM,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC9E,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;iBAC/B;aACF,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,aAAa,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAChD,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;gBAClD,MAAM,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEtC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAE3B,IAAI,IAAI,CAAC,WAAW,EAClB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAEvC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,UAAU,GAAG,CAAC,MAAwB,GACpC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,QAAQ,GAAK;gBAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC7B,EAAE,MAAM,CAAC;aAEZ,gBAAgB,GACd,CAAC,OAAyB,GAC1B,CAAC,OAAO,EAAE,QAAQ,GAAK;gBACrB,MAAM,UAAE,MAAM,CAAA,EAAE,GAAG,OAAO,CAAC,KAAK,AAAC;gBAEjC,IAAI,MAAM,KAAK,SAAS,EACtB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGhD,IAAI,MAAM,KAAK,kBAAkB,EAC/B,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGxD,IAAI,MAAM,KAAK,UAAU,EACvB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGjD,IAAI,MAAM,KAAK,MAAM,EACnB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAGrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;aAC5B;aAEH,iBAAiB,GAAG,CAAC,OAAuB,EAAE,MAAuB,GAAG,EAAE,GACxE,CAAA,GAAA,8BAAuB,CAAA,CAAC,OAAO,OAAO,EAAE,QAAQ,GAAK;gBACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,AAAC;gBAEhF,8DAA8D;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;oBAAE,UAAU,EAAE,IAAI;oBAAE,GAAG,EAAE,IAAM,IAAI;iBAAE,CAAC,CAAC;gBAE9E,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;aACnC,EAAE,IAAI,CAAC,kBAAkB,CAAC;aAE7B,YAAY,GAAG,CACb,OAEuE,EACvE,MAAuB,GAAG,EAAE,GAE5B,CAAA,GAAA,yBAAkB,CAAA,CAAC,OAAO,OAAO,GAAK;gBACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,AAAC;gBACpF,8DAA8D;gBAC9D,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE;oBAAE,UAAU,EAAE,IAAI;oBAAE,GAAG,EAAE,IAAM,IAAI;iBAAE,CAAC,CAAC;gBAElF,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;aACzB,EAAE,IAAI,CAAC,kBAAkB,CAAC;KA1F2B;IA4FxD,AAAQ,gBAAgB,CAAC,OAAwB,EAAE;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA,GAAA,wCAAW,CAAA,CAAC,OAAO,CAAC,CAAC;QAExC,OAAO,IAAI,CAAA,GAAA,gBAAU,CAAA,CACnB;YACE,GAAG,IAAI,CAAC,MAAM;YACd,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI;SAC3D,EACD;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,CAAC,GAAG,GAAK;gBACjB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;aACxB;SACF,CACF,CAAC;KACH;IAED,IAAY,kBAAkB,GAAG;QAC/B,OAAO;YACL,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YAClC,aAAa,EAAE;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBAChC,MAAM,EAAE,OAAiB;aAC1B;SACF,CAAC;KACH;IAED,MAAc,uBAAuB,CAAC,OAAwB,EAAE,cAAwB,EAAE;QACxF,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,AAAC;QAClD,MAAM,mBAAE,eAAe,CAAA,EAAE,GAAG,UAAU,AAAC;QAEvC,IAAI,CAAC,eAAe,EAAE;YACpB,MAAM,IAAI,GAAc;iCACtB,eAAe;aAChB,AAAC;YAEF,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,cAAc,EAAE;YACnB,MAAM,IAAI,GAAc;iCACtB,eAAe;gBACf,MAAM,EAAE,UAAU,CAAC,gBAAgB,EAAE;aACtC,AAAC;YAEF,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,AAAC;YACtD,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YAE3B,MAAM,IAAI,GAAc;iCACtB,eAAe;gBACf,MAAM,EAAE,UAAU,CAAC,gBAAgB,EAAE;6BACrC,WAAW;aACZ,AAAC;YAEF,OAAO,IAAI,CAAC;SACb,CAAC,OAAM;YACN,OAAO;gBACL,eAAe,EAAE,KAAK;aACvB,CAAC;SACH;KACF;CACF","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig, LogtoUser, WithLogtoConfig } from './types';\n\nexport type { LogtoUser } from './types';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (config?: WithLogtoConfig) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, config);\n\n handleAuthRoutes =\n (configs?: WithLogtoConfig): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (handler: NextApiHandler, config: WithLogtoConfig = {}): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config.getAccessToken);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n config: WithLogtoConfig = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, config.getAccessToken);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(\n {\n ...this.config,\n persistAccessToken: this.config.persistAccessToken ?? true,\n },\n {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n }\n );\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, getAccessToken?: boolean) {\n const nodeClient = this.createNodeClient(request);\n const { isAuthenticated } = nodeClient;\n\n if (!isAuthenticated) {\n const user: LogtoUser = {\n isAuthenticated,\n };\n\n return user;\n }\n\n if (!getAccessToken) {\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n };\n\n return user;\n }\n\n try {\n const accessToken = await nodeClient.getAccessToken();\n await this.storage?.save();\n\n const user: LogtoUser = {\n isAuthenticated,\n claims: nodeClient.getIdTokenClaims(),\n accessToken,\n };\n\n return user;\n } catch {\n return {\n isAuthenticated: false,\n };\n }\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["packages/next/src/index.ts","packages/next/src/storage.ts"],"sourcesContent":["import { IncomingMessage } from 'http';\n\nimport NodeClient, { GetContextParameters } from '@logto/node';\nimport { withIronSessionApiRoute, withIronSessionSsr } from 'iron-session/next';\nimport { GetServerSidePropsContext, GetServerSidePropsResult, NextApiHandler } from 'next';\n\nimport NextStorage from './storage';\nimport { LogtoNextConfig } from './types';\n\nexport { ReservedScope, UserScope } from '@logto/node';\n\nexport type { LogtoContext } from '@logto/node';\n\nexport default class LogtoClient {\n private navigateUrl?: string;\n private storage?: NextStorage;\n constructor(private readonly config: LogtoNextConfig) {}\n\n handleSignIn = (\n redirectUri = `${this.config.baseUrl}/api/logto/sign-in-callback`\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signIn(redirectUri);\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleSignInCallback = (redirectTo = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n\n if (request.url) {\n await nodeClient.handleSignInCallback(`${this.config.baseUrl}${request.url}`);\n await this.storage?.save();\n response.redirect(redirectTo);\n }\n }, this.ironSessionConfigs);\n\n handleSignOut = (redirectUri = this.config.baseUrl): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const nodeClient = this.createNodeClient(request);\n await nodeClient.signOut(redirectUri);\n\n request.session.destroy();\n await this.storage?.save();\n\n if (this.navigateUrl) {\n response.redirect(this.navigateUrl);\n }\n }, this.ironSessionConfigs);\n\n handleUser = (configs?: GetContextParameters) =>\n this.withLogtoApiRoute((request, response) => {\n response.json(request.user);\n }, configs);\n\n handleAuthRoutes =\n (configs?: GetContextParameters): NextApiHandler =>\n (request, response) => {\n const { action } = request.query;\n\n if (action === 'sign-in') {\n return this.handleSignIn()(request, response);\n }\n\n if (action === 'sign-in-callback') {\n return this.handleSignInCallback()(request, response);\n }\n\n if (action === 'sign-out') {\n return this.handleSignOut()(request, response);\n }\n\n if (action === 'user') {\n return this.handleUser(configs)(request, response);\n }\n\n response.status(404).end();\n };\n\n withLogtoApiRoute = (\n handler: NextApiHandler,\n config: GetContextParameters = {}\n ): NextApiHandler =>\n withIronSessionApiRoute(async (request, response) => {\n const user = await this.getLogtoUserFromRequest(request, config);\n\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(request, 'user', { enumerable: true, get: () => user });\n\n return handler(request, response);\n }, this.ironSessionConfigs);\n\n withLogtoSsr = <P extends Record<string, unknown> = Record<string, unknown>>(\n handler: (\n context: GetServerSidePropsContext\n ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,\n configs: GetContextParameters = {}\n ) =>\n withIronSessionSsr(async (context) => {\n const user = await this.getLogtoUserFromRequest(context.req, configs);\n // eslint-disable-next-line @silverhand/fp/no-mutating-methods\n Object.defineProperty(context.req, 'user', { enumerable: true, get: () => user });\n\n return handler(context);\n }, this.ironSessionConfigs);\n\n private createNodeClient(request: IncomingMessage) {\n this.storage = new NextStorage(request);\n\n return new NodeClient(this.config, {\n storage: this.storage,\n navigate: (url) => {\n this.navigateUrl = url;\n },\n });\n }\n\n private get ironSessionConfigs() {\n return {\n cookieName: `logto:${this.config.appId}`,\n password: this.config.cookieSecret,\n cookieOptions: {\n secure: this.config.cookieSecure,\n maxAge: 14 * 24 * 60 * 60,\n },\n };\n }\n\n private async getLogtoUserFromRequest(request: IncomingMessage, configs: GetContextParameters) {\n const nodeClient = this.createNodeClient(request);\n\n return nodeClient.getContext(configs);\n }\n}\n","import { IncomingMessage } from 'http';\n\nimport { Storage, StorageKey } from '@logto/node';\n\nexport default class NextStorage implements Storage {\n private sessionChanged = false;\n constructor(private readonly request: IncomingMessage) {}\n\n async setItem(key: StorageKey, value: string) {\n this.request.session[key] = value;\n this.sessionChanged = true;\n }\n\n async getItem(key: StorageKey) {\n const value = this.request.session[key];\n\n if (value === undefined) {\n return null;\n }\n\n return String(value);\n }\n\n async removeItem(key: StorageKey) {\n this.request.session[key] = undefined;\n this.sessionChanged = true;\n }\n\n async save() {\n if (!this.sessionChanged) {\n return;\n }\n\n await this.request.session.save();\n this.sessionChanged = false;\n }\n}\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logto/next",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.11",
|
|
4
4
|
"source": "./src/index.ts",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -29,31 +29,31 @@
|
|
|
29
29
|
"prepack": "pnpm test"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@logto/node": "^1.0.0-beta.
|
|
32
|
+
"@logto/node": "^1.0.0-beta.11",
|
|
33
33
|
"iron-session": "^6.1.3"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@jest/types": "^27.5.1",
|
|
37
|
-
"@parcel/core": "^2.
|
|
38
|
-
"@parcel/packager-ts": "^2.
|
|
39
|
-
"@parcel/transformer-typescript-types": "^2.
|
|
40
|
-
"@silverhand/eslint-config": "^0.
|
|
41
|
-
"@silverhand/ts-config": "^0.
|
|
42
|
-
"@silverhand/ts-config-react": "^0.
|
|
37
|
+
"@parcel/core": "^2.7.0",
|
|
38
|
+
"@parcel/packager-ts": "^2.7.0",
|
|
39
|
+
"@parcel/transformer-typescript-types": "^2.7.0",
|
|
40
|
+
"@silverhand/eslint-config": "^1.0.0",
|
|
41
|
+
"@silverhand/ts-config": "^1.0.0",
|
|
42
|
+
"@silverhand/ts-config-react": "^1.0.0",
|
|
43
43
|
"@types/jest": "^27.4.0",
|
|
44
|
-
"eslint": "^8.
|
|
44
|
+
"eslint": "^8.23.0",
|
|
45
45
|
"jest": "^27.5.1",
|
|
46
46
|
"jest-location-mock": "^1.0.9",
|
|
47
47
|
"jest-matcher-specific-error": "^1.0.0",
|
|
48
48
|
"lint-staged": "^13.0.0",
|
|
49
49
|
"next": "^12.2.2",
|
|
50
50
|
"next-test-api-route-handler": "^3.1.6",
|
|
51
|
-
"parcel": "^2.
|
|
52
|
-
"prettier": "^2.
|
|
51
|
+
"parcel": "^2.7.0",
|
|
52
|
+
"prettier": "^2.7.1",
|
|
53
53
|
"react": "^17.0.2",
|
|
54
54
|
"react-dom": "^17.0.2",
|
|
55
55
|
"ts-jest": "^27.0.4",
|
|
56
|
-
"typescript": "
|
|
56
|
+
"typescript": "4.7.4"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"next": ">=12"
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "2854b6057d269a7dc24ed53f65aba897dde9b2e8"
|
|
77
77
|
}
|