WebAthn/PassKey Attestation UserHandle ist immer nullJavaScript

Javascript-Forum
Anonymous
 WebAthn/PassKey Attestation UserHandle ist immer null

Post by Anonymous »

In meinem Assertion-Verifizierungscode habe ich Folgendes geschrieben: -

Code: Select all

if (
assertion == null ||
assertion.Id == null ||
assertion.AuthenticatorData == null ||
assertion.ClientDataJSON == null ||
assertion.Signature == null
) {
// **assertion.UserHandle is null for Samsung phone**

return FAIL_STATUS;
}
Ist mein Kommentar „assertion.UserHandle is null for Samsung phone“ tatsächlich wahr? Ich teste nur auf http://localhost mit meinem Samsung-Telefon.
Wenn das stimmt, wie verknüpfe ich einen Website-Benutzer zuverlässig mit seinem PassKey in meiner Datenbank? Die Assertions-ID zusammen mit meinem Benutzer in der Datenbank verwenden/speichern? Aber das würde sicher ausschließen, dass die Anmeldeinformationen für jeden mit einem Samsung-Telefon erkennbar sind :-(
Hinweis: Als ich den PassKey zum ersten Mal erstellte und er auf meinem Telefon gespeichert wurde, war requireResidentKey standardmäßig auf „False“ eingestellt. Vielleicht kann er nicht geändert werden?
Trifft das Versäumnis, den Benutzer-Handle zurückzugeben, nur auf die Methode navigator.credentials.get() zu?
Möglicherweise verwandter Beitrag (Über physische Schlüssel, nicht über Telefone): -
Einige Passschlüssel sind derzeit nicht in der Lage, auffindbare WebAuthn-Anmeldeinformationen zu erstellen oder zu verwenden. Dies hindert Sie daran, die Passschlüssel auf Ihren Sicherheitsschlüsseln zu verwenden. Es unterstützt also nur die native synchronisierbare Option, nicht die Sicherheitsschlüsseloption.
LAST BEARBEITEN
Ok, mein UA kann meinen Samsung PassKey auf anderen Websites auf get() erkennen. Ich vermute also, dass es sich um ein http://localhost-Problem handelt (weil nichts im Samsung-Passwort-Manager gespeichert ist) oder ich habe einfach meine Parameter falsch verstanden?
BITTE um Rat.
Auch bei Google-Konten kann ich nur Name und Benutzername bearbeiten, also ist die ID möglicherweise unveränderlich?
END BEARBEITEN

Code: Select all

return navigator.credentials
.get({
publicKey: getAssertionOptions,
})
.then((rawAssertion) => {
var assertion = {
id: base64encode(rawAssertion.rawId),
clientDataJSON: arrayBufferToString(rawAssertion.response.clientDataJSON),
userHandle: base64encode(rawAssertion.response.userHandle),
signature: base64encode(rawAssertion.response.signature),
authenticatorData: base64encode(rawAssertion.response.authenticatorData),
};
Der Schlüssel wurde erstellt mit: -

Code: Select all

    var createCredentialOptions = {
rp: {
name: "WebAuthn Sample App",
icon: "",
},
user: {
id: stringToArrayBuffer("some.user.guid"),
name: "[email protected]",
displayName: "Richard Maher",
icon: "",
},
pubKeyCredParams: [
{
//External authenticators support the ES256 algorithm
type: "public-key",
alg: -7,
},
{
//Windows Hello supports the RS256 algorithm
type: "public-key",
alg: -257,
},
],
authenticatorSelection: {
//Select authenticators that support username-less flows
requireResidentKey: true,

userVerification: "discouraged",

authenticatorAttachment: "cross-platform",
},
//Since Edge shows UI, it is better to select larger timeout values
timeout: 30000,
//an opaque challenge that the authenticator signs over
challenge: stringToArrayBuffer(serverChallenge.Token),
//prevent re-registration by specifying existing credentials here
excludeCredentials: [],
//specifies whether you need an attestation statement
attestation: "none",
};

const authAbort = new AbortController();
const abortSignal = authAbort.signal;
abortSignal.addEventListener("abort", (e) => {
console.log("It has been aborted");
});

return navigator.credentials
.create({
publicKey: createCredentialOptions,
signal: abortSignal,
})
.then((rawAttestation) => {
var attestation = {
id: base64encode(rawAttestation.rawId),
clientDataJSON: arrayBufferToString(
rawAttestation.response.clientDataJSON,
),
attestationObject: base64encode(
rawAttestation.response.attestationObject,
),
};

console.log("=== Attestation response ===");
logVariable("id (base64)", attestation.id);
logVariable("clientDataJSON", attestation.clientDataJSON);
logVariable(
"attestationObject (base64)",
attestation.attestationObject,
);
verifyCredentials(attestation).then((result) => {
var res = JSON.parse(result);
console.log(res.success);
if (res.success) {
localStorage.setItem("credentialId", res.id);
}
});

return;
})
.catch((err) => {
if (err.name == "NotAllowedError") {
console.log("here " + err.name);
} else {
console.log("other " + err.name);
}
return Promise.resolve(false);
});
});

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post