Skip to content

Commit 5da58b4

Browse files
committed
verifies passkey w/o userHandle when already logged in
1 parent fb7d02d commit 5da58b4

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

lib/routes/login.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ module.exports = async function (hostIdentity, jwtSecret, account, isAdminLogin)
6161
}
6262

6363
const presentedCredential = req.body;
64-
const decodedUserId = Buffer.from(presentedCredential.response.userHandle, 'base64url').toString('utf8');
65-
const user = await account.getUser(decodedUserId, res.logNotes);
64+
const username = presentedCredential.response.userHandle
65+
? Buffer.from(presentedCredential.response.userHandle, 'base64url').toString('utf8')
66+
: req.session.user?.username;
67+
const user = await account.getUser(username, res.logNotes); // always loads latest values
6668

6769
await verifyCredential(user, req.session.loginChallenge, origin, rpID, presentedCredential);
6870
delete req.session.loginChallenge; // Kills the challenge for this session.

spec/modular/admin.spec.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ const INVITE_REQUEST_DIR = 'inviteRequests';
2020
const ADMIN_INVITE_DIR_NAME = 'invites';
2121
const CONTACT_URL_DIR = 'contactUrls';
2222
const HOST_IDENTITY = 'psteniusubi.github.io';
23-
const { mockAccountFactory, CREDENTIAL_PRESENTED_RIGHT, CREDENTIAL_PRESENTED_WRONG, USER } = require('../util/mockAccount');
23+
const {
24+
mockAccountFactory, CREDENTIAL_PRESENTED_RIGHT, CREDENTIAL_PRESENTED_WRONG, USER,
25+
CREDENTIAL_PRESENTED_RIGHT_NO_USERHANDLE
26+
} = require('../util/mockAccount');
2427
const crypto = require('crypto');
2528
const loginFactory = require('../../lib/routes/login');
2629
const NoSuchBlobError = require('../../lib/util/NoSuchBlobError');
@@ -516,6 +519,17 @@ describe('admin module', function () {
516519
expect(verifyRes.body.verified).to.equal(true);
517520
expect(verifyRes.body.username).to.equal(USER.username);
518521
});
522+
523+
it('accepts a registered passkey w/o userHandle when already logged in', async function () {
524+
this.sessionValues.loginChallenge = LOGIN_CHALLENGE;
525+
this.sessionValues.user = structuredClone(USER);
526+
const verifyRes = await chai.request(this.app).post('/admin/verify-authentication')
527+
.type('application/json').send(JSON.stringify(CREDENTIAL_PRESENTED_RIGHT_NO_USERHANDLE));
528+
expect(verifyRes).to.have.status(200);
529+
expect(verifyRes).to.be.json;
530+
expect(verifyRes.body.verified).to.equal(true);
531+
expect(verifyRes.body.username).to.equal(USER.username);
532+
});
519533
});
520534

521535
describe('users list', function () {

0 commit comments

Comments
 (0)