naystack 1.1.12-beta.8 → 1.1.13-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/email/token.cjs.js +14 -0
- package/dist/auth/email/token.d.mts +2 -1
- package/dist/auth/email/token.d.ts +2 -1
- package/dist/auth/email/token.esm.js +13 -0
- package/dist/auth/google/get.cjs.js +112 -0
- package/dist/auth/google/get.d.mts +7 -0
- package/dist/auth/google/get.d.ts +7 -0
- package/dist/auth/google/get.esm.js +87 -0
- package/dist/auth/google/index.cjs.js +91 -1
- package/dist/auth/google/index.d.mts +17 -2
- package/dist/auth/google/index.d.ts +17 -2
- package/dist/auth/google/index.esm.js +89 -1
- package/dist/auth/index.cjs.js +215 -2
- package/dist/auth/index.d.mts +5 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.esm.js +212 -1
- package/dist/auth/instagram/index.cjs.js +161 -0
- package/dist/auth/instagram/index.d.mts +20 -0
- package/dist/auth/instagram/index.d.ts +20 -0
- package/dist/auth/instagram/index.esm.js +134 -0
- package/dist/auth/instagram/route.cjs.js +139 -0
- package/dist/auth/instagram/route.d.mts +8 -0
- package/dist/auth/instagram/route.d.ts +8 -0
- package/dist/auth/instagram/route.esm.js +114 -0
- package/dist/auth/instagram/utils.cjs.js +69 -0
- package/dist/auth/instagram/utils.d.mts +8 -0
- package/dist/auth/instagram/utils.d.ts +8 -0
- package/dist/auth/instagram/utils.esm.js +42 -0
- package/dist/client/hooks.cjs.js +74 -0
- package/dist/client/hooks.d.mts +6 -0
- package/dist/client/hooks.d.ts +6 -0
- package/dist/client/hooks.esm.js +48 -0
- package/dist/client/index.cjs.js +102 -0
- package/dist/client/index.d.mts +4 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.esm.js +73 -0
- package/dist/{auth/google/oauth.cjs.js → client/seo.cjs.js} +28 -12
- package/dist/client/seo.d.mts +10 -0
- package/dist/client/seo.d.ts +10 -0
- package/dist/client/seo.esm.js +26 -0
- package/dist/graphql/errors.cjs.js +559 -0
- package/dist/graphql/errors.d.mts +5 -0
- package/dist/graphql/errors.d.ts +5 -0
- package/dist/graphql/errors.esm.js +547 -0
- package/dist/graphql/index.cjs.js +534 -2
- package/dist/graphql/index.d.mts +3 -0
- package/dist/graphql/index.d.ts +3 -0
- package/dist/graphql/index.esm.js +543 -2
- package/dist/graphql/utils.cjs.js +0 -2
- package/dist/graphql/utils.d.mts +14 -9
- package/dist/graphql/utils.d.ts +14 -9
- package/dist/graphql/utils.esm.js +0 -2
- package/package.json +13 -2
- package/dist/.tsbuildinfo +0 -1
- package/dist/auth/google/oauth.d.mts +0 -5
- package/dist/auth/google/oauth.d.ts +0 -5
- package/dist/auth/google/oauth.esm.js +0 -10
|
@@ -23,6 +23,7 @@ __export(token_exports, {
|
|
|
23
23
|
generateAccessToken: () => generateAccessToken,
|
|
24
24
|
generateRefreshToken: () => generateRefreshToken,
|
|
25
25
|
getTokenizedResponse: () => getTokenizedResponse,
|
|
26
|
+
getUserIdFromAccessToken: () => getUserIdFromAccessToken,
|
|
26
27
|
getUserIdFromRefreshToken: () => getUserIdFromRefreshToken,
|
|
27
28
|
verifyUser: () => verifyUser
|
|
28
29
|
});
|
|
@@ -71,6 +72,18 @@ function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
|
71
72
|
}
|
|
72
73
|
return null;
|
|
73
74
|
}
|
|
75
|
+
function getUserIdFromAccessToken(refreshToken) {
|
|
76
|
+
if (refreshToken && process.env.SIGNING_KEY)
|
|
77
|
+
try {
|
|
78
|
+
const decoded = (0, import_jsonwebtoken.verify)(refreshToken, process.env.SIGNING_KEY);
|
|
79
|
+
if (typeof decoded !== "string" && typeof decoded.id === "number")
|
|
80
|
+
return decoded.id;
|
|
81
|
+
} catch (e) {
|
|
82
|
+
if (!(e instanceof import_jsonwebtoken.JsonWebTokenError)) console.error(e, "errors");
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
74
87
|
function verifyUser(user, password) {
|
|
75
88
|
if (!user.password) return false;
|
|
76
89
|
return (0, import_bcryptjs.compare)(password, user.password);
|
|
@@ -80,6 +93,7 @@ function verifyUser(user, password) {
|
|
|
80
93
|
generateAccessToken,
|
|
81
94
|
generateRefreshToken,
|
|
82
95
|
getTokenizedResponse,
|
|
96
|
+
getUserIdFromAccessToken,
|
|
83
97
|
getUserIdFromRefreshToken,
|
|
84
98
|
verifyUser
|
|
85
99
|
});
|
|
@@ -8,6 +8,7 @@ declare function getTokenizedResponse(accessToken?: string, refreshToken?: strin
|
|
|
8
8
|
refreshToken: string | undefined;
|
|
9
9
|
}>;
|
|
10
10
|
declare function getUserIdFromRefreshToken(refreshKey: string, refreshToken?: string): number | null;
|
|
11
|
+
declare function getUserIdFromAccessToken(refreshToken?: string): number | null;
|
|
11
12
|
declare function verifyUser(user: UserOutput, password: string): false | Promise<boolean>;
|
|
12
13
|
|
|
13
|
-
export { generateAccessToken, generateRefreshToken, getTokenizedResponse, getUserIdFromRefreshToken, verifyUser };
|
|
14
|
+
export { generateAccessToken, generateRefreshToken, getTokenizedResponse, getUserIdFromAccessToken, getUserIdFromRefreshToken, verifyUser };
|
|
@@ -8,6 +8,7 @@ declare function getTokenizedResponse(accessToken?: string, refreshToken?: strin
|
|
|
8
8
|
refreshToken: string | undefined;
|
|
9
9
|
}>;
|
|
10
10
|
declare function getUserIdFromRefreshToken(refreshKey: string, refreshToken?: string): number | null;
|
|
11
|
+
declare function getUserIdFromAccessToken(refreshToken?: string): number | null;
|
|
11
12
|
declare function verifyUser(user: UserOutput, password: string): false | Promise<boolean>;
|
|
12
13
|
|
|
13
|
-
export { generateAccessToken, generateRefreshToken, getTokenizedResponse, getUserIdFromRefreshToken, verifyUser };
|
|
14
|
+
export { generateAccessToken, generateRefreshToken, getTokenizedResponse, getUserIdFromAccessToken, getUserIdFromRefreshToken, verifyUser };
|
|
@@ -43,6 +43,18 @@ function getUserIdFromRefreshToken(refreshKey, refreshToken) {
|
|
|
43
43
|
}
|
|
44
44
|
return null;
|
|
45
45
|
}
|
|
46
|
+
function getUserIdFromAccessToken(refreshToken) {
|
|
47
|
+
if (refreshToken && process.env.SIGNING_KEY)
|
|
48
|
+
try {
|
|
49
|
+
const decoded = verify(refreshToken, process.env.SIGNING_KEY);
|
|
50
|
+
if (typeof decoded !== "string" && typeof decoded.id === "number")
|
|
51
|
+
return decoded.id;
|
|
52
|
+
} catch (e) {
|
|
53
|
+
if (!(e instanceof JsonWebTokenError)) console.error(e, "errors");
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
46
58
|
function verifyUser(user, password) {
|
|
47
59
|
if (!user.password) return false;
|
|
48
60
|
return compare(password, user.password);
|
|
@@ -51,6 +63,7 @@ export {
|
|
|
51
63
|
generateAccessToken,
|
|
52
64
|
generateRefreshToken,
|
|
53
65
|
getTokenizedResponse,
|
|
66
|
+
getUserIdFromAccessToken,
|
|
54
67
|
getUserIdFromRefreshToken,
|
|
55
68
|
verifyUser
|
|
56
69
|
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/auth/google/get.ts
|
|
21
|
+
var get_exports = {};
|
|
22
|
+
__export(get_exports, {
|
|
23
|
+
getGoogleGetRoute: () => getGoogleGetRoute
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(get_exports);
|
|
26
|
+
var import_googleapis = require("googleapis");
|
|
27
|
+
var import_server2 = require("next/server");
|
|
28
|
+
var import_uuid = require("uuid");
|
|
29
|
+
|
|
30
|
+
// src/auth/email/token.ts
|
|
31
|
+
var import_bcryptjs = require("bcryptjs");
|
|
32
|
+
var import_jsonwebtoken = require("jsonwebtoken");
|
|
33
|
+
var import_server = require("next/server");
|
|
34
|
+
function generateRefreshToken(id, refreshKey) {
|
|
35
|
+
return (0, import_jsonwebtoken.sign)({ id }, refreshKey);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// src/auth/google/get.ts
|
|
39
|
+
var getGoogleGetRoute = ({
|
|
40
|
+
getUserIdFromEmail,
|
|
41
|
+
successRedirectURL,
|
|
42
|
+
errorRedirectURL,
|
|
43
|
+
authRoute,
|
|
44
|
+
clientId,
|
|
45
|
+
clientSecret,
|
|
46
|
+
refreshKey
|
|
47
|
+
}) => {
|
|
48
|
+
const oauth2Client = new import_googleapis.google.auth.OAuth2(
|
|
49
|
+
clientId,
|
|
50
|
+
clientSecret,
|
|
51
|
+
authRoute
|
|
52
|
+
);
|
|
53
|
+
return async (req) => {
|
|
54
|
+
const code = req.nextUrl.searchParams.get("code");
|
|
55
|
+
const error = req.nextUrl.searchParams.get("error");
|
|
56
|
+
if (!code && !error) {
|
|
57
|
+
const state2 = (0, import_uuid.v4)();
|
|
58
|
+
const authorizationUrl = oauth2Client.generateAuthUrl({
|
|
59
|
+
scope: [
|
|
60
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
61
|
+
"https://www.googleapis.com/auth/userinfo.email"
|
|
62
|
+
],
|
|
63
|
+
state: state2,
|
|
64
|
+
include_granted_scopes: true,
|
|
65
|
+
prompt: "consent",
|
|
66
|
+
redirect_uri: authRoute
|
|
67
|
+
});
|
|
68
|
+
const res = import_server2.NextResponse.redirect(authorizationUrl);
|
|
69
|
+
res.cookies.set("state", state2, {
|
|
70
|
+
httpOnly: true,
|
|
71
|
+
secure: true
|
|
72
|
+
});
|
|
73
|
+
return res;
|
|
74
|
+
}
|
|
75
|
+
if (error) {
|
|
76
|
+
return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
77
|
+
}
|
|
78
|
+
const state = req.nextUrl.searchParams.get("state") || void 0;
|
|
79
|
+
if (code && state) {
|
|
80
|
+
const localState = req.cookies.get("state")?.value;
|
|
81
|
+
if (localState !== state) return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
82
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
83
|
+
oauth2Client.setCredentials(tokens);
|
|
84
|
+
const userInfoRequest = await import_googleapis.google.oauth2({
|
|
85
|
+
auth: oauth2Client,
|
|
86
|
+
version: "v2"
|
|
87
|
+
}).userinfo.get();
|
|
88
|
+
const user = userInfoRequest.data;
|
|
89
|
+
if (user.email) {
|
|
90
|
+
const id = await getUserIdFromEmail(user);
|
|
91
|
+
const res = import_server2.NextResponse.redirect(successRedirectURL);
|
|
92
|
+
if (id) {
|
|
93
|
+
res.cookies.set("refresh", generateRefreshToken(id, refreshKey), {
|
|
94
|
+
httpOnly: true,
|
|
95
|
+
secure: true
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
res.cookies.set("state", "", {
|
|
99
|
+
httpOnly: true,
|
|
100
|
+
secure: true,
|
|
101
|
+
maxAge: 0
|
|
102
|
+
});
|
|
103
|
+
return res;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
110
|
+
0 && (module.exports = {
|
|
111
|
+
getGoogleGetRoute
|
|
112
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { InitGoogleAuthOptions } from './index.mjs';
|
|
3
|
+
import 'googleapis';
|
|
4
|
+
|
|
5
|
+
declare const getGoogleGetRoute: ({ getUserIdFromEmail, successRedirectURL, errorRedirectURL, authRoute, clientId, clientSecret, refreshKey, }: InitGoogleAuthOptions) => (req: NextRequest) => Promise<NextResponse<unknown>>;
|
|
6
|
+
|
|
7
|
+
export { getGoogleGetRoute };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { InitGoogleAuthOptions } from './index.js';
|
|
3
|
+
import 'googleapis';
|
|
4
|
+
|
|
5
|
+
declare const getGoogleGetRoute: ({ getUserIdFromEmail, successRedirectURL, errorRedirectURL, authRoute, clientId, clientSecret, refreshKey, }: InitGoogleAuthOptions) => (req: NextRequest) => Promise<NextResponse<unknown>>;
|
|
6
|
+
|
|
7
|
+
export { getGoogleGetRoute };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/auth/google/get.ts
|
|
2
|
+
import { google } from "googleapis";
|
|
3
|
+
import { NextResponse as NextResponse2 } from "next/server";
|
|
4
|
+
import { v4 } from "uuid";
|
|
5
|
+
|
|
6
|
+
// src/auth/email/token.ts
|
|
7
|
+
import { compare } from "bcryptjs";
|
|
8
|
+
import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
|
|
9
|
+
import { NextResponse } from "next/server";
|
|
10
|
+
function generateRefreshToken(id, refreshKey) {
|
|
11
|
+
return sign({ id }, refreshKey);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/auth/google/get.ts
|
|
15
|
+
var getGoogleGetRoute = ({
|
|
16
|
+
getUserIdFromEmail,
|
|
17
|
+
successRedirectURL,
|
|
18
|
+
errorRedirectURL,
|
|
19
|
+
authRoute,
|
|
20
|
+
clientId,
|
|
21
|
+
clientSecret,
|
|
22
|
+
refreshKey
|
|
23
|
+
}) => {
|
|
24
|
+
const oauth2Client = new google.auth.OAuth2(
|
|
25
|
+
clientId,
|
|
26
|
+
clientSecret,
|
|
27
|
+
authRoute
|
|
28
|
+
);
|
|
29
|
+
return async (req) => {
|
|
30
|
+
const code = req.nextUrl.searchParams.get("code");
|
|
31
|
+
const error = req.nextUrl.searchParams.get("error");
|
|
32
|
+
if (!code && !error) {
|
|
33
|
+
const state2 = v4();
|
|
34
|
+
const authorizationUrl = oauth2Client.generateAuthUrl({
|
|
35
|
+
scope: [
|
|
36
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
37
|
+
"https://www.googleapis.com/auth/userinfo.email"
|
|
38
|
+
],
|
|
39
|
+
state: state2,
|
|
40
|
+
include_granted_scopes: true,
|
|
41
|
+
prompt: "consent",
|
|
42
|
+
redirect_uri: authRoute
|
|
43
|
+
});
|
|
44
|
+
const res = NextResponse2.redirect(authorizationUrl);
|
|
45
|
+
res.cookies.set("state", state2, {
|
|
46
|
+
httpOnly: true,
|
|
47
|
+
secure: true
|
|
48
|
+
});
|
|
49
|
+
return res;
|
|
50
|
+
}
|
|
51
|
+
if (error) {
|
|
52
|
+
return NextResponse2.redirect(errorRedirectURL);
|
|
53
|
+
}
|
|
54
|
+
const state = req.nextUrl.searchParams.get("state") || void 0;
|
|
55
|
+
if (code && state) {
|
|
56
|
+
const localState = req.cookies.get("state")?.value;
|
|
57
|
+
if (localState !== state) return NextResponse2.redirect(errorRedirectURL);
|
|
58
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
59
|
+
oauth2Client.setCredentials(tokens);
|
|
60
|
+
const userInfoRequest = await google.oauth2({
|
|
61
|
+
auth: oauth2Client,
|
|
62
|
+
version: "v2"
|
|
63
|
+
}).userinfo.get();
|
|
64
|
+
const user = userInfoRequest.data;
|
|
65
|
+
if (user.email) {
|
|
66
|
+
const id = await getUserIdFromEmail(user);
|
|
67
|
+
const res = NextResponse2.redirect(successRedirectURL);
|
|
68
|
+
if (id) {
|
|
69
|
+
res.cookies.set("refresh", generateRefreshToken(id, refreshKey), {
|
|
70
|
+
httpOnly: true,
|
|
71
|
+
secure: true
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
res.cookies.set("state", "", {
|
|
75
|
+
httpOnly: true,
|
|
76
|
+
secure: true,
|
|
77
|
+
maxAge: 0
|
|
78
|
+
});
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return NextResponse2.redirect(errorRedirectURL);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export {
|
|
86
|
+
getGoogleGetRoute
|
|
87
|
+
};
|
|
@@ -23,7 +23,97 @@ __export(google_exports, {
|
|
|
23
23
|
initGoogleAuth: () => initGoogleAuth
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(google_exports);
|
|
26
|
-
|
|
26
|
+
|
|
27
|
+
// src/auth/google/get.ts
|
|
28
|
+
var import_googleapis = require("googleapis");
|
|
29
|
+
var import_server2 = require("next/server");
|
|
30
|
+
var import_uuid = require("uuid");
|
|
31
|
+
|
|
32
|
+
// src/auth/email/token.ts
|
|
33
|
+
var import_bcryptjs = require("bcryptjs");
|
|
34
|
+
var import_jsonwebtoken = require("jsonwebtoken");
|
|
35
|
+
var import_server = require("next/server");
|
|
36
|
+
function generateRefreshToken(id, refreshKey) {
|
|
37
|
+
return (0, import_jsonwebtoken.sign)({ id }, refreshKey);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/auth/google/get.ts
|
|
41
|
+
var getGoogleGetRoute = ({
|
|
42
|
+
getUserIdFromEmail,
|
|
43
|
+
successRedirectURL,
|
|
44
|
+
errorRedirectURL,
|
|
45
|
+
authRoute,
|
|
46
|
+
clientId,
|
|
47
|
+
clientSecret,
|
|
48
|
+
refreshKey
|
|
49
|
+
}) => {
|
|
50
|
+
const oauth2Client = new import_googleapis.google.auth.OAuth2(
|
|
51
|
+
clientId,
|
|
52
|
+
clientSecret,
|
|
53
|
+
authRoute
|
|
54
|
+
);
|
|
55
|
+
return async (req) => {
|
|
56
|
+
const code = req.nextUrl.searchParams.get("code");
|
|
57
|
+
const error = req.nextUrl.searchParams.get("error");
|
|
58
|
+
if (!code && !error) {
|
|
59
|
+
const state2 = (0, import_uuid.v4)();
|
|
60
|
+
const authorizationUrl = oauth2Client.generateAuthUrl({
|
|
61
|
+
scope: [
|
|
62
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
63
|
+
"https://www.googleapis.com/auth/userinfo.email"
|
|
64
|
+
],
|
|
65
|
+
state: state2,
|
|
66
|
+
include_granted_scopes: true,
|
|
67
|
+
prompt: "consent",
|
|
68
|
+
redirect_uri: authRoute
|
|
69
|
+
});
|
|
70
|
+
const res = import_server2.NextResponse.redirect(authorizationUrl);
|
|
71
|
+
res.cookies.set("state", state2, {
|
|
72
|
+
httpOnly: true,
|
|
73
|
+
secure: true
|
|
74
|
+
});
|
|
75
|
+
return res;
|
|
76
|
+
}
|
|
77
|
+
if (error) {
|
|
78
|
+
return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
79
|
+
}
|
|
80
|
+
const state = req.nextUrl.searchParams.get("state") || void 0;
|
|
81
|
+
if (code && state) {
|
|
82
|
+
const localState = req.cookies.get("state")?.value;
|
|
83
|
+
if (localState !== state) return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
84
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
85
|
+
oauth2Client.setCredentials(tokens);
|
|
86
|
+
const userInfoRequest = await import_googleapis.google.oauth2({
|
|
87
|
+
auth: oauth2Client,
|
|
88
|
+
version: "v2"
|
|
89
|
+
}).userinfo.get();
|
|
90
|
+
const user = userInfoRequest.data;
|
|
91
|
+
if (user.email) {
|
|
92
|
+
const id = await getUserIdFromEmail(user);
|
|
93
|
+
const res = import_server2.NextResponse.redirect(successRedirectURL);
|
|
94
|
+
if (id) {
|
|
95
|
+
res.cookies.set("refresh", generateRefreshToken(id, refreshKey), {
|
|
96
|
+
httpOnly: true,
|
|
97
|
+
secure: true
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
res.cookies.set("state", "", {
|
|
101
|
+
httpOnly: true,
|
|
102
|
+
secure: true,
|
|
103
|
+
maxAge: 0
|
|
104
|
+
});
|
|
105
|
+
return res;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return import_server2.NextResponse.redirect(errorRedirectURL);
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/auth/google/index.ts
|
|
113
|
+
function initGoogleAuth(props) {
|
|
114
|
+
return {
|
|
115
|
+
GET: getGoogleGetRoute(props)
|
|
116
|
+
};
|
|
27
117
|
}
|
|
28
118
|
// Annotate the CommonJS export names for ESM import in node:
|
|
29
119
|
0 && (module.exports = {
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { oauth2_v2 } from 'googleapis';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
type Schema$Userinfo = oauth2_v2.Schema$Userinfo;
|
|
5
|
+
interface InitGoogleAuthOptions {
|
|
6
|
+
getUserIdFromEmail: (email: Schema$Userinfo) => Promise<number | null>;
|
|
7
|
+
successRedirectURL: string;
|
|
8
|
+
errorRedirectURL: string;
|
|
9
|
+
authRoute: string;
|
|
10
|
+
clientId: string;
|
|
11
|
+
clientSecret: string;
|
|
12
|
+
refreshKey: string;
|
|
13
|
+
}
|
|
14
|
+
declare function initGoogleAuth(props: InitGoogleAuthOptions): {
|
|
15
|
+
GET: (req: next_server.NextRequest) => Promise<next_server.NextResponse<unknown>>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { type InitGoogleAuthOptions, initGoogleAuth };
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import * as next_server from 'next/server';
|
|
2
|
+
import { oauth2_v2 } from 'googleapis';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
type Schema$Userinfo = oauth2_v2.Schema$Userinfo;
|
|
5
|
+
interface InitGoogleAuthOptions {
|
|
6
|
+
getUserIdFromEmail: (email: Schema$Userinfo) => Promise<number | null>;
|
|
7
|
+
successRedirectURL: string;
|
|
8
|
+
errorRedirectURL: string;
|
|
9
|
+
authRoute: string;
|
|
10
|
+
clientId: string;
|
|
11
|
+
clientSecret: string;
|
|
12
|
+
refreshKey: string;
|
|
13
|
+
}
|
|
14
|
+
declare function initGoogleAuth(props: InitGoogleAuthOptions): {
|
|
15
|
+
GET: (req: next_server.NextRequest) => Promise<next_server.NextResponse<unknown>>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { type InitGoogleAuthOptions, initGoogleAuth };
|
|
@@ -1,5 +1,93 @@
|
|
|
1
|
+
// src/auth/google/get.ts
|
|
2
|
+
import { google } from "googleapis";
|
|
3
|
+
import { NextResponse as NextResponse2 } from "next/server";
|
|
4
|
+
import { v4 } from "uuid";
|
|
5
|
+
|
|
6
|
+
// src/auth/email/token.ts
|
|
7
|
+
import { compare } from "bcryptjs";
|
|
8
|
+
import { JsonWebTokenError, sign, verify } from "jsonwebtoken";
|
|
9
|
+
import { NextResponse } from "next/server";
|
|
10
|
+
function generateRefreshToken(id, refreshKey) {
|
|
11
|
+
return sign({ id }, refreshKey);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/auth/google/get.ts
|
|
15
|
+
var getGoogleGetRoute = ({
|
|
16
|
+
getUserIdFromEmail,
|
|
17
|
+
successRedirectURL,
|
|
18
|
+
errorRedirectURL,
|
|
19
|
+
authRoute,
|
|
20
|
+
clientId,
|
|
21
|
+
clientSecret,
|
|
22
|
+
refreshKey
|
|
23
|
+
}) => {
|
|
24
|
+
const oauth2Client = new google.auth.OAuth2(
|
|
25
|
+
clientId,
|
|
26
|
+
clientSecret,
|
|
27
|
+
authRoute
|
|
28
|
+
);
|
|
29
|
+
return async (req) => {
|
|
30
|
+
const code = req.nextUrl.searchParams.get("code");
|
|
31
|
+
const error = req.nextUrl.searchParams.get("error");
|
|
32
|
+
if (!code && !error) {
|
|
33
|
+
const state2 = v4();
|
|
34
|
+
const authorizationUrl = oauth2Client.generateAuthUrl({
|
|
35
|
+
scope: [
|
|
36
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
37
|
+
"https://www.googleapis.com/auth/userinfo.email"
|
|
38
|
+
],
|
|
39
|
+
state: state2,
|
|
40
|
+
include_granted_scopes: true,
|
|
41
|
+
prompt: "consent",
|
|
42
|
+
redirect_uri: authRoute
|
|
43
|
+
});
|
|
44
|
+
const res = NextResponse2.redirect(authorizationUrl);
|
|
45
|
+
res.cookies.set("state", state2, {
|
|
46
|
+
httpOnly: true,
|
|
47
|
+
secure: true
|
|
48
|
+
});
|
|
49
|
+
return res;
|
|
50
|
+
}
|
|
51
|
+
if (error) {
|
|
52
|
+
return NextResponse2.redirect(errorRedirectURL);
|
|
53
|
+
}
|
|
54
|
+
const state = req.nextUrl.searchParams.get("state") || void 0;
|
|
55
|
+
if (code && state) {
|
|
56
|
+
const localState = req.cookies.get("state")?.value;
|
|
57
|
+
if (localState !== state) return NextResponse2.redirect(errorRedirectURL);
|
|
58
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
59
|
+
oauth2Client.setCredentials(tokens);
|
|
60
|
+
const userInfoRequest = await google.oauth2({
|
|
61
|
+
auth: oauth2Client,
|
|
62
|
+
version: "v2"
|
|
63
|
+
}).userinfo.get();
|
|
64
|
+
const user = userInfoRequest.data;
|
|
65
|
+
if (user.email) {
|
|
66
|
+
const id = await getUserIdFromEmail(user);
|
|
67
|
+
const res = NextResponse2.redirect(successRedirectURL);
|
|
68
|
+
if (id) {
|
|
69
|
+
res.cookies.set("refresh", generateRefreshToken(id, refreshKey), {
|
|
70
|
+
httpOnly: true,
|
|
71
|
+
secure: true
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
res.cookies.set("state", "", {
|
|
75
|
+
httpOnly: true,
|
|
76
|
+
secure: true,
|
|
77
|
+
maxAge: 0
|
|
78
|
+
});
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return NextResponse2.redirect(errorRedirectURL);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
1
86
|
// src/auth/google/index.ts
|
|
2
|
-
function initGoogleAuth() {
|
|
87
|
+
function initGoogleAuth(props) {
|
|
88
|
+
return {
|
|
89
|
+
GET: getGoogleGetRoute(props)
|
|
90
|
+
};
|
|
3
91
|
}
|
|
4
92
|
export {
|
|
5
93
|
initGoogleAuth
|