This commit is contained in:
Rahul 2024-02-29 09:33:34 +01:00
parent 501d8a8d8e
commit 3226975910
76 changed files with 48623 additions and 3401 deletions

111
utils/auth.js Normal file
View file

@ -0,0 +1,111 @@
// utils/auth.js
import bcrypt from "bcryptjs"
import { jwtVerify, SignJWT } from "jose"
const secret = new TextEncoder().encode("Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP")
///
async function generateToken(payload, expiresIn) {
const algo = "HS256"
const t = await new SignJWT(payload)
.setProtectedHeader({ alg: algo })
.setIssuedAt()
.setExpirationTime(expiresIn)
.sign(secret)
console.log(t)
return t
}
// Function to create both access and refresh tokens
export async function createTokens(userId) {
const accessTokenPayload = {
userId: userId,
// exp: Math.floor(Date.now() / 1000) + (15 * 60), // Access token expires in 15 minutes
// iss: 'your_issuer_here', // Replace with your actual issuer
// aud: 'your_audience_here', // Replace with your actual audience
purpose: "access", // Indicate the purpose of this token
}
const refreshTokenPayload = {
userId: userId,
// exp: Math.floor(Date.now() / 1000) + (7 * 24 * 60 * 60), // Refresh token expires in 7 days
// iss: 'your_issuer_here', // Replace with your actual issuer
// aud: 'your_audience_here', // Replace with your actual audience
purpose: "refresh", // Indicate the purpose of this token
}
const accessToken = await generateToken(accessTokenPayload, "15m") // 15 minutes expiry
const refreshToken = await generateToken(refreshTokenPayload, "2d") // 2 days expiry
return { accessToken, refreshToken }
}
///
export const hashPassword = async (password) => {
const salt = await bcrypt.genSalt(10)
return bcrypt.hash(password, salt)
}
export const verifyPassword = async (password, hashedPassword) => {
return bcrypt.compare(password, hashedPassword)
}
export const issueAccessToken = async (userId) => {
const algo = "HS256"
const accessTokenPayload = {
userId: userId,
// exp: Math.floor(Date.now() / 1000) + (15 * 60), // Access token expires in 15 minutes
// iss: 'your_issuer_here', // Replace with your actual issuer
// aud: 'your_audience_here', // Replace with your actual audience
purpose: "access", // Indicate the purpose of this token
}
const accessToken = await generateToken(accessTokenPayload, "1m") // 15 minutes expiry
return accessToken
}
// This function verifies a refresh token using a shared secret key
export async function verifyRefreshToken(refreshToken) {
try {
// Verify the refresh token using the shared secret key
const { payload, protectedHeader } = await jwtVerify(refreshToken, secret)
console.log(payload)
// Ensure the token has necessary fields and is not expired
if (!payload.userId) {
throw new Error("Invalid token format")
}
// Optionally, you can also check if the token is intended for refresh purposes only
if (payload.purpose !== "refresh") {
throw new Error("Invalid token purpose")
}
// Token is valid, return the decoded token
return payload
} catch (error) {
console.log(error)
throw new Error("Invalid refresh token")
}
}
export async function refreshAccessToken(refreshToken) {
try {
const response = await fetch("http://localhost:3000/api/refreshtoken", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ refreshToken }),
})
const data = await response.json()
return data.accessToken
} catch (error) {
console.error("Error refreshing access token:", error)
throw new Error("Failed to refresh access token")
}
}