feat authentification
This commit is contained in:
parent
6372a97d05
commit
53883f9e04
|
@ -9,10 +9,12 @@
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^6.6.0",
|
"@prisma/client": "^6.6.0",
|
||||||
|
"bcryptjs": "^3.0.2",
|
||||||
"next": "15.3.0",
|
"next": "15.3.0",
|
||||||
"prisma": "^6.6.0",
|
"prisma": "^6.6.0",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0"
|
"react-dom": "^19.0.0",
|
||||||
|
"slugify": "^1.6.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
|
@ -2461,6 +2463,15 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/bcryptjs": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
|
||||||
|
"integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"bin": {
|
||||||
|
"bcrypt": "bin/bcrypt"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
@ -5787,6 +5798,15 @@
|
||||||
"is-arrayish": "^0.3.1"
|
"is-arrayish": "^0.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/slugify": {
|
||||||
|
"version": "1.6.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
|
||||||
|
"integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/source-map-js": {
|
"node_modules/source-map-js": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||||
|
|
|
@ -6,14 +6,17 @@
|
||||||
"dev": "next dev --turbopack",
|
"dev": "next dev --turbopack",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint"
|
"lint": "next lint",
|
||||||
|
"start:migrate:prod" : "npx prisma migrate deploy && npm run start"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^6.6.0",
|
"@prisma/client": "^6.6.0",
|
||||||
|
"bcryptjs": "^3.0.2",
|
||||||
"next": "15.3.0",
|
"next": "15.3.0",
|
||||||
"prisma": "^6.6.0",
|
"prisma": "^6.6.0",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0"
|
"react-dom": "^19.0.0",
|
||||||
|
"slugify": "^1.6.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
"use server"
|
||||||
|
|
||||||
|
import prisma from "@/lib/db";
|
||||||
|
import bcrypt from "bcryptjs";
|
||||||
|
import { cookies } from "next/headers";
|
||||||
|
import slugify from "slugify";
|
||||||
|
|
||||||
|
export async function register(formData : FormData){
|
||||||
|
//Permet de récupérer les données demandées à l'utilisateur lors de l'inscription
|
||||||
|
const {email,password,passwordRepeat} = Object.fromEntries(formData)
|
||||||
|
|
||||||
|
if(password !== passwordRepeat){
|
||||||
|
throw new Error("Le passwords ne correspond pas")
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
|
||||||
|
//Vérification du mail
|
||||||
|
const verifUser = await prisma.utilisateur.findFirst({
|
||||||
|
where : {
|
||||||
|
ut_mail : email.toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(verifUser){
|
||||||
|
throw new Error("Utilisateur déjà inscrit")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//slugify de l'email
|
||||||
|
const slug = slugify(email.toString().substring(0,email.toString().indexOf("@")),{lower:true,strict:true})
|
||||||
|
|
||||||
|
//hash du mdp
|
||||||
|
const salt = await bcrypt.genSalt(10)
|
||||||
|
const hashedPassword = await bcrypt.hash(password.toString(),salt)
|
||||||
|
|
||||||
|
//creation de l'utilisateur
|
||||||
|
const result = await prisma.utilisateur.create({
|
||||||
|
data :{
|
||||||
|
ut_mail : email.toString(),
|
||||||
|
ut_mdp : hashedPassword.toString(),
|
||||||
|
ut_slug : slug
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if(result){
|
||||||
|
return {success: true}
|
||||||
|
}
|
||||||
|
throw new Error("Anomalie lors de la création du user")
|
||||||
|
|
||||||
|
}catch(err){
|
||||||
|
const error = err as Error
|
||||||
|
throw new Error(error.message || "une erreur à été rencontrée lors de la création de l'utilisateur")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function login(formData : FormData){
|
||||||
|
const {email,password} = Object.fromEntries(formData)
|
||||||
|
|
||||||
|
try{
|
||||||
|
//vérification si l'utilisateur est trouvé
|
||||||
|
const user = await prisma.utilisateur.findFirst({
|
||||||
|
where : {
|
||||||
|
ut_mail : email.toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(!user){
|
||||||
|
throw new Error("Invalide crédential")
|
||||||
|
}
|
||||||
|
//vérification du mdp
|
||||||
|
const isPasswordValid = await bcrypt.compare(password.toString(), user.ut_mdp)
|
||||||
|
if(!isPasswordValid){
|
||||||
|
throw new Error("Invalide crédential")
|
||||||
|
}
|
||||||
|
|
||||||
|
//vérification si une session de connexion existe
|
||||||
|
const existingSession = await prisma.session.findFirst({
|
||||||
|
where : {
|
||||||
|
se_ut_id : user.ut_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//vérification si la session existe mais expiré
|
||||||
|
// delete de l'enreg pour le recréer
|
||||||
|
let verifDeleteSession = false
|
||||||
|
if(existingSession && new Date() > existingSession.expireAt ){
|
||||||
|
const deleteSession = await prisma.session.delete({
|
||||||
|
where : {
|
||||||
|
se_id : existingSession.se_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(deleteSession){
|
||||||
|
verifDeleteSession = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//vérification si une session de connexion existe et tjr actif
|
||||||
|
// on regenere le cookie ensuite
|
||||||
|
let verifValiditeSession = false
|
||||||
|
if(existingSession && new Date() < existingSession.expireAt){
|
||||||
|
verifValiditeSession = true
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessionidCreate = ""
|
||||||
|
if(!existingSession || verifDeleteSession){
|
||||||
|
const createSession = await prisma.session.create({
|
||||||
|
data : {
|
||||||
|
se_ut_id : user.ut_id,
|
||||||
|
expireAt : new Date(Date.now() + 7*24*60*60*1000)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(createSession){
|
||||||
|
sessionidCreate = createSession.se_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const cookieStore = await cookies()
|
||||||
|
|
||||||
|
if(sessionidCreate !== ""){
|
||||||
|
cookieStore.set("sessionId",sessionidCreate,{
|
||||||
|
httpOnly : true,
|
||||||
|
secure: process.env.NODE_ENV ==="production",
|
||||||
|
path:"/",
|
||||||
|
maxAge: 24*60*60,
|
||||||
|
sameSite: "lax"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if(verifValiditeSession && existingSession?.se_id){
|
||||||
|
cookieStore.set("sessionId",existingSession?.se_id,{
|
||||||
|
httpOnly : true,
|
||||||
|
secure: process.env.NODE_ENV ==="production",
|
||||||
|
path:"/",
|
||||||
|
maxAge: 24*60*60,
|
||||||
|
sameSite: "lax"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return {success : true}
|
||||||
|
}catch(err){
|
||||||
|
const error = err as Error
|
||||||
|
throw new Error(error.message || "une erreur à été rencontrée lors de la connexion de l'utilisateur")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function verifSession(){
|
||||||
|
try{
|
||||||
|
const cookie = await cookies()
|
||||||
|
const verif = cookie.get("sessionId")
|
||||||
|
if(verif){
|
||||||
|
const verifExpireSession = await prisma.session.findUnique({
|
||||||
|
where : {
|
||||||
|
se_id : verif.value
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(verifExpireSession && new Date() > verifExpireSession.expireAt){
|
||||||
|
await prisma.session.delete({
|
||||||
|
where : {
|
||||||
|
se_id : verifExpireSession.se_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return {success : false}
|
||||||
|
}else{
|
||||||
|
cookie.set("sessionId",verif.value,{
|
||||||
|
httpOnly : true,
|
||||||
|
secure: process.env.NODE_ENV ==="production",
|
||||||
|
path:"/",
|
||||||
|
maxAge: 24*60*60,
|
||||||
|
sameSite: "lax"
|
||||||
|
})
|
||||||
|
return {success : true}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {success : false}
|
||||||
|
|
||||||
|
}catch(err){
|
||||||
|
const error = err as Error
|
||||||
|
throw new Error(error.message || "une erreur à été rencontrée lors de la vérification de la session")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
import prisma from "@/lib/db";
|
||||||
|
|
||||||
|
export async function getInfoUser(slug : string){
|
||||||
|
try{
|
||||||
|
const user = await prisma.utilisateur.findFirst({
|
||||||
|
where : {
|
||||||
|
ut_slug : slug
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(user){
|
||||||
|
return {success : true, user}
|
||||||
|
}
|
||||||
|
return {success : false, message : "Impossible de trouver les infos de l'utilisateur"}
|
||||||
|
}catch(err){
|
||||||
|
const error = err as Error
|
||||||
|
throw new Error(error.message || "une erreur à été rencontrée lors de la recherche de l'utilisateur")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteUser(slug : string){
|
||||||
|
try{
|
||||||
|
|
||||||
|
const user = await prisma.utilisateur.findFirst({
|
||||||
|
where : {
|
||||||
|
ut_slug : slug
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if(user){
|
||||||
|
await prisma.utilisateur.delete({
|
||||||
|
where : {
|
||||||
|
ut_id : user.ut_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return {success : true}
|
||||||
|
}
|
||||||
|
return {success : false, message : "Impossible de supprimer l'utilisateur"}
|
||||||
|
}catch(err){
|
||||||
|
const error = err as Error
|
||||||
|
throw new Error(error.message || "une erreur à été rencontrée lors suppression de l'utilisateur")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue