1st push
This commit is contained in:
parent
501d8a8d8e
commit
3226975910
76 changed files with 48623 additions and 3401 deletions
111
utils/auth.js
Normal file
111
utils/auth.js
Normal 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")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue