Skip to content

Commit c822b32

Browse files
committed
feat: enforce VPN/proxy check on passkey login (autofill + normal)
1 parent 677d2f4 commit c822b32

3 files changed

Lines changed: 21 additions & 2 deletions

File tree

public/js/app.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,11 @@ async function handleLogin(e) {
781781
}
782782

783783
async function completePasskeyLogin(credential) {
784+
if (await checkVpn()) {
785+
await showVpnBlockModal();
786+
return;
787+
}
788+
784789
const data = await api('/auth/passkeys/login/complete', {
785790
method: 'POST',
786791
body: JSON.stringify({

routes/auth.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,4 +825,6 @@ router.get('/export-data', authenticateToken, sensitiveLimiter, async (req, res)
825825
}
826826
});
827827

828+
export { isVpnOrProxy, getClientIp };
829+
828830
export default router;

routes/passkeys.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import {
77
verifyAuthenticationResponse,
88
} from '@simplewebauthn/server';
99
import { isoBase64URL } from '@simplewebauthn/server/helpers';
10-
import { authenticateToken } from '../middleware/auth.js';
10+
import { authenticateToken, generateToken } from '../middleware/auth.js';
1111
import { createHash, randomBytes } from 'crypto';
1212
import { query } from '../config/db.js';
13-
import { generateToken } from '../middleware/auth.js';
1413
import { logActivity } from '../services/activity.js';
14+
import { isVpnOrProxy } from './auth.js';
1515

1616
const router = Router();
1717

@@ -166,6 +166,12 @@ router.post('/passkeys/register/complete', authenticateToken, passkeyRegisterLim
166166

167167
router.post('/passkeys/login/begin', passkeyLoginLimiter, async (req, res) => {
168168
try {
169+
const ip = getClientIp(req);
170+
171+
if (await isVpnOrProxy(ip)) {
172+
return res.status(403).json({ error: 'VPN or proxy detected. Please disable your VPN for security reasons.' });
173+
}
174+
169175
const { email } = req.body;
170176
let userId = null;
171177
let allowCredentials;
@@ -221,6 +227,12 @@ router.post('/passkeys/login/begin', passkeyLoginLimiter, async (req, res) => {
221227

222228
router.post('/passkeys/login/complete', passkeyLoginLimiter, async (req, res) => {
223229
try {
230+
const ip = getClientIp(req);
231+
232+
if (await isVpnOrProxy(ip)) {
233+
return res.status(403).json({ error: 'VPN or proxy detected. Please disable your VPN for security reasons.' });
234+
}
235+
224236
const { response, sessionToken } = req.body;
225237
if (!response) {
226238
return res.status(400).json({ error: 'Response is required' });

0 commit comments

Comments
 (0)