Feat: Add user login / logout
This commit is contained in:
parent
40c451b2c0
commit
ac3cf943f2
32 changed files with 7315 additions and 0 deletions
13
app/lib/db.ts
Normal file
13
app/lib/db.ts
Normal 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
37
app/lib/jwt.ts
Normal 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
33
app/lib/utils.ts
Normal 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 "";
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue