login by password or totp

This commit is contained in:
Julian Krauser 2025-05-05 14:21:13 +02:00
parent a476bf6823
commit be22c78372
3 changed files with 39 additions and 12 deletions

View file

@ -8,6 +8,25 @@ import UserService from "../service/management/userService";
import speakeasy from "speakeasy"; import speakeasy from "speakeasy";
import UnauthorizedRequestException from "../exceptions/unauthorizedRequestException"; import UnauthorizedRequestException from "../exceptions/unauthorizedRequestException";
import RefreshService from "../service/refreshService"; import RefreshService from "../service/refreshService";
import { LoginRoutineEnum } from "../enums/loginRoutineEnum";
/**
* @description Check authentication status by token
* @param req {Request} Express req object
* @param res {Response} Express res object
* @returns {Promise<*>}
*/
export async function kickof(req: Request, res: Response): Promise<any> {
let username = req.body.username;
let { routine } = await UserService.getByUsername(username).catch(() => {
throw new UnauthorizedRequestException("Username not found");
});
res.json({
routine,
});
}
/** /**
* @description Check authentication status by token * @description Check authentication status by token
@ -17,20 +36,25 @@ import RefreshService from "../service/refreshService";
*/ */
export async function login(req: Request, res: Response): Promise<any> { export async function login(req: Request, res: Response): Promise<any> {
let username = req.body.username; let username = req.body.username;
let totp = req.body.totp; let passedSecret = req.body.secret;
// TODO: change to first routine and later login password/totp let { id } = await UserService.getByUsername(username);
let { id, secret } = await UserService.getByUsername(username); let { secret, routine } = await UserService.getUserSecretAndRoutine(id);
let valid = speakeasy.totp.verify({ let valid = false;
secret: secret, if (routine == LoginRoutineEnum.totp) {
encoding: "base32", valid = speakeasy.totp.verify({
token: totp, secret: secret,
window: 2, encoding: "base32",
}); token: passedSecret,
window: 2,
});
} else {
valid = passedSecret == secret;
}
if (!valid) { if (!valid) {
throw new UnauthorizedRequestException("Token not valid or expired"); throw new UnauthorizedRequestException("Credentials not valid or expired");
} }
let accessToken = await JWTHelper.buildToken(id); let accessToken = await JWTHelper.buildToken(id);

View file

@ -1,8 +1,12 @@
import express from "express"; import express from "express";
import { login, logout, refresh } from "../controller/authController"; import { kickof, login, logout, refresh } from "../controller/authController";
var router = express.Router({ mergeParams: true }); var router = express.Router({ mergeParams: true });
router.post("/kickof", async (req, res) => {
await kickof(req, res);
});
router.post("/login", async (req, res) => { router.post("/login", async (req, res) => {
await login(req, res); await login(req, res);
}); });

View file

@ -136,7 +136,6 @@ export default abstract class UserService {
* @returns {Promise<user>} * @returns {Promise<user>}
*/ */
static async getUserSecretAndRoutine(userId: string): Promise<user> { static async getUserSecretAndRoutine(userId: string): Promise<user> {
//TODO: not working yet
return await dataSource return await dataSource
.getRepository(user) .getRepository(user)
.createQueryBuilder("user") .createQueryBuilder("user")