jcc-express-mvc 1.8.8 → 1.8.21
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/__tests__/MySqlSchemaBlueprint.test.d.ts +2 -0
- package/__tests__/MySqlSchemaBlueprint.test.d.ts.map +1 -0
- package/__tests__/MySqlSchemaBlueprint.test.js +55 -0
- package/__tests__/PostgresTranslator.test.d.ts +2 -0
- package/__tests__/PostgresTranslator.test.d.ts.map +1 -0
- package/__tests__/PostgresTranslator.test.js +82 -0
- package/__tests__/SQLiteTranslator.test.d.ts +2 -0
- package/__tests__/SQLiteTranslator.test.d.ts.map +1 -0
- package/__tests__/SQLiteTranslator.test.js +125 -0
- package/__tests__/SchemaAlterBlueprint.test.d.ts +2 -0
- package/__tests__/SchemaAlterBlueprint.test.d.ts.map +1 -0
- package/__tests__/SchemaAlterBlueprint.test.js +35 -0
- package/global.d.ts +3 -1
- package/index.d.ts +28 -3
- package/index.d.ts.map +1 -1
- package/index.js +33 -75
- package/lib/Application/Application.d.ts +1 -1
- package/lib/Application/Application.d.ts.map +1 -1
- package/lib/Application/Application.js +2 -2
- package/lib/Application/ApplicationBuilder.d.ts.map +1 -1
- package/lib/Application/ApplicationBuilder.js +9 -2
- package/lib/Auth/AuthMiddleware.d.ts.map +1 -1
- package/lib/Auth/AuthMiddleware.js +29 -12
- package/lib/Auth/index.d.ts +17 -3
- package/lib/Auth/index.d.ts.map +1 -1
- package/lib/Auth/index.js +128 -26
- package/lib/Auth/loginRateLimit.d.ts +6 -0
- package/lib/Auth/loginRateLimit.d.ts.map +1 -0
- package/lib/Auth/loginRateLimit.js +25 -0
- package/lib/Auth/refreshTokenStore.d.ts +24 -0
- package/lib/Auth/refreshTokenStore.d.ts.map +1 -0
- package/lib/Auth/refreshTokenStore.js +46 -0
- package/lib/Command-Line/DBCommand.d.ts.map +1 -1
- package/lib/Command-Line/DBCommand.js +9 -3
- package/lib/Command-Line/KeyGenerateCommand.d.ts +6 -0
- package/lib/Command-Line/KeyGenerateCommand.d.ts.map +1 -0
- package/lib/Command-Line/KeyGenerateCommand.js +47 -0
- package/lib/Command-Line/NodeArtisanCommand.d.ts +2 -0
- package/lib/Command-Line/NodeArtisanCommand.d.ts.map +1 -1
- package/lib/Command-Line/NodeArtisanCommand.js +20 -3
- package/lib/Command-Line/NodeTinker/Tinker.d.ts +5 -2
- package/lib/Command-Line/NodeTinker/Tinker.d.ts.map +1 -1
- package/lib/Command-Line/NodeTinker/Tinker.js +13 -3
- package/lib/Command-Line/WatchCommand.d.ts +29 -0
- package/lib/Command-Line/WatchCommand.d.ts.map +1 -0
- package/lib/Command-Line/WatchCommand.js +234 -0
- package/lib/Command-Line/files/Models.d.ts.map +1 -1
- package/lib/Command-Line/files/Models.js +41 -16
- package/lib/Console/Command.d.ts +18 -0
- package/lib/Console/Command.d.ts.map +1 -1
- package/lib/Console/Command.js +29 -0
- package/lib/Container/index.d.ts.map +1 -1
- package/lib/Container/index.js +21 -7
- package/lib/Database/Database.d.ts +2 -1
- package/lib/Database/Database.d.ts.map +1 -1
- package/lib/Database/Database.js +6 -5
- package/lib/Database/DatabaseServiceProvider.d.ts +0 -4
- package/lib/Database/DatabaseServiceProvider.d.ts.map +1 -1
- package/lib/Database/DatabaseServiceProvider.js +9 -56
- package/lib/Database/Drivers/MongooseDriver.d.ts +2 -0
- package/lib/Database/Drivers/MongooseDriver.d.ts.map +1 -1
- package/lib/Database/Drivers/MongooseDriver.js +11 -13
- package/lib/Database/Drivers/SequelizeDriver.d.ts +9 -1
- package/lib/Database/Drivers/SequelizeDriver.d.ts.map +1 -1
- package/lib/Database/Drivers/SequelizeDriver.js +43 -18
- package/lib/Error/SocialiteAuthError/SocialiteAuthError.d.ts +9 -0
- package/lib/Error/SocialiteAuthError/SocialiteAuthError.d.ts.map +1 -0
- package/lib/Error/SocialiteAuthError/SocialiteAuthError.js +17 -0
- package/lib/Global/helpers.d.ts.map +1 -1
- package/lib/Global/helpers.js +6 -4
- package/lib/Http/index.d.ts +3 -1
- package/lib/Http/index.d.ts.map +1 -1
- package/lib/Http/index.js +26 -5
- package/lib/Interface/index.d.ts +12 -3
- package/lib/Interface/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Builder.d.ts +12 -1
- package/lib/Jcc-eloquent/lib/Builder.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Builder.js +116 -4
- package/lib/Jcc-eloquent/lib/Interfaces/index.d.ts +37 -2
- package/lib/Jcc-eloquent/lib/Interfaces/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Migration.d.ts +6 -0
- package/lib/Jcc-eloquent/lib/Migration.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Migration.js +24 -2
- package/lib/Jcc-eloquent/lib/Model.d.ts +24 -7
- package/lib/Jcc-eloquent/lib/Model.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Model.js +35 -2
- package/lib/Jcc-eloquent/lib/QueryBuilder.d.ts +2 -1
- package/lib/Jcc-eloquent/lib/QueryBuilder.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/QueryBuilder.js +10 -1
- package/lib/Jcc-eloquent/lib/Rollback.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Rollback.js +9 -2
- package/lib/Jcc-eloquent/lib/Schema/BaseSchemaEntity/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Schema/BaseSchemaEntity/index.js +3 -3
- package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.d.ts +6 -2
- package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.js +41 -12
- package/lib/Jcc-eloquent/lib/Schema/Translator/Sqlite.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Schema/Translator/Sqlite.js +21 -3
- package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.d.ts +1 -0
- package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.js +70 -14
- package/lib/Jcc-eloquent/lib/Schema/index.d.ts +12 -0
- package/lib/Jcc-eloquent/lib/Schema/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/Schema/index.js +27 -6
- package/lib/Jcc-eloquent/lib/utils/index.d.ts +13 -0
- package/lib/Jcc-eloquent/lib/utils/index.d.ts.map +1 -1
- package/lib/Jcc-eloquent/lib/utils/index.js +62 -0
- package/lib/Middleware/index.d.ts.map +1 -1
- package/lib/Middleware/index.js +4 -7
- package/lib/Model/Sequelize.d.ts +3 -0
- package/lib/Model/Sequelize.d.ts.map +1 -0
- package/lib/Model/Sequelize.js +6 -0
- package/lib/Providers/SessionServiceProvider.d.ts +12 -0
- package/lib/Providers/SessionServiceProvider.d.ts.map +1 -0
- package/lib/Providers/SessionServiceProvider.js +47 -0
- package/lib/Queue/Controllers/QueueControllers.d.ts +4 -13
- package/lib/Queue/Controllers/QueueControllers.d.ts.map +1 -1
- package/lib/Queue/Controllers/QueueControllers.js +1 -16
- package/lib/Queue/Route/web.js +4 -1
- package/lib/Queue/index.d.ts +1 -0
- package/lib/Queue/index.d.ts.map +1 -1
- package/lib/Queue/index.js +3 -0
- package/lib/Queue/middleware/queueDashboardGuard.d.ts +7 -0
- package/lib/Queue/middleware/queueDashboardGuard.d.ts.map +1 -0
- package/lib/Queue/middleware/queueDashboardGuard.js +43 -0
- package/lib/Response/index.d.ts.map +1 -1
- package/lib/Response/index.js +6 -1
- package/lib/Routes/Route.d.ts +2 -2
- package/lib/Routes/Route.d.ts.map +1 -1
- package/lib/Routes/RouteBuilder.d.ts +2 -2
- package/lib/Routes/RouteBuilder.d.ts.map +1 -1
- package/lib/Security/CsrfMiddleware.d.ts.map +1 -1
- package/lib/Security/CsrfMiddleware.js +6 -4
- package/lib/Session/DatabaseSession.d.ts +9 -3
- package/lib/Session/DatabaseSession.d.ts.map +1 -1
- package/lib/Session/DatabaseSession.js +38 -36
- package/lib/Session/ExpressJccSession.d.ts +23 -0
- package/lib/Session/ExpressJccSession.d.ts.map +1 -0
- package/lib/Session/ExpressJccSession.js +110 -0
- package/lib/Session/RedisSession.d.ts +2 -2
- package/lib/Session/RedisSession.d.ts.map +1 -1
- package/lib/Session/RedisSession.js +19 -5
- package/lib/Session/SessionManager.d.ts +18 -4
- package/lib/Session/SessionManager.d.ts.map +1 -1
- package/lib/Session/SessionManager.js +53 -17
- package/lib/Socialite/AbstractProvider.d.ts +60 -0
- package/lib/Socialite/AbstractProvider.d.ts.map +1 -0
- package/lib/Socialite/AbstractProvider.js +136 -0
- package/lib/Socialite/Drivers/facebook/FacebookDriver.d.ts +9 -0
- package/lib/Socialite/Drivers/facebook/FacebookDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/facebook/FacebookDriver.js +40 -0
- package/lib/Socialite/Drivers/facebook/FacebookProvider.d.ts +15 -0
- package/lib/Socialite/Drivers/facebook/FacebookProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/facebook/FacebookProvider.js +28 -0
- package/lib/Socialite/Drivers/github/GitHubDriver.d.ts +9 -0
- package/lib/Socialite/Drivers/github/GitHubDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/github/GitHubDriver.js +54 -0
- package/lib/Socialite/Drivers/github/GitHubProvider.d.ts +15 -0
- package/lib/Socialite/Drivers/github/GitHubProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/github/GitHubProvider.js +28 -0
- package/lib/Socialite/Drivers/gitlab/GitLabDriver.d.ts +10 -0
- package/lib/Socialite/Drivers/gitlab/GitLabDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/gitlab/GitLabDriver.js +37 -0
- package/lib/Socialite/Drivers/gitlab/GitLabProvider.d.ts +15 -0
- package/lib/Socialite/Drivers/gitlab/GitLabProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/gitlab/GitLabProvider.js +28 -0
- package/lib/Socialite/Drivers/google/GoogleDriver.d.ts +9 -0
- package/lib/Socialite/Drivers/google/GoogleDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/google/GoogleDriver.js +39 -0
- package/lib/Socialite/Drivers/google/GoogleProvider.d.ts +15 -0
- package/lib/Socialite/Drivers/google/GoogleProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/google/GoogleProvider.js +28 -0
- package/lib/Socialite/Drivers/slack/SlackDriver.d.ts +9 -0
- package/lib/Socialite/Drivers/slack/SlackDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/slack/SlackDriver.js +41 -0
- package/lib/Socialite/Drivers/slack/SlackProvider.d.ts +16 -0
- package/lib/Socialite/Drivers/slack/SlackProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/slack/SlackProvider.js +37 -0
- package/lib/Socialite/Drivers/twitter/TwitterDriver.d.ts +9 -0
- package/lib/Socialite/Drivers/twitter/TwitterDriver.d.ts.map +1 -0
- package/lib/Socialite/Drivers/twitter/TwitterDriver.js +57 -0
- package/lib/Socialite/Drivers/twitter/TwitterProvider.d.ts +16 -0
- package/lib/Socialite/Drivers/twitter/TwitterProvider.d.ts.map +1 -0
- package/lib/Socialite/Drivers/twitter/TwitterProvider.js +38 -0
- package/lib/Socialite/SocialUser.d.ts +42 -0
- package/lib/Socialite/SocialUser.d.ts.map +1 -0
- package/lib/Socialite/SocialUser.js +116 -0
- package/lib/Socialite/Socialite.d.ts +13 -0
- package/lib/Socialite/Socialite.d.ts.map +1 -0
- package/lib/Socialite/Socialite.js +41 -0
- package/lib/Socialite/SocialiteProvider.d.ts +9 -0
- package/lib/Socialite/SocialiteProvider.d.ts.map +1 -0
- package/lib/Socialite/SocialiteProvider.js +15 -0
- package/lib/Socialite/config.d.ts +7 -0
- package/lib/Socialite/config.d.ts.map +1 -0
- package/lib/Socialite/config.js +44 -0
- package/lib/Socialite/constant.d.ts +18 -0
- package/lib/Socialite/constant.d.ts.map +1 -0
- package/lib/Socialite/constant.js +20 -0
- package/lib/Socialite/index.d.ts +13 -0
- package/lib/Socialite/index.d.ts.map +1 -0
- package/lib/Socialite/index.js +25 -0
- package/lib/Socialite/types.d.ts +13 -0
- package/lib/Socialite/types.d.ts.map +1 -0
- package/lib/Socialite/types.js +2 -0
- package/lib/Type/index.d.ts +1 -0
- package/lib/Type/index.d.ts.map +1 -1
- package/lib/Validation/Validator/CustomValidation.d.ts.map +1 -1
- package/lib/Validation/Validator/CustomValidation.js +2 -2
- package/lib/Validation/Validator/helper.d.ts.map +1 -1
- package/lib/Validation/Validator/helper.js +8 -1
- package/lib/util/index.d.ts +36 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +123 -26
- package/package.json +1 -1
|
@@ -1,12 +1,26 @@
|
|
|
1
|
+
import type { RequestHandler } from "express";
|
|
1
2
|
import { Session } from "./index";
|
|
2
3
|
import { SessionConfig } from "../Interface";
|
|
4
|
+
/**
|
|
5
|
+
* Laravel-style session manager: resolves a store by `driver` and exposes
|
|
6
|
+
* `express-session` middleware backed by that store.
|
|
7
|
+
*/
|
|
3
8
|
export declare class SessionManager {
|
|
4
|
-
private
|
|
5
|
-
private
|
|
9
|
+
private readonly store;
|
|
10
|
+
private readonly expressStore;
|
|
11
|
+
private readonly config;
|
|
6
12
|
constructor(config: SessionConfig);
|
|
13
|
+
getConfig(): SessionConfig;
|
|
7
14
|
private createStore;
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
static buildRedisUrl(r: NonNullable<SessionConfig["redis"]>): string;
|
|
16
|
+
/**
|
|
17
|
+
* `express-session` middleware using the configured driver store.
|
|
18
|
+
*/
|
|
19
|
+
getExpressMiddleware(): RequestHandler;
|
|
20
|
+
private buildExpressStore;
|
|
21
|
+
/**
|
|
22
|
+
* Optional: standalone {@link Session} instances backed by the same store (advanced use).
|
|
23
|
+
*/
|
|
10
24
|
createSession(sessionId: string): Promise<Session>;
|
|
11
25
|
}
|
|
12
26
|
//# sourceMappingURL=SessionManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Session/SessionManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Session/SessionManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAA6B,MAAM,cAAc,CAAC;AAIxE;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAMjC,SAAS,IAAI,aAAa;IAI1B,OAAO,CAAC,WAAW;IA0BnB,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM;IAUpE;;OAEG;IACH,oBAAoB,IAAI,cAAc;IAqBtC,OAAO,CAAC,iBAAiB;IAsDzB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKzD"}
|
|
@@ -8,56 +8,89 @@ const uuid_1 = require("uuid");
|
|
|
8
8
|
const express_session_1 = __importDefault(require("express-session"));
|
|
9
9
|
const index_1 = require("./index");
|
|
10
10
|
const FileSession_1 = require("./FileSession");
|
|
11
|
-
const RedisSession_1 = require("./RedisSession");
|
|
12
11
|
const DatabaseSession_1 = require("./DatabaseSession");
|
|
12
|
+
/**
|
|
13
|
+
* Laravel-style session manager: resolves a store by `driver` and exposes
|
|
14
|
+
* `express-session` middleware backed by that store.
|
|
15
|
+
*/
|
|
13
16
|
class SessionManager {
|
|
14
17
|
constructor(config) {
|
|
15
18
|
this.config = config;
|
|
16
19
|
this.store = this.createStore();
|
|
20
|
+
this.expressStore = this.buildExpressStore();
|
|
21
|
+
}
|
|
22
|
+
getConfig() {
|
|
23
|
+
return this.config;
|
|
17
24
|
}
|
|
18
25
|
createStore() {
|
|
19
26
|
switch (this.config.driver) {
|
|
20
27
|
case "file":
|
|
21
28
|
return new FileSession_1.FileSessionStore(this.config.files?.path);
|
|
22
29
|
case "database":
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
return new DatabaseSession_1.DatabaseSessionStore(this.config.database?.table ?? "sessions");
|
|
31
|
+
case "redis": {
|
|
32
|
+
const r = this.config.redis;
|
|
33
|
+
if (!r?.host) {
|
|
34
|
+
throw new Error("Session driver redis requires config.redis.host (and port). Set SESSION_DRIVER=file or configure redis in app config.");
|
|
35
|
+
}
|
|
36
|
+
const url = SessionManager.buildRedisUrl(r);
|
|
37
|
+
// Lazy-load so apps using file/database sessions do not need the `redis` package
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
39
|
+
const { RedisSessionStore } = require("./RedisSession");
|
|
40
|
+
return new RedisSessionStore(url, r.prefix ?? "session:");
|
|
41
|
+
}
|
|
29
42
|
default:
|
|
30
43
|
throw new Error(`Unsupported session driver: ${this.config.driver}`);
|
|
31
44
|
}
|
|
32
45
|
}
|
|
46
|
+
static buildRedisUrl(r) {
|
|
47
|
+
const host = r.host;
|
|
48
|
+
const port = r.port ?? 6379;
|
|
49
|
+
const db = r.database ?? 0;
|
|
50
|
+
if (r.password) {
|
|
51
|
+
return `redis://:${encodeURIComponent(r.password)}@${host}:${port}/${db}`;
|
|
52
|
+
}
|
|
53
|
+
return `redis://${host}:${port}/${db}`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* `express-session` middleware using the configured driver store.
|
|
57
|
+
*/
|
|
33
58
|
getExpressMiddleware() {
|
|
59
|
+
const c = this.config.cookie;
|
|
34
60
|
return (0, express_session_1.default)({
|
|
35
61
|
genid: () => (0, uuid_1.v4)(),
|
|
36
|
-
|
|
62
|
+
name: c.name,
|
|
63
|
+
secret: process.env.SESSION_SECRET || process.env.APP_SESSION_SECTRET || "your-secret-key",
|
|
37
64
|
resave: false,
|
|
38
65
|
saveUninitialized: false,
|
|
66
|
+
rolling: false,
|
|
67
|
+
store: this.expressStore,
|
|
39
68
|
cookie: {
|
|
40
|
-
|
|
41
|
-
|
|
69
|
+
maxAge: c.maxAge,
|
|
70
|
+
httpOnly: c.httpOnly,
|
|
71
|
+
secure: c.secure,
|
|
72
|
+
sameSite: c.sameSite,
|
|
73
|
+
path: c.path ?? "/",
|
|
74
|
+
...(c.domain ? { domain: c.domain } : {}),
|
|
42
75
|
},
|
|
43
|
-
store: this.createExpressStore(),
|
|
44
76
|
});
|
|
45
77
|
}
|
|
46
|
-
|
|
78
|
+
buildExpressStore() {
|
|
47
79
|
const store = this.store;
|
|
80
|
+
const lifetime = this.config.lifetime;
|
|
48
81
|
return new (class extends express_session_1.default.Store {
|
|
49
82
|
async get(sid, callback) {
|
|
50
83
|
try {
|
|
51
84
|
const data = (await store.get(sid));
|
|
52
|
-
callback(null, data);
|
|
85
|
+
callback(null, data ?? undefined);
|
|
53
86
|
}
|
|
54
87
|
catch (error) {
|
|
55
88
|
callback(error);
|
|
56
89
|
}
|
|
57
90
|
}
|
|
58
|
-
async set(sid,
|
|
91
|
+
async set(sid, sess, callback) {
|
|
59
92
|
try {
|
|
60
|
-
await store.set(sid,
|
|
93
|
+
await store.set(sid, sess, lifetime);
|
|
61
94
|
callback?.();
|
|
62
95
|
}
|
|
63
96
|
catch (error) {
|
|
@@ -73,9 +106,9 @@ class SessionManager {
|
|
|
73
106
|
callback?.(error);
|
|
74
107
|
}
|
|
75
108
|
}
|
|
76
|
-
async touch(sid,
|
|
109
|
+
async touch(sid, sess, callback) {
|
|
77
110
|
try {
|
|
78
|
-
await store.touch(sid);
|
|
111
|
+
await store.touch(sid, lifetime);
|
|
79
112
|
callback?.();
|
|
80
113
|
}
|
|
81
114
|
catch (error) {
|
|
@@ -84,6 +117,9 @@ class SessionManager {
|
|
|
84
117
|
}
|
|
85
118
|
})();
|
|
86
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Optional: standalone {@link Session} instances backed by the same store (advanced use).
|
|
122
|
+
*/
|
|
87
123
|
async createSession(sessionId) {
|
|
88
124
|
const sessionInstance = new index_1.Session(sessionId, this.store, this.config.lifetime);
|
|
89
125
|
await sessionInstance.load();
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { AppRequest, AppResponse } from "../Interface";
|
|
2
|
+
import { SocialUser } from "./SocialUser";
|
|
3
|
+
import type { OAuthAuthorizeContext, OAuthProviderConfig } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* Base OAuth2 provider — fluent API similar to Laravel Socialite:
|
|
6
|
+
* `scopes()`, `setScopes()`, `redirect()`, `user()`.
|
|
7
|
+
*
|
|
8
|
+
* OAuth CSRF state and PKCE verifier are stored in {@link AppRequest.jccSession}
|
|
9
|
+
* (no Socialite-managed cookies; enable session middleware in your app).
|
|
10
|
+
* SocialUser exposes only profile fields — not provider access tokens.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class AbstractProvider {
|
|
13
|
+
protected readonly oauthConfig: OAuthProviderConfig;
|
|
14
|
+
protected readonly driverName: string;
|
|
15
|
+
/** Accumulated scopes for `scopes()` / `setScopes()` (field kept separate from method name). */
|
|
16
|
+
protected scopeList: string[];
|
|
17
|
+
constructor(oauthConfig: OAuthProviderConfig, driverName: string);
|
|
18
|
+
protected abstract getDefaultScopes(): string[];
|
|
19
|
+
abstract buildAuthorizeUrl(state: string, pkce?: OAuthAuthorizeContext): string;
|
|
20
|
+
abstract fetchAccessToken(code: string, ctx?: {
|
|
21
|
+
codeVerifier?: string;
|
|
22
|
+
}): Promise<Record<string, unknown>>;
|
|
23
|
+
abstract fetchUserFromToken(accessToken: string): Promise<Record<string, unknown>>;
|
|
24
|
+
abstract mapUser(raw: Record<string, unknown>): SocialUser;
|
|
25
|
+
/**
|
|
26
|
+
* Twitter OAuth 2 uses PKCE; other drivers return false.
|
|
27
|
+
*/
|
|
28
|
+
protected requiresPkce(): boolean;
|
|
29
|
+
protected createPkce(): {
|
|
30
|
+
verifier: string;
|
|
31
|
+
challenge: string;
|
|
32
|
+
};
|
|
33
|
+
protected sessionKey(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Merge additional scopes (Laravel `->scopes([...])`).
|
|
36
|
+
*/
|
|
37
|
+
scopes(...scopes: string[]): this;
|
|
38
|
+
/**
|
|
39
|
+
* Replace all scopes (Laravel `->setScopes([...])`).
|
|
40
|
+
*/
|
|
41
|
+
setScopes(scopes: string[]): this;
|
|
42
|
+
protected formatScopes(): string;
|
|
43
|
+
private readOAuthSession;
|
|
44
|
+
private writeOAuthSession;
|
|
45
|
+
private clearOAuthSession;
|
|
46
|
+
/**
|
|
47
|
+
* Redirect to the provider consent screen (Laravel `->redirect()`).
|
|
48
|
+
* Uses global `request` / `response` if arguments omitted.
|
|
49
|
+
*/
|
|
50
|
+
redirect(req?: AppRequest, res?: AppResponse): void;
|
|
51
|
+
/**
|
|
52
|
+
* Complete OAuth on the callback route (Laravel `->user()`).
|
|
53
|
+
*/
|
|
54
|
+
user(req?: AppRequest, _res?: AppResponse): Promise<SocialUser>;
|
|
55
|
+
/**
|
|
56
|
+
* Default: top-level `access_token`. Override for providers that nest tokens (e.g. Slack).
|
|
57
|
+
*/
|
|
58
|
+
protected extractAccessToken(tokens: Record<string, unknown>): string | null;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=AbstractProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractProvider.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Socialite/AbstractProvider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAI1E;;;;;;;GAOG;AACH,8BAAsB,gBAAgB;IAKlC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,mBAAmB;IACnD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM;IALvC,gGAAgG;IAChG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAM;gBAGd,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,MAAM;IAGvC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,IAAI,MAAM,EAAE;IAE/C,QAAQ,CAAC,iBAAiB,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,qBAAqB,GAC3B,MAAM;IAET,QAAQ,CAAC,gBAAgB,CACvB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElF,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;IAE1D;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,OAAO;IAIjC,SAAS,CAAC,UAAU,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAS/D,SAAS,CAAC,UAAU,IAAI,MAAM;IAI9B;;OAEG;IACH,MAAM,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKjC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKjC,SAAS,CAAC,YAAY,IAAI,MAAM;IAMhC,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,IAAI;IAuBnD;;OAEG;IACG,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA+CrE;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;CAI7E"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AbstractProvider = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const SocialiteAuthError_1 = require("../Error/SocialiteAuthError/SocialiteAuthError");
|
|
9
|
+
/**
|
|
10
|
+
* Base OAuth2 provider — fluent API similar to Laravel Socialite:
|
|
11
|
+
* `scopes()`, `setScopes()`, `redirect()`, `user()`.
|
|
12
|
+
*
|
|
13
|
+
* OAuth CSRF state and PKCE verifier are stored in {@link AppRequest.jccSession}
|
|
14
|
+
* (no Socialite-managed cookies; enable session middleware in your app).
|
|
15
|
+
* SocialUser exposes only profile fields — not provider access tokens.
|
|
16
|
+
*/
|
|
17
|
+
class AbstractProvider {
|
|
18
|
+
constructor(oauthConfig, driverName) {
|
|
19
|
+
this.oauthConfig = oauthConfig;
|
|
20
|
+
this.driverName = driverName;
|
|
21
|
+
/** Accumulated scopes for `scopes()` / `setScopes()` (field kept separate from method name). */
|
|
22
|
+
this.scopeList = [];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Twitter OAuth 2 uses PKCE; other drivers return false.
|
|
26
|
+
*/
|
|
27
|
+
requiresPkce() {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
createPkce() {
|
|
31
|
+
const verifier = crypto_1.default.randomBytes(32).toString("base64url");
|
|
32
|
+
const challenge = crypto_1.default
|
|
33
|
+
.createHash("sha256")
|
|
34
|
+
.update(verifier)
|
|
35
|
+
.digest("base64url");
|
|
36
|
+
return { verifier, challenge };
|
|
37
|
+
}
|
|
38
|
+
sessionKey() {
|
|
39
|
+
return `_socialite.oauth.${this.driverName}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Merge additional scopes (Laravel `->scopes([...])`).
|
|
43
|
+
*/
|
|
44
|
+
scopes(...scopes) {
|
|
45
|
+
this.scopeList.push(...scopes);
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Replace all scopes (Laravel `->setScopes([...])`).
|
|
50
|
+
*/
|
|
51
|
+
setScopes(scopes) {
|
|
52
|
+
this.scopeList = [...scopes];
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
formatScopes() {
|
|
56
|
+
const list = this.scopeList.length > 0 ? this.scopeList : this.getDefaultScopes();
|
|
57
|
+
return list.join(" ");
|
|
58
|
+
}
|
|
59
|
+
readOAuthSession(req) {
|
|
60
|
+
const sess = req.jccSession;
|
|
61
|
+
if (!sess) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return sess.get(this.sessionKey());
|
|
65
|
+
}
|
|
66
|
+
writeOAuthSession(req, payload) {
|
|
67
|
+
const sess = req.jccSession;
|
|
68
|
+
if (!sess) {
|
|
69
|
+
throw new SocialiteAuthError_1.SocialiteAuthError("OAuth requires session middleware (jccSession on the request). Enable your app session bridge before Socialite.redirect().", this.driverName);
|
|
70
|
+
}
|
|
71
|
+
sess.put(this.sessionKey(), payload);
|
|
72
|
+
}
|
|
73
|
+
clearOAuthSession(req) {
|
|
74
|
+
req.jccSession?.forget(this.sessionKey());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Redirect to the provider consent screen (Laravel `->redirect()`).
|
|
78
|
+
* Uses global `request` / `response` if arguments omitted.
|
|
79
|
+
*/
|
|
80
|
+
redirect(req, res) {
|
|
81
|
+
const r = req ?? request();
|
|
82
|
+
const s = res ?? response();
|
|
83
|
+
if (!this.oauthConfig.clientId || !this.oauthConfig.clientSecret) {
|
|
84
|
+
throw new SocialiteAuthError_1.SocialiteAuthError(`OAuth not configured for [${this.driverName}]. Set ${this.driverName.toUpperCase()}_CLIENT_ID and _CLIENT_SECRET.`, this.driverName);
|
|
85
|
+
}
|
|
86
|
+
const state = crypto_1.default.randomBytes(20).toString("hex");
|
|
87
|
+
let codeVerifier;
|
|
88
|
+
let pkceCtx;
|
|
89
|
+
if (this.requiresPkce()) {
|
|
90
|
+
const pk = this.createPkce();
|
|
91
|
+
codeVerifier = pk.verifier;
|
|
92
|
+
pkceCtx = { codeChallenge: pk.challenge, codeChallengeMethod: "S256" };
|
|
93
|
+
}
|
|
94
|
+
this.writeOAuthSession(r, { state, codeVerifier });
|
|
95
|
+
const url = this.buildAuthorizeUrl(state, pkceCtx);
|
|
96
|
+
s.redirect(302, url);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Complete OAuth on the callback route (Laravel `->user()`).
|
|
100
|
+
*/
|
|
101
|
+
async user(req, _res) {
|
|
102
|
+
const r = req ?? request();
|
|
103
|
+
const q = r.query;
|
|
104
|
+
const code = q.code;
|
|
105
|
+
const state = q.state;
|
|
106
|
+
const error = q.error;
|
|
107
|
+
const errorDescription = q.error_description;
|
|
108
|
+
if (error) {
|
|
109
|
+
throw new SocialiteAuthError_1.SocialiteAuthError(String(errorDescription || error), this.driverName);
|
|
110
|
+
}
|
|
111
|
+
if (!code || typeof code !== "string") {
|
|
112
|
+
throw new SocialiteAuthError_1.SocialiteAuthError("Missing authorization code.", this.driverName);
|
|
113
|
+
}
|
|
114
|
+
const payload = this.readOAuthSession(r);
|
|
115
|
+
if (!payload?.state || payload.state !== state || typeof state !== "string") {
|
|
116
|
+
throw new SocialiteAuthError_1.SocialiteAuthError("Invalid or expired OAuth state. Try signing in again.", this.driverName);
|
|
117
|
+
}
|
|
118
|
+
const codeVerifier = payload.codeVerifier;
|
|
119
|
+
this.clearOAuthSession(r);
|
|
120
|
+
const tokens = await this.fetchAccessToken(code, codeVerifier ? { codeVerifier } : undefined);
|
|
121
|
+
const accessToken = this.extractAccessToken(tokens);
|
|
122
|
+
if (!accessToken) {
|
|
123
|
+
throw new SocialiteAuthError_1.SocialiteAuthError("No access token in provider response.", this.driverName);
|
|
124
|
+
}
|
|
125
|
+
const raw = await this.fetchUserFromToken(accessToken);
|
|
126
|
+
return this.mapUser(raw);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Default: top-level `access_token`. Override for providers that nest tokens (e.g. Slack).
|
|
130
|
+
*/
|
|
131
|
+
extractAccessToken(tokens) {
|
|
132
|
+
const t = tokens.access_token;
|
|
133
|
+
return typeof t === "string" ? t : null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.AbstractProvider = AbstractProvider;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OAuthProviderConfig } from "../../types";
|
|
2
|
+
export declare class FacebookDriver {
|
|
3
|
+
private readonly cfg;
|
|
4
|
+
constructor(cfg: OAuthProviderConfig);
|
|
5
|
+
getAuthorizationUrl(state: string, scope: string): string;
|
|
6
|
+
exchangeAuthorizationCode(code: string): Promise<Record<string, unknown>>;
|
|
7
|
+
getUser(accessToken: string): Promise<Record<string, unknown>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=FacebookDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FacebookDriver.d.ts","sourceRoot":"","sources":["../../../../../jcc-express-mvc/lib/Socialite/Drivers/facebook/FacebookDriver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIvD,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,mBAAmB;IAErD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAWnD,yBAAyB,CAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAW7B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAQrE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FacebookDriver = void 0;
|
|
4
|
+
const Http_1 = require("../../../Http");
|
|
5
|
+
const constant_1 = require("../../constant");
|
|
6
|
+
const ME_FIELDS = "id,name,email,picture.type(large)";
|
|
7
|
+
class FacebookDriver {
|
|
8
|
+
constructor(cfg) {
|
|
9
|
+
this.cfg = cfg;
|
|
10
|
+
}
|
|
11
|
+
getAuthorizationUrl(state, scope) {
|
|
12
|
+
const params = new URLSearchParams({
|
|
13
|
+
client_id: this.cfg.clientId,
|
|
14
|
+
redirect_uri: this.cfg.redirectUri,
|
|
15
|
+
state,
|
|
16
|
+
scope,
|
|
17
|
+
response_type: "code",
|
|
18
|
+
});
|
|
19
|
+
return `${constant_1.FACEBOOK_AUTHORIZE}?${params.toString()}`;
|
|
20
|
+
}
|
|
21
|
+
async exchangeAuthorizationCode(code) {
|
|
22
|
+
Http_1.Http.reset().withQueryParameters({
|
|
23
|
+
client_id: this.cfg.clientId,
|
|
24
|
+
client_secret: this.cfg.clientSecret,
|
|
25
|
+
redirect_uri: this.cfg.redirectUri,
|
|
26
|
+
code,
|
|
27
|
+
});
|
|
28
|
+
const { data } = await Http_1.Http.get(constant_1.FACEBOOK_TOKEN);
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
async getUser(accessToken) {
|
|
32
|
+
Http_1.Http.reset().withQueryParameters({
|
|
33
|
+
fields: ME_FIELDS,
|
|
34
|
+
access_token: accessToken,
|
|
35
|
+
});
|
|
36
|
+
const { data } = await Http_1.Http.get("https://graph.facebook.com/me");
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.FacebookDriver = FacebookDriver;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AbstractProvider } from "../../AbstractProvider";
|
|
2
|
+
import { SocialUser } from "../../SocialUser";
|
|
3
|
+
import type { OAuthAuthorizeContext, OAuthProviderConfig } from "../../types";
|
|
4
|
+
export declare class FacebookProvider extends AbstractProvider {
|
|
5
|
+
private readonly client;
|
|
6
|
+
constructor(cfg: OAuthProviderConfig);
|
|
7
|
+
getDefaultScopes(): string[];
|
|
8
|
+
buildAuthorizeUrl(state: string, _pkce?: OAuthAuthorizeContext): string;
|
|
9
|
+
fetchAccessToken(code: string, _ctx?: {
|
|
10
|
+
codeVerifier?: string;
|
|
11
|
+
}): Promise<Record<string, unknown>>;
|
|
12
|
+
fetchUserFromToken(accessToken: string): Promise<Record<string, unknown>>;
|
|
13
|
+
mapUser(raw: Record<string, unknown>): SocialUser;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=FacebookProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FacebookProvider.d.ts","sourceRoot":"","sources":["../../../../../jcc-express-mvc/lib/Socialite/Drivers/facebook/FacebookProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9E,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,GAAG,EAAE,mBAAmB;IAKpC,gBAAgB,IAAI,MAAM,EAAE;IAI5B,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAIvE,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAInC,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIzE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAGlD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FacebookProvider = void 0;
|
|
4
|
+
const AbstractProvider_1 = require("../../AbstractProvider");
|
|
5
|
+
const FacebookDriver_1 = require("./FacebookDriver");
|
|
6
|
+
const SocialUser_1 = require("../../SocialUser");
|
|
7
|
+
class FacebookProvider extends AbstractProvider_1.AbstractProvider {
|
|
8
|
+
constructor(cfg) {
|
|
9
|
+
super(cfg, "facebook");
|
|
10
|
+
this.client = new FacebookDriver_1.FacebookDriver(cfg);
|
|
11
|
+
}
|
|
12
|
+
getDefaultScopes() {
|
|
13
|
+
return ["email", "public_profile"];
|
|
14
|
+
}
|
|
15
|
+
buildAuthorizeUrl(state, _pkce) {
|
|
16
|
+
return this.client.getAuthorizationUrl(state, this.formatScopes());
|
|
17
|
+
}
|
|
18
|
+
fetchAccessToken(code, _ctx) {
|
|
19
|
+
return this.client.exchangeAuthorizationCode(code);
|
|
20
|
+
}
|
|
21
|
+
fetchUserFromToken(accessToken) {
|
|
22
|
+
return this.client.getUser(accessToken);
|
|
23
|
+
}
|
|
24
|
+
mapUser(raw) {
|
|
25
|
+
return SocialUser_1.SocialUser.fromFacebook(raw);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.FacebookProvider = FacebookProvider;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OAuthProviderConfig } from "../../types";
|
|
2
|
+
export declare class GitHubDriver {
|
|
3
|
+
private readonly cfg;
|
|
4
|
+
constructor(cfg: OAuthProviderConfig);
|
|
5
|
+
getAuthorizationUrl(state: string, scope: string): string;
|
|
6
|
+
exchangeAuthorizationCode(code: string): Promise<Record<string, unknown>>;
|
|
7
|
+
getUser(accessToken: string): Promise<Record<string, unknown>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GitHubDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubDriver.d.ts","sourceRoot":"","sources":["../../../../../jcc-express-mvc/lib/Socialite/Drivers/github/GitHubDriver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,mBAAmB;IAErD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAUnD,yBAAyB,CAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAc7B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAqBrE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitHubDriver = void 0;
|
|
4
|
+
const Http_1 = require("../../../Http");
|
|
5
|
+
const constant_1 = require("../../constant");
|
|
6
|
+
class GitHubDriver {
|
|
7
|
+
constructor(cfg) {
|
|
8
|
+
this.cfg = cfg;
|
|
9
|
+
}
|
|
10
|
+
getAuthorizationUrl(state, scope) {
|
|
11
|
+
const params = new URLSearchParams({
|
|
12
|
+
client_id: this.cfg.clientId,
|
|
13
|
+
redirect_uri: this.cfg.redirectUri,
|
|
14
|
+
state,
|
|
15
|
+
scope,
|
|
16
|
+
});
|
|
17
|
+
return `${constant_1.GITHUB_AUTHORIZE}?${params.toString()}`;
|
|
18
|
+
}
|
|
19
|
+
async exchangeAuthorizationCode(code) {
|
|
20
|
+
Http_1.Http.reset().withHeaders({
|
|
21
|
+
Accept: "application/json",
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
});
|
|
24
|
+
const { data } = await Http_1.Http.post(constant_1.GITHUB_TOKEN, {
|
|
25
|
+
client_id: this.cfg.clientId,
|
|
26
|
+
client_secret: this.cfg.clientSecret,
|
|
27
|
+
code,
|
|
28
|
+
redirect_uri: this.cfg.redirectUri,
|
|
29
|
+
});
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
async getUser(accessToken) {
|
|
33
|
+
const githubHeaders = {
|
|
34
|
+
Authorization: `Bearer ${accessToken}`,
|
|
35
|
+
Accept: "application/vnd.github+json",
|
|
36
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
37
|
+
};
|
|
38
|
+
Http_1.Http.reset().withHeaders(githubHeaders);
|
|
39
|
+
const { data: user } = await Http_1.Http.get(constant_1.GITHUB_USER);
|
|
40
|
+
if (!user.email) {
|
|
41
|
+
Http_1.Http.reset().withHeaders(githubHeaders);
|
|
42
|
+
const { data: emails } = await Http_1.Http.get(constant_1.GITHUB_EMAILS);
|
|
43
|
+
let primary;
|
|
44
|
+
if (Array.isArray(emails) && emails.length > 0) {
|
|
45
|
+
primary = emails.find((e) => e.primary) ?? emails[0];
|
|
46
|
+
}
|
|
47
|
+
if (primary?.email) {
|
|
48
|
+
user.email = primary.email;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return user;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.GitHubDriver = GitHubDriver;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AbstractProvider } from "../../AbstractProvider";
|
|
2
|
+
import { SocialUser } from "../../SocialUser";
|
|
3
|
+
import type { OAuthAuthorizeContext, OAuthProviderConfig } from "../../types";
|
|
4
|
+
export declare class GitHubProvider extends AbstractProvider {
|
|
5
|
+
private readonly client;
|
|
6
|
+
constructor(cfg: OAuthProviderConfig);
|
|
7
|
+
getDefaultScopes(): string[];
|
|
8
|
+
buildAuthorizeUrl(state: string, _pkce?: OAuthAuthorizeContext): string;
|
|
9
|
+
fetchAccessToken(code: string, _ctx?: {
|
|
10
|
+
codeVerifier?: string;
|
|
11
|
+
}): Promise<Record<string, unknown>>;
|
|
12
|
+
fetchUserFromToken(accessToken: string): Promise<Record<string, unknown>>;
|
|
13
|
+
mapUser(raw: Record<string, unknown>): SocialUser;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=GitHubProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubProvider.d.ts","sourceRoot":"","sources":["../../../../../jcc-express-mvc/lib/Socialite/Drivers/github/GitHubProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9E,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,GAAG,EAAE,mBAAmB;IAKpC,gBAAgB,IAAI,MAAM,EAAE;IAI5B,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAIvE,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAInC,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIzE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU;CAGlD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitHubProvider = void 0;
|
|
4
|
+
const AbstractProvider_1 = require("../../AbstractProvider");
|
|
5
|
+
const GitHubDriver_1 = require("./GitHubDriver");
|
|
6
|
+
const SocialUser_1 = require("../../SocialUser");
|
|
7
|
+
class GitHubProvider extends AbstractProvider_1.AbstractProvider {
|
|
8
|
+
constructor(cfg) {
|
|
9
|
+
super(cfg, "github");
|
|
10
|
+
this.client = new GitHubDriver_1.GitHubDriver(cfg);
|
|
11
|
+
}
|
|
12
|
+
getDefaultScopes() {
|
|
13
|
+
return ["read:user", "user:email"];
|
|
14
|
+
}
|
|
15
|
+
buildAuthorizeUrl(state, _pkce) {
|
|
16
|
+
return this.client.getAuthorizationUrl(state, this.formatScopes());
|
|
17
|
+
}
|
|
18
|
+
fetchAccessToken(code, _ctx) {
|
|
19
|
+
return this.client.exchangeAuthorizationCode(code);
|
|
20
|
+
}
|
|
21
|
+
fetchUserFromToken(accessToken) {
|
|
22
|
+
return this.client.getUser(accessToken);
|
|
23
|
+
}
|
|
24
|
+
mapUser(raw) {
|
|
25
|
+
return SocialUser_1.SocialUser.fromGitHub(raw);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.GitHubProvider = GitHubProvider;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OAuthProviderConfig } from "../../types";
|
|
2
|
+
export declare class GitLabDriver {
|
|
3
|
+
private readonly cfg;
|
|
4
|
+
private readonly base;
|
|
5
|
+
constructor(cfg: OAuthProviderConfig);
|
|
6
|
+
getAuthorizationUrl(state: string, scope: string): string;
|
|
7
|
+
exchangeAuthorizationCode(code: string): Promise<Record<string, unknown>>;
|
|
8
|
+
getUser(accessToken: string): Promise<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=GitLabDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabDriver.d.ts","sourceRoot":"","sources":["../../../../../jcc-express-mvc/lib/Socialite/Drivers/gitlab/GitLabDriver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAED,GAAG,EAAE,mBAAmB;IAIrD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAWnD,yBAAyB,CAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAe7B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAKrE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitLabDriver = void 0;
|
|
4
|
+
const Http_1 = require("../../../Http");
|
|
5
|
+
class GitLabDriver {
|
|
6
|
+
constructor(cfg) {
|
|
7
|
+
this.cfg = cfg;
|
|
8
|
+
this.base = (cfg.gitlabUrl ?? "https://gitlab.com").replace(/\/$/, "");
|
|
9
|
+
}
|
|
10
|
+
getAuthorizationUrl(state, scope) {
|
|
11
|
+
const params = new URLSearchParams({
|
|
12
|
+
client_id: this.cfg.clientId,
|
|
13
|
+
redirect_uri: this.cfg.redirectUri,
|
|
14
|
+
response_type: "code",
|
|
15
|
+
state,
|
|
16
|
+
scope,
|
|
17
|
+
});
|
|
18
|
+
return `${this.base}/oauth/authorize?${params.toString()}`;
|
|
19
|
+
}
|
|
20
|
+
async exchangeAuthorizationCode(code) {
|
|
21
|
+
Http_1.Http.reset().asForm();
|
|
22
|
+
const { data } = await Http_1.Http.post(`${this.base}/oauth/token`, new URLSearchParams({
|
|
23
|
+
client_id: this.cfg.clientId,
|
|
24
|
+
client_secret: this.cfg.clientSecret,
|
|
25
|
+
code,
|
|
26
|
+
grant_type: "authorization_code",
|
|
27
|
+
redirect_uri: this.cfg.redirectUri,
|
|
28
|
+
}).toString());
|
|
29
|
+
return data;
|
|
30
|
+
}
|
|
31
|
+
async getUser(accessToken) {
|
|
32
|
+
Http_1.Http.reset().withHeaders({ Authorization: `Bearer ${accessToken}` });
|
|
33
|
+
const { data } = await Http_1.Http.get(`${this.base}/api/v4/user`);
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.GitLabDriver = GitLabDriver;
|