84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
import { z } from "zod";
|
|
import moment from "moment";
|
|
import { prisma } from "#lib/server/prisma.js";
|
|
import { encodeToken } from "../../../lib/auth/token.js";
|
|
import { validatePassword } from "../../../lib/password.js";
|
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
|
import { TokenType } from "#lib/auth/types.js";
|
|
import { IDWithPrefix } from "#components/Ausweis/types.js";
|
|
|
|
|
|
export const GET = defineApiRoute({
|
|
meta: {
|
|
description:
|
|
"Erstellt sowohl einen neuen Refresh Token als auch einen Access Token für den gegebenen Benutzer. Der Refresh Token kann später für die Erstellung neuer Access Token genutzt werden.",
|
|
tags: ["Benutzer"],
|
|
summary: "Refresh Token anfragen.",
|
|
},
|
|
input: z.object({
|
|
email: z.string().email(),
|
|
passwort: z.string().min(8).max(100),
|
|
}),
|
|
output: z.object({
|
|
id: IDWithPrefix,
|
|
accessToken: z.string(),
|
|
refreshToken: z.string(),
|
|
refreshTokenBase64: z.string(),
|
|
accessTokenBase64: z.string(),
|
|
exp: z.number(),
|
|
}),
|
|
async fetch(input, ctx) {
|
|
// Falls der Nutzer nicht existiert, wird eine Fehlermeldung zurückgegeben.
|
|
const user = await prisma.benutzer.findUnique({
|
|
where: {
|
|
email: input.email.toLowerCase(),
|
|
},
|
|
});
|
|
|
|
if (!user) {
|
|
throw new APIError({
|
|
code: "BAD_REQUEST",
|
|
message: "Benutzer konnte nicht gefunden werden.",
|
|
});
|
|
}
|
|
|
|
// Falls das Passwort nicht stimmt, wird eine Fehlermeldung zurückgegeben.
|
|
if (!validatePassword(user.passwort, input.passwort)) {
|
|
throw new APIError({
|
|
code: "BAD_REQUEST",
|
|
message: "Benutzer konnte nicht gefunden werden.",
|
|
});
|
|
}
|
|
|
|
const refreshTokenExpiry = moment().add(30, "days");
|
|
const accessToken = encodeToken({
|
|
id: user.id,
|
|
typ: TokenType.Access,
|
|
exp: moment().add(30, "minutes").valueOf(),
|
|
});
|
|
const refreshToken = encodeToken({
|
|
id: user.id,
|
|
typ: TokenType.Refresh,
|
|
exp: refreshTokenExpiry.valueOf(),
|
|
});
|
|
|
|
const { id } = await prisma.refreshTokens.create({
|
|
data: {
|
|
token: refreshToken,
|
|
benutzer_id: user.id,
|
|
ip: "",
|
|
expiry: refreshTokenExpiry.toDate(),
|
|
},
|
|
});
|
|
|
|
return {
|
|
id: user.id,
|
|
accessToken,
|
|
refreshToken,
|
|
refreshTokenBase64: Buffer.from(refreshToken).toString("base64"),
|
|
accessTokenBase64: Buffer.from(accessToken).toString("base64"),
|
|
exp: refreshTokenExpiry.valueOf(),
|
|
};
|
|
},
|
|
});
|