58 lines
1.1 KiB
Markdown
58 lines
1.1 KiB
Markdown
|
```
|
||
|
npx http-server .
|
||
|
```
|
||
|
|
||
|
```js
|
||
|
const challenge = Uint8Array.from("myserverchallenge", c => c.charCodeAt(0))
|
||
|
|
||
|
const userId = Uint8Array.from("myuserid", c => c.charCodeAt(0))
|
||
|
|
||
|
const options = {
|
||
|
challenge,
|
||
|
rp: {
|
||
|
name: "localhost",
|
||
|
id: "localhost",
|
||
|
},
|
||
|
user: {
|
||
|
id: userId,
|
||
|
name: "myuser",
|
||
|
displayName: "John Doe",
|
||
|
},
|
||
|
pubKeyCredParams: [{alg: -7, type: "public-key"}],
|
||
|
authenticatorSelection: {
|
||
|
authenticatorAttachment: "cross-platform",
|
||
|
},
|
||
|
timeout: 60000,
|
||
|
attestation: "direct"
|
||
|
};
|
||
|
|
||
|
const credential = await navigator.credentials.create({
|
||
|
publicKey: options
|
||
|
});
|
||
|
|
||
|
|
||
|
var decoder = new TextDecoder()
|
||
|
decoder.decode(credential.response.clientDataJSON)
|
||
|
|
||
|
CBOR.decode(credential.response.attestationObject)
|
||
|
```
|
||
|
|
||
|
|
||
|
```js
|
||
|
const newChallenge = Uint8Array.from("myservernewchallenge", c => c.charCodeAt(0))
|
||
|
|
||
|
const assertionOptions = {
|
||
|
challenge: newChallenge,
|
||
|
allowCredentials: [
|
||
|
{
|
||
|
id: credential.rawId,
|
||
|
type: 'public-key'
|
||
|
}
|
||
|
],
|
||
|
timeout: 60000
|
||
|
}
|
||
|
|
||
|
navigator.credentials
|
||
|
.get({ publicKey: assertionOptions })
|
||
|
|
||
|
```
|