Add LoginSRPDetail to v2 auth route

This commit is contained in:
Tuan Dang
2023-02-21 10:52:31 +07:00
parent f8c4ccd64c
commit 75eac1b972
+17 -8
View File
@@ -4,7 +4,7 @@ import jwt from 'jsonwebtoken';
import * as Sentry from '@sentry/node'; import * as Sentry from '@sentry/node';
import * as bigintConversion from 'bigint-conversion'; import * as bigintConversion from 'bigint-conversion';
const jsrp = require('jsrp'); const jsrp = require('jsrp');
import { User } from '../../models'; import { User, LoginSRPDetail } from '../../models';
import { issueAuthTokens, createToken } from '../../helpers/auth'; import { issueAuthTokens, createToken } from '../../helpers/auth';
import { sendMail } from '../../helpers/nodemailer'; import { sendMail } from '../../helpers/nodemailer';
import { TokenService } from '../../services'; import { TokenService } from '../../services';
@@ -13,6 +13,7 @@ import {
JWT_MFA_LIFETIME, JWT_MFA_LIFETIME,
JWT_MFA_SECRET JWT_MFA_SECRET
} from '../../config'; } from '../../config';
import { BadRequestError } from '../../utils/errors';
import { import {
TOKEN_EMAIL_MFA TOKEN_EMAIL_MFA
} from '../../variables'; } from '../../variables';
@@ -50,13 +51,15 @@ export const login1 = async (req: Request, res: Response) => {
salt: user.salt, salt: user.salt,
verifier: user.verifier verifier: user.verifier
}, },
() => { async () => {
// generate server-side public key // generate server-side public key
const serverPublicKey = server.getPublicKey(); const serverPublicKey = server.getPublicKey();
clientPublicKeys[email] = {
clientPublicKey, await LoginSRPDetail.findOneAndReplace({ email: email }, {
serverBInt: bigintConversion.bigintToBuf(server.bInt) email: email,
}; clientPublicKey: clientPublicKey,
serverBInt: bigintConversion.bigintToBuf(server.bInt),
}, { upsert: true, returnNewDocument: false });
return res.status(200).send({ return res.status(200).send({
serverPublicKey, serverPublicKey,
@@ -89,15 +92,21 @@ export const login2 = async (req: Request, res: Response) => {
if (!user) throw new Error('Failed to find user'); if (!user) throw new Error('Failed to find user');
const loginSRPDetail = await LoginSRPDetail.findOneAndDelete({ email: email })
if (!loginSRPDetail) {
return BadRequestError(Error("Failed to find login details for SRP"))
}
const server = new jsrp.server(); const server = new jsrp.server();
server.init( server.init(
{ {
salt: user.salt, salt: user.salt,
verifier: user.verifier, verifier: user.verifier,
b: clientPublicKeys[email].serverBInt b: loginSRPDetail.serverBInt
}, },
async () => { async () => {
server.setClientPublicKey(clientPublicKeys[email].clientPublicKey); server.setClientPublicKey(loginSRPDetail.clientPublicKey);
// compare server and client shared keys // compare server and client shared keys
if (server.checkClientProof(clientProof)) { if (server.checkClientProof(clientProof)) {