@simplewebauthn/server
Advanced tools
Changelog
v5.4.0
Packages:
Changes:
verifyRegistrationResponse()
and verifyAuthenticationResponse()
now return
authenticator extension data upon successful verification as the new
authenticatorExtensionResults
property
(#230)Changelog
v5.3.0
Packages:
Changes:
startAuthentication()
now accepts a second useBrowserAutofill
boolean argument
that sets up support for credential selection via a browser's autofill prompt (a.k.a. Conditional
UI). The new browserSupportsWebAuthnAutofill()
helper method can be used independently to
determine when this feature is supported by the browser
(#214)startRegistration()
and startAuthentication()
will return a new
authenticatorAttachment
value when present that captures whether a cross-platform or platform
authenticator was just used (#221)PublicKeyCredentialFuture
interface has been added to define new
properties currently defined in the WebAuthn L3 spec draft. These new values support the above new
functionality until official TypeScript types are updated accordingly
(#214,
#221)"hybrid"
transport has been added to AuthenticatorTransportFuture
while browsers migrate away from the existing "cable"
transport for cross-device auth
(#222)Changelog
v5.2.1
Packages:
Changes:
generateRegistrationOptions()
and generateAuthenticationOptions()
will stop
reporting typing errors for definitions of excludeCredentials
and allowCredentials
that were
otherwise fine before v5.2.0 (#203)AuthenticatorTransportFuture
and
PublicKeyCredentialDescriptorFuture
have been added to track changes to WebAuthn that outpace
TypeScript's DOM lib typingsChangelog
v5.2.0
Packages:
Changes:
"cable"
transport is now recognized as a potential value
of the AuthenticatorTransport
type
(#198)verifyRegistrationResponse()
and verifyAuthenticationResponse()
now return
credentialDeviceType
and credentialBackedUp
within authenticatorInfo
as parsed values of two
new flags being added to authenticator data. These response verification methods will also now
throw an error when the invalid combination of these two flags
(credentialDeviceType: "singleDevice", credentialBackedUp: true
) is detected
(#195)
Changelog
v5.0.0 The one with more insights
Packages:
Changes:
startRegistration()
and
startAuthentication()
will now return descriptions with more specific insights into what went
wrong (#184)fidoUserVerification
argument to verifyAuthenticationResponse()
has been
replaced with the simpler requireUserVerification
boolean
(#181)Previous values of "required"
should specify true
for this new argument; previous values of
"preferred"
or "discouraged"
should specify false
:
Before:
const verification = verifyAuthenticationResponse({
// ...snip...
fidoUserVerification: 'required',
});
After:
const verification = verifyAuthenticationResponse({
// ...snip...
requireUserVerification: true,
});
Changelog
v4.4.0
Packages:
Changes:
"android-safetynet"
responses has
been removedverifyAuthenticationResponse()
's expectedChallenge
argument also accepts a
function that accepts a Base64URL string
and returns a boolean
to run custom logic against the
clientDataJSON.challenge
returned by the authenticator (see v4.3.0 release notes for more info).Changelog
v4.3.0
Packages:
Changes:
expectedChallenge
argument passed to verifyRegistrationResponse()
can now be
a function that accepts a Base64URL string
and returns a boolean
to run custom logic against
the clientDataJSON.challenge
returned by the authenticator. This allows for arbitrary data to be
included in the challenge so it can be signed by the authenticator.After generating registration options, the challenge can be augmented with additional data:
const options = generateRegistrationOptions(opts);
// Remember the plain challenge
inMemoryUserDeviceDB[loggedInUserId].currentChallenge = options.challenge;
// Add data to be signed
options.challenge = base64url(JSON.stringify({
actualChallenge: options.challenge,
arbitraryData: 'arbitraryDataForSigning',
}));
Then, when invoking verifyRegistrationResponse()
, pass in a method for expectedChallenge
to
parse the challenge and return a boolean
:
const expectedChallenge = inMemoryUserDeviceDB[loggedInUserId].currentChallenge;
const verification = await verifyRegistrationResponse({
expectedChallenge: (challenge: string) => {
const parsedChallenge = JSON.parse(base64url.decode(challenge));
return parsedChallenge.actualChallenge === expectedChallenge;
},
// ...
});
To retrieve the arbitrary data afterwards, use decodeClientDataJSON()
afterwards to get it out:
import { decodeClientDataJSON } from '@simplewebauthn/server/helpers';
const { challenge } = decodeClientDataJSON(response.clientDataJSON);
const parsedChallenge = JSON.parse(base64url.decode(challenge));
console.log(parsedChallenge.arbitraryData); // 'arbitraryDataForSigning'
Changelog
v4.2.0
Packages:
Changes:
DEBUG=SimpleWebAuthn:*
The following logging scopes are defined in this release:
SimpleWebAuthn:MetadataService
See PR #159 for a preview of logging output.