|
|
const { makeJWT } = require("../utils/http"); |
|
|
const prisma = require("../utils/prisma"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const TemporaryAuthToken = { |
|
|
expiry: 1000 * 60 * 6, |
|
|
tablename: "temporary_auth_tokens", |
|
|
writable: [], |
|
|
|
|
|
makeTempToken: () => { |
|
|
const uuidAPIKey = require("uuid-apikey"); |
|
|
return `allm-tat-${uuidAPIKey.create().apiKey}`; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
issue: async function (userId = null) { |
|
|
if (!userId) |
|
|
throw new Error("User ID is required to issue a temporary auth token."); |
|
|
await this.invalidateUserTokens(userId); |
|
|
|
|
|
try { |
|
|
const token = this.makeTempToken(); |
|
|
const expiresAt = new Date(Date.now() + this.expiry); |
|
|
await prisma.temporary_auth_tokens.create({ |
|
|
data: { |
|
|
token, |
|
|
expiresAt, |
|
|
userId: Number(userId), |
|
|
}, |
|
|
}); |
|
|
|
|
|
return { token, error: null }; |
|
|
} catch (error) { |
|
|
console.error("FAILED TO CREATE TEMPORARY AUTH TOKEN.", error.message); |
|
|
return { token: null, error: error.message }; |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
invalidateUserTokens: async function (userId) { |
|
|
if (!userId) |
|
|
throw new Error( |
|
|
"User ID is required to invalidate temporary auth tokens." |
|
|
); |
|
|
await prisma.temporary_auth_tokens.deleteMany({ |
|
|
where: { userId: Number(userId) }, |
|
|
}); |
|
|
return true; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
validate: async function (publicToken = "") { |
|
|
|
|
|
let token; |
|
|
|
|
|
try { |
|
|
if (!publicToken) |
|
|
throw new Error( |
|
|
"Public token is required to validate a temporary auth token." |
|
|
); |
|
|
token = await prisma.temporary_auth_tokens.findUnique({ |
|
|
where: { token: String(publicToken) }, |
|
|
include: { user: true }, |
|
|
}); |
|
|
if (!token) throw new Error("Invalid token."); |
|
|
if (token.expiresAt < new Date()) throw new Error("Token expired."); |
|
|
if (token.user.suspended) throw new Error("User account suspended."); |
|
|
|
|
|
|
|
|
const sessionToken = makeJWT( |
|
|
{ id: token.user.id, username: token.user.username }, |
|
|
process.env.JWT_EXPIRY |
|
|
); |
|
|
|
|
|
return { sessionToken, token, error: null }; |
|
|
} catch (error) { |
|
|
console.error("FAILED TO VALIDATE TEMPORARY AUTH TOKEN.", error.message); |
|
|
return { sessionToken: null, token: null, error: error.message }; |
|
|
} finally { |
|
|
|
|
|
if (token) |
|
|
await prisma.temporary_auth_tokens.delete({ where: { id: token.id } }); |
|
|
} |
|
|
}, |
|
|
}; |
|
|
|
|
|
module.exports = { TemporaryAuthToken }; |
|
|
|