Feat: Add user login / logout

This commit is contained in:
globuzma 2024-11-19 00:03:05 +01:00
parent 40c451b2c0
commit ac3cf943f2
32 changed files with 7315 additions and 0 deletions

13
app/lib/db.ts Normal file
View file

@ -0,0 +1,13 @@
import { PrismaClient } from '@prisma/client'
const prismaClientSingleton = () => {
return new PrismaClient()
}
declare global { }
declare const globalThis: {
prismaGlobal: ReturnType<typeof prismaClientSingleton>;
} & typeof global;
export const db = globalThis.prismaGlobal ?? prismaClientSingleton() // Creating a new instance of PrismaClient.

37
app/lib/jwt.ts Normal file
View file

@ -0,0 +1,37 @@
import { Buffer } from "buffer"
import { createHmac } from "crypto"
const decode = (str: string):string => Buffer.from(str, 'base64').toString('binary');
const encode = (str: string):string => Buffer.from(str, 'binary').toString('base64');
const secret = process.env.JWT_SECRET ? process.env.JWT_SECRET : ""
interface tokenData {
// eslint-disable-next-line
data: any,
maxAge: number
}
export function createToken({data, maxAge}: tokenData) {
const tokenData = data
tokenData.maxAge = maxAge
const header = encode(JSON.stringify({"alg":"HS256", "typ":"jwt"}))
const body = encode(JSON.stringify(tokenData))
const signature = createHmac('sha256',secret).update(header + "." + body).digest('hex')
return header + "." + body + "." + signature
}
export function validateToken(token: string) {
const rawData = token.split(".")
const header = rawData[0]
const body = rawData[1]
const signature = rawData[2]
const calculatedSignature = createHmac('sha256',secret).update(header + "." + body).digest('hex')
return signature == calculatedSignature
}
export function decryptToken(token: string) {
const rawData = token.split(".")
const body = rawData[1]
return JSON.parse(decode(body))
}

33
app/lib/utils.ts Normal file
View file

@ -0,0 +1,33 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
export function setCookie(cname: string, cvalue:string, exdays: number) {
if (typeof window !== "undefined") {
const d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
const expires = "expires="+ d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
}
export function getCookie(cname: string) {
if (typeof window !== "undefined") {
const name = cname + "=";
const decodedCookie = decodeURIComponent(document.cookie);
const ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
}