+16









Carina Wollendorfer
GitHub
Alex van Andel
sajanlamsal
CarinaWolli
alannnc
Leo Giovanetti
Peer Richelsen
Hariom Balhara
Udit Takkar
Nitin Panghal
Omar López
Peer Richelsen
Shivam Kalra
Richard Poelderl
Crowdin Bot
Joe Au-Yeung
Nafees Nazik
Chiranjeev Vishnoi
Denzil Samuel
Syed Ali Shahbaz
nitinpanghal
Ahmad
Annlee Fores
Keith Williams
Vijay
68bd877c5b
Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: sajanlamsal <saznlamsal@gmail.com> Co-authored-by: CarinaWolli <wollencarina@gmail.com> Co-authored-by: alannnc <alannnc@gmail.com> Co-authored-by: Leo Giovanetti <hello@leog.me> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Nitin Panghal <nitin.panghal@unthinkable.co> Co-authored-by: Omar López <zomars@me.com> Co-authored-by: Peer Richelsen <peer@cal.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Shivam Kalra <shivamkalra98@gmail.com> Co-authored-by: Richard Poelderl <richard.poelderl@gmail.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: Nafees Nazik <84864519+G3root@users.noreply.github.com> Co-authored-by: Chiranjeev Vishnoi <66114276+Chiranjeev-droid@users.noreply.github.com> Co-authored-by: Denzil Samuel <71846487+samueldenzil@users.noreply.github.com> Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com> Co-authored-by: nitinpanghal <43965732+nitinpanghal@users.noreply.github.com> Co-authored-by: Ahmad <57593864+Ahmadkashif@users.noreply.github.com> Co-authored-by: Annlee Fores <annleefores@gmail.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Vijay <vijayraghav22@gmail.com>
105 lines
2.4 KiB
TypeScript
105 lines
2.4 KiB
TypeScript
import jwt from "jsonwebtoken";
|
|
import type { NextApiRequest, NextApiResponse } from "next";
|
|
|
|
import prisma from "@calcom/prisma";
|
|
import { generateSecret } from "@calcom/trpc/server/routers/viewer/oAuth/addClient.handler";
|
|
|
|
export type OAuthTokenPayload = {
|
|
userId?: number | null;
|
|
teamId?: number | null;
|
|
token_type: string;
|
|
scope: string[];
|
|
clientId: string;
|
|
};
|
|
|
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
if (req.method !== "POST") {
|
|
res.status(405).json({ message: "Invalid method" });
|
|
return;
|
|
}
|
|
|
|
const { code, client_id, client_secret, grant_type, redirect_uri } = req.body;
|
|
|
|
if (grant_type !== "authorization_code") {
|
|
res.status(400).json({ message: "grant_type invalid" });
|
|
return;
|
|
}
|
|
|
|
const [hashedSecret] = generateSecret(client_secret);
|
|
|
|
const client = await prisma.oAuthClient.findFirst({
|
|
where: {
|
|
clientId: client_id,
|
|
clientSecret: hashedSecret,
|
|
},
|
|
select: {
|
|
redirectUri: true,
|
|
},
|
|
});
|
|
|
|
if (!client || client.redirectUri !== redirect_uri) {
|
|
res.status(401).json({ message: "Unauthorized" });
|
|
return;
|
|
}
|
|
|
|
const accessCode = await prisma.accessCode.findFirst({
|
|
where: {
|
|
code: code,
|
|
clientId: client_id,
|
|
expiresAt: {
|
|
gt: new Date(),
|
|
},
|
|
},
|
|
});
|
|
|
|
//delete all expired accessCodes + the one that is used here
|
|
await prisma.accessCode.deleteMany({
|
|
where: {
|
|
OR: [
|
|
{
|
|
expiresAt: {
|
|
lt: new Date(),
|
|
},
|
|
},
|
|
{
|
|
code: code,
|
|
clientId: client_id,
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
if (!accessCode) {
|
|
res.status(401).json({ message: "Unauthorized" });
|
|
return;
|
|
}
|
|
|
|
const secretKey = process.env.CALENDSO_ENCRYPTION_KEY || "";
|
|
|
|
const payloadAuthToken: OAuthTokenPayload = {
|
|
userId: accessCode.userId,
|
|
teamId: accessCode.teamId,
|
|
scope: accessCode.scopes,
|
|
token_type: "Access Token",
|
|
clientId: client_id,
|
|
};
|
|
|
|
const payloadRefreshToken: OAuthTokenPayload = {
|
|
userId: accessCode.userId,
|
|
teamId: accessCode.teamId,
|
|
scope: accessCode.scopes,
|
|
token_type: "Refresh Token",
|
|
clientId: client_id,
|
|
};
|
|
|
|
const access_token = jwt.sign(payloadAuthToken, secretKey, {
|
|
expiresIn: 1800, // 30 min
|
|
});
|
|
|
|
const refresh_token = jwt.sign(payloadRefreshToken, secretKey, {
|
|
expiresIn: 30 * 24 * 60 * 60, // 30 days
|
|
});
|
|
|
|
res.status(200).json({ access_token, refresh_token });
|
|
}
|