login by password or totp
This commit is contained in:
parent
a476bf6823
commit
be22c78372
3 changed files with 39 additions and 12 deletions
|
@ -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;
|
||||||
|
if (routine == LoginRoutineEnum.totp) {
|
||||||
|
valid = speakeasy.totp.verify({
|
||||||
secret: secret,
|
secret: secret,
|
||||||
encoding: "base32",
|
encoding: "base32",
|
||||||
token: totp,
|
token: passedSecret,
|
||||||
window: 2,
|
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);
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Reference in a new issue