Skip to content

Commit faa8136

Browse files
committed
feat: different signing keys
1 parent 42bf9fa commit faa8136

File tree

9 files changed

+42
-27
lines changed

9 files changed

+42
-27
lines changed

.env

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ACCESS_TOKEN_PUBLIC_KEY="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZU1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTUFEQ0JpQUtCZ0hOZEYvNFFVNU1NRmF2eW9veWVpT0VqdldXbgpvREJyemJpVzY5dnAzS1NueEF4T2NVMDlmODlUd0JWTWRsN2JUMzEzN0tMWEl6UE95OEl4TTExKzcwVmlubjgzCjUvMWVlaDhZTHBRM25KaWJZeVBqdzRjLy9GYzJoZGhENlJvM29hU25adWNteStqZUdTUFMxY0JnbThVOUR3OVAKakY0eE82UjU4RkorYXJBSkFnTUJBQUU9Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ"
2+
3+
ACCESS_TOKEN_PRIVATE_KEY="LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlDV3dJQkFBS0JnSE5kRi80UVU1TU1GYXZ5b295ZWlPRWp2V1dub0RCcnpiaVc2OXZwM0tTbnhBeE9jVTA5CmY4OVR3QlZNZGw3YlQzMTM3S0xYSXpQT3k4SXhNMTErNzBWaW5uODM1LzFlZWg4WUxwUTNuSmliWXlQanc0Yy8KL0ZjMmhkaEQ2Um8zb2FTblp1Y215K2plR1NQUzFjQmdtOFU5RHc5UGpGNHhPNlI1OEZKK2FyQUpBZ01CQUFFQwpnWUJWZ3RHLzd0WWtEemNaSjFhNXFPR0pFSGJaSFBFdU14cGdFdTV0S2VIMDRxMzgrVUFlb3RGVUdwNHNxMnFxClVTR1F2UTNZZm1PSGlXZWJYK0RWRXJ2RHlwcDA4alQ3VlMvQlpQbkRNYzVrSldRZTROWmRvZVAxOXlSblpnb3UKbFhiNXhZTklqVW5UeXNhVG5SYW9Sd0JOYjVub0NmbGZham5nMFdHZng4czRBUUpCQU5vTG1iYjVKdnZabWhJVgpPajEySGtGOU96RDhwN0ZBWUdicnovNEVybGVnR0J1enc4dkowakYyR1R0WTgvT3duaVQ1b1pndWpTOFFNTW1XCldNendtSWtDUVFDSGNkdFVUQ2lvWE9JTE54cXk0ZmhGVFZBa0ZVbGFyamlWYmt6UGlIZ2xLT0I0bmdRZmluZWQKcGJ6TXM0WTJJVUErRDlnckcwZy9MWEx2Rk94ZnhIdUJBa0VBaXlyZVNFZUwxekVTd2pua096ZzVwV2p0cjUyQwoxb0lWUlh0Ni9GRTJpVno0Smk0OWFNTitzZTBEdTdwUnNoYm5TUWcvV0dkVjIxVUZIcFVrUm1IRnFRSkFORjYxCnEzWjNFZ0kzOUpZdDRKUzI1alRxazhrWFA5UzFWREg5eVJDL1E3NzJiQ3pNODFVYXd2M2VibGZMd1FwQ1NMemYKbkd0RUdBbCtzeXFuNnErU0FRSkFERDZOVDV1TFM0WTRWWHVQT0lDWU9rTlg2RkxVbmYrTWRVb3ByZnNDdTU0Qgo1OFNBZUh0c0pmZ3hBS3BBaVA0UmNTT0l2UlE4UHZxak10RVA3d2xQVHc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ"
4+
5+
REFRESH_PRIVATE_KEY="LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlDWEFJQkFBS0JnUUN1TEhDcGZYWkNONWpteUtjdFlmNXlja2lBbjF5bkJod0RGZG9rRGp1SDFsZlVKR0g5ClZIVDdKOTJuNzJFemNhMzJ5TVNVcGU0RXlzL2pDRkZILytUYWJJbTIzRzRLQnBHWDRzNVJyNHozZFVpSVB6OUkKdmNRSWNvQ2I0SHM0TVByaTVJdC9NR3FqOVJhTThJSzFmemZTaGFxVlNPVHI0d2JCbmV2YTdwdlhMd0lEQVFBQgpBb0dBQWx0NW51R2kweHliaGl3YkR5TXZaVzhraWhFZUdPaWRRbkZ1UldTbjY1dThEcFA3ZTRsRUdBNGZFdUhMCmgvMjI1QXN0bGZGMCtqMmdlS3NwSm5kUktwblJwZWhMaGk4YVRNLzRGT093VXJFOGlGYWFtT0lYcmhsVERVclgKMTUzY3B3bUNtYktKU2trSklIOW14bUhyWVJRdlRmYVFtY0xaL1VLNGQ1UVNhZUVDUVFEL1pUbmpmOUVkbE4vQwpOelBNWDQvMExsc0JtUjFFNHIvTUc4akxOZlNTOEJxMlZpbklLWS9abzVKK3ZqcjQ2YVlEUzZTazE2UTlMT2NjClA3RURwZXh4QWtFQXJwWDkvN3VUcEhJMW1LOGN6SnF0dzdUL0JmY2hLL0pCdU5KUjBJcXY3c2F5eHJObDBab0YKM3dLTnhmYkNla0NjQ2pKemE1d01vK2NZN2tVSzRYQk5ud0pCQU9LenVpVUZTbHlWeitHWUdyU3BoeURiSFJGWQpGckVWRGVkaUttU25xa2ZjTmZud2xmb0ZXcGw0Snd1MlZLYXEwQ0JRdnY5TUk0L2lFZXZ6WlcrMWt5RUNRRzVJCkJSaGpydEd6NnpNMWVtV3NWNU5HWThtcTMrTll0amMvYzdyZHdHQitWek80NHRwU0J0OW1SNVFEV2JuTDBrV0cKdE80R3R0MVovNStUTVZwU2pGVUNRRE5HeDBhcnFSUEhJWjZ3UFlpVXBuQkN5dU90dTExT2hYeE8xWFdIR21aaAo4d254YVk3UklZNWJ6NllzenZ2bHR4MU93YWw4a2svN3N5NjNpZGhmYmhFPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ"
6+
7+
REFRESH_PUBLIC_KEY="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDdUxIQ3BmWFpDTjVqbXlLY3RZZjV5Y2tpQQpuMXluQmh3REZkb2tEanVIMWxmVUpHSDlWSFQ3SjkybjcyRXpjYTMyeU1TVXBlNEV5cy9qQ0ZGSC8rVGFiSW0yCjNHNEtCcEdYNHM1UnI0ejNkVWlJUHo5SXZjUUljb0NiNEhzNE1Qcmk1SXQvTUdxajlSYU04SUsxZnpmU2hhcVYKU09UcjR3YkJuZXZhN3B2WEx3SURBUUFCCi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQ"

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
node_modules
22
.DS_Store
3-
build
4-
.env
3+
build
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
export default {
2-
privateKey: "PRIVATE_KEY",
3-
publicKey: "PUBLIC_KEY",
4-
useDatabase: "USE_DATABASE",
2+
accessTokenPrivateKey: "ACCESS_TOKEN_PRIVATE_KEY",
3+
accessTokenPublicKey: "ACCESS_TOKEN_PUBLIC_KEY",
4+
refreshTokenPrivateKey: "REFRESH_PRIVATE_KEY",
5+
refreshTokenPublicKey: "REFRESH_PUBLIC_KEY",
56
dbUri: "DB_CONNECTION",
7+
port: "PORT",
68
};

