diff options
-rw-r--r-- | example/fido-conformance.js | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/example/fido-conformance.js b/example/fido-conformance.js index 50f135d..d4a3a23 100644 --- a/example/fido-conformance.js +++ b/example/fido-conformance.js @@ -6,6 +6,7 @@ const { generateAttestationOptions, verifyAttestationResponse, generateAssertionOptions, + verifyAssertionResponse, } = require('@simplewebauthn/server'); const inMemoryUserDeviceDB = { @@ -158,6 +159,46 @@ fidoComplianceRouter.post('/assertion/options', (req, res) => { }); }); +fidoComplianceRouter.post('/assertion/result', (req, res) => { + const { body } = req; + const { id } = body; + + const user = inMemoryUserDeviceDB[loggedInUsername]; + const expectedChallenge = user.currentChallenge; + const existingDevice = user.devices.find(device => device.credentialID === id); + + if (!existingDevice) { + throw new Error('Assertion device is not registered to user'); + } + + let verification; + try { + verification = verifyAssertionResponse({ + credential: body, + expectedChallenge: Buffer.from(expectedChallenge, 'base64'), + expectedOrigin: origin, + expectedRPID: rpID, + authenticator: existingDevice, + }); + } catch (error) { + console.error(error.message); + return res.status(400).send({ errorMessage: error.message }); + } + + const { verified, authenticatorInfo } = verification; + + if (verified) { + const { base64CredentialID, counter } = authenticatorInfo; + const existingDevice = user.devices.find(device => device.credentialID === base64CredentialID); + existingDevice.counter = counter; + } + + return res.send({ + status: verified ? 'ok' : '', + errorMessage: '', + }); +}); + fidoComplianceRouter.all('*', (req, res, next) => { console.log(req.url); console.log(req.method); |