46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import {Hono} from "hono";
|
|
import {setCookie, getCookie, deleteCookie} from "hono/cookie";
|
|
import {sign, verify} from "jsonwebtoken";
|
|
|
|
const JWT_SECRET = "your-secret-key";
|
|
|
|
const fakeUsers = [
|
|
{id: 1, username: "admin", password: "password123"},
|
|
{id: 2, username: "user", password: "password123"},
|
|
{id: 3, username: "user2", password: "password123"},
|
|
];
|
|
export const authLogin = new Hono().get("/", async (c) => {
|
|
// lets get the username and password to check everything
|
|
const {username, password} = await c.req.json();
|
|
let user = null;
|
|
// make sure we go a username and password
|
|
if (!username || !password) {
|
|
return c.json({error: "Username and password required"}, 400);
|
|
}
|
|
|
|
// check the user exist in our db
|
|
if (!fakeUsers.includes(username && password)) {
|
|
return c.json({error: "Invalid username or password"}, 400);
|
|
}
|
|
|
|
user = fakeUsers.find((u) => u.username === username && u.password === password);
|
|
|
|
// create the token
|
|
|
|
const token = sign({userId: user?.id}, JWT_SECRET, {expiresIn: "1h"});
|
|
|
|
setCookie(c, "auth_token", token, {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === "production",
|
|
maxAge: 3600, //parseInt(process.env.JWT_EXPIRES_IN) * 60 * 1000 || 3600, // expires in 1 hour is not set in env
|
|
path: "/",
|
|
sameSite: "strict",
|
|
});
|
|
|
|
return c.json({
|
|
success: true,
|
|
message: "Login successful",
|
|
user: {id: user?.id, username: user?.username, token: token},
|
|
});
|
|
});
|