config/default.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ export default {
44
saltWorkFactor: 10,
55
accessTokenTtl: "15m",
66
refreshTokenTtl: "1y",
7-
publicKey: ``,
8-
privateKey: ``,
9-
useDatabase: false,
7+
accessTokenPrivateKey: ``,
8+
accessTokenPublicKey: ``,
9+
refreshTokenPrivateKey: ``,
10+
refreshTokenPublicKey: ``,
1011
};

src/app.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ import swaggerDocs from "./utils/swagger";
1212

1313
const port = config.get<number>("port");
1414

15-
console.log(config.get("privateKey"));
16-
17-
console.log("useDatabase", typeof config.get("useDatabase"));
18-
1915
const app = express();
2016

2117
app.use(express.json());

src/controller/session.controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ export async function createUserSessionHandler(req: Request, res: Response) {
2323

2424
const accessToken = signJwt(
2525
{ ...user, session: session._id },
26-
{ expiresIn: config.get("accessTokenTtl") } // 15 minutes
26+
"accessTokenPrivateKey",
27+
{ expiresIn: config.get("accessTokenTtl") } // 15 minutes,
2728
);
2829

2930
// create a refresh token
3031
const refreshToken = signJwt(
3132
{ ...user, session: session._id },
33+
"refreshTokenPrivateKey",
3234
{ expiresIn: config.get("refreshTokenTtl") } // 15 minutes
3335
);
3436

src/middleware/deserializeUser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const deserializeUser = async (
1919
return next();
2020
}
2121

22-
const { decoded, expired } = verifyJwt(accessToken);
22+
const { decoded, expired } = verifyJwt(accessToken, "accessTokenPublicKey");
2323

2424
if (decoded) {
2525
res.locals.user = decoded;
@@ -33,7 +33,7 @@ const deserializeUser = async (
3333
res.setHeader("x-access-token", newAccessToken);
3434
}
3535

36-
const result = verifyJwt(newAccessToken as string);
36+
const result = verifyJwt(newAccessToken as string, "accessTokenPublicKey");
3737

3838
res.locals.user = result.decoded;
3939
return next();

src/service/session.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export async function reIssueAccessToken({
2727
}: {
2828
refreshToken: string;
2929
}) {
30-
const { decoded } = verifyJwt(refreshToken);
30+
const { decoded } = verifyJwt(refreshToken, "refreshTokenPublicKey");
3131

3232
if (!decoded || !get(decoded, "session")) return false;
3333

@@ -41,6 +41,7 @@ export async function reIssueAccessToken({
4141

4242
const accessToken = signJwt(
4343
{ ...user, session: session._id },
44+
"accessTokenPrivateKey",
4445
{ expiresIn: config.get("accessTokenTtl") } // 15 minutes
4546
);
4647

src/utils/jwt.utils.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11
import jwt from "jsonwebtoken";
22
import config from "config";
33

4-
const privateKey = Buffer.from(
5-
config.get<string>("privateKey"),
6-
"base64"
7-
).toString("ascii");
8-
const publicKey = Buffer.from(
9-
config.get<string>("publicKey"),
10-
"base64"
11-
).toString("ascii");
4+
export function signJwt(
5+
object: Object,
6+
keyName: "accessTokenPrivateKey" | "refreshTokenPrivateKey",
7+
options?: jwt.SignOptions | undefined
8+
) {
9+
const signingKey = Buffer.from(
10+
config.get<string>(keyName),
11+
"base64"
12+
).toString("ascii");
1213

13-
export function signJwt(object: Object, options?: jwt.SignOptions | undefined) {
14-
return jwt.sign(object, privateKey, {
14+
return jwt.sign(object, signingKey, {
1515
...(options && options),
1616
algorithm: "RS256",
1717
});
1818
}
1919

20-
export function verifyJwt(token: string) {
20+
export function verifyJwt(
21+
token: string,
22+
keyName: "accessTokenPublicKey" | "refreshTokenPublicKey"
23+
) {
24+
const publicKey = Buffer.from(config.get<string>(keyName), "base64").toString(
25+
"ascii"
26+
);
27+
2128
try {
2229
const decoded = jwt.verify(token, publicKey);
2330
return {

0 commit comments

Comments
 (0)