Problem, das mit Anfragen zu Ursprungsquellen gelöst wird
Passkeys sind mit einer bestimmten Website verknüpft und können nur für die Anmeldung auf der Website verwendet werden, für die sie erstellt wurden.
Diese wird in der Relying Party ID (RP-ID) angegeben. Für Passkeys, die für die Domain beispiel.de erstellt wurden, kann das www.example.com
oder example.com
sein.
RP-IDs verhindern zwar, dass Passkeys überall als einzelne Anmeldedaten verwendet werden, verursachen aber Probleme bei:
- Websites mit mehreren Domains: Nutzer können sich nicht mit demselben Passkey in verschiedenen länderspezifischen Domains (z. B.
example.com
undexample.co.uk
) anmelden, die vom selben Unternehmen verwaltet werden. - Markendomains: Nutzer können nicht dieselben Anmeldedaten für verschiedene Domains verwenden, die von einer einzelnen Marke verwendet werden (z. B.
acme.com
undacmerewards.com
). - Mobile Apps: Mobile Apps haben oft keine eigene Domain, was die Verwaltung von Anmeldedaten erschwert.
Es gibt Problemumgehungen, die auf der Identitätsföderation und auf Iframes basieren, aber sie sind in einigen Fällen nicht praktisch. Hierfür bieten sich ähnliche Ursprungsanfragen an.
Lösung
Mit Anfragen zu ähnlichen Ursprüngen kann eine Website Ursprünge angeben, die ihre RP-ID verwenden dürfen.
So können Nutzer denselben Passkey für mehrere Websites verwenden, die Sie betreiben.
Wenn du Anfragen mit ähnlichen Ursprüngen verwenden möchtest, musst du eine spezielle JSON-Datei unter einer bestimmten URL https://{RP ID}/.well-known/webauthn
bereitstellen. Wenn example.com
den zusätzlichen Ursprüngen erlauben möchte, diese als RP-ID zu verwenden, sollte die folgende Datei unter https://example.com/.well-known/webauthn:
bereitgestellt werden:
{
"origins": [
"https://example.co.uk",
"https://example.de",
"https://example-rewards.com"
]
}
Wenn eine dieser Websites das nächste Mal einen Aufruf zur Erstellung eines Passkeys (navigator.credentials.create
) oder zur Authentifizierung (navigator.credentials.get
) sendet, bei dem example.com
als RP-ID verwendet wird, erkennt der Browser eine RP-ID, die nicht mit dem anfragenden Ursprung übereinstimmt. Wenn der Browser Anfragen mit ähnlichen Ursprüngen unterstützt, sucht er zuerst unter https://{RP ID}/.well-known/webauthn
nach einer webauthn
-Datei. Wenn die Datei vorhanden ist, prüft der Browser, ob die Quelle, von der die Anfrage stammt, in dieser Datei auf der Zulassungsliste steht. Falls ja, werden die Schritte zur Passkey-Erstellung oder zur Authentifizierung durchgeführt.
Wenn der Browser Anfragen mit ähnlichem Ursprung nicht unterstützt, wird SecurityError
zurückgegeben.
Unterstützte Browser
- Chrome: Unterstützt ab Chrome 128.
- Safari: Wird ab macOS 15 Beta 3 und auf Mobilgeräten mit iOS 18 Beta 3 unterstützt.
- Firefox: Position wird ermittelt
Anfragen mit ähnlichen Ursprüngen einrichten
In der folgenden Demo werden die beiden Websites https://ror-1.glitch.me
und https://ror-2.glitch.me
verwendet.
Damit sich Nutzer mit demselben Passkey auf beiden Websites anmelden können, werden Anfragen mit ähnlichen Ursprüngen verwendet, damit ror-2.glitch.me
ror-1.glitch.me
als RP-ID verwenden kann.
Demo
https://ror-2.glitch.me implementiert zugehörige Ursprungsanfragen, um ror-1.glitch.me als RP-ID zu verwenden. Daher verwenden sowohl ror-1
als auch ror-2
ror-1.glitch.me
als RP-ID, wenn ein Passkey erstellt oder damit authentifiziert wird.
Außerdem haben wir auf diesen Websites eine gemeinsame Passkey-Datenbank implementiert.
Beachten Sie die folgende Nutzererfahrung:
- Sie können einen Passkey erstellen und sich damit bei
ror-2
authentifizieren, auch wenn die RP-IDror-1
und nichtror-2
ist. - Wenn Sie einen Passkey auf
ror-1
oderror-2
erstellen, können Sie sich damit sowohl aufror-1
als auch aufror-2
authentifizieren. Daror-2
ror-1
als RP-ID angibt, ist eine Anfrage zur Passkey-Erstellung oder Authentifizierung von einer dieser Websites mit einer Anfrage auf ror-1 identisch. Die RP-ID ist das einzige, was eine Anfrage mit einem Ursprung verknüpft. - Wenn du in
ror-1
oderror-2
einen Passkey erstellt hast, kann er von Chrome sowohl aufror-1
als auch aufror-2
automatisch ausgefüllt werden. - Anmeldedaten, die auf einer dieser Websites erstellt werden, haben die RP-ID
ror-1
.
Code ansehen:
- Weitere Informationen finden Sie in der Einrichtung der Datei
./well-known/webauthn
in der ror-1-Codebasis. RP_ID_ROR
Vorkommen in der ror-2-Codebasis
Schritt 1: Datenbank für gemeinsame Konten implementieren
Wenn Sie möchten, dass sich Ihre Nutzer mit demselben Passkey auf site-1
und site-2
anmelden können, implementieren Sie eine Kontodatenbank, die für diese beiden Websites freigegeben ist.
Schritt 2: .well-known/webauthn-JSON-Datei in site-1 einrichten
Konfigurieren Sie zuerst site-1.com
so, dass site-2.com
es als RP-ID verwenden kann. Erstellen Sie dazu Ihre Webauthn-JSON-Datei:
{
"origins": [
"https://site-2.com"
]
}
Das JSON-Objekt muss den Schlüssel „origins“ enthalten, dessen Wert ein Array mit einem oder mehreren Strings mit Web-Ursprüngen ist.
Wichtige Einschränkung: Maximal 5 Labels
Jedes Element dieser Liste wird verarbeitet, um die eTLD + 1 Label zu extrahieren.
So sind beispielsweise die eTLD + 1 der Labels example.co.uk
und example.de
beide example
. Das eTLD+1-Label von example-rewards.com
ist jedoch example-rewards
.
In Chrome ist die maximale Anzahl von Labels fünf.
Schritt 3: .well-known/webauthn-JSON-Datei auf Website 1 bereitstellen
Stellen Sie dann Ihre JSON-Datei unter site-1.com/.well-known/webauthn
bereit.
Beispiel in Express:
app.get("/.well-known/webauthn", (req, res) => {
const origins = {
origins: ["https://site-2.com"],
};
return res.json(origins);
});
Hier verwenden wir das Express-Element res.json
, das bereits den korrekten content-type
('application/json'
) festlegt.
Schritt 4: Gewünschte RP-ID auf Website-2 angeben
Lege in deiner site-2
-Codebasis überall dort, wo es erforderlich ist, site-1.com
als RP-ID fest:
- Nach dem Erstellen der Anmeldedaten:
- Legen Sie
site-1.com
als RP-ID bei der Erstellung von Anmeldedaten festoptions
, die an dennavigator.credentials.create
-Frontendaufruf übergeben und in der Regel serverseitig generiert werden. - Legen Sie
site-1.com
als erwartete RP-ID fest, wenn Sie Anmeldedaten überprüfen, bevor Sie sie in Ihrer Datenbank speichern.
- Legen Sie
- Nach der Authentifizierung:
- Lege
site-1.com
als RP-ID in der Authentifizierung fest.options
wird an dennavigator.credentials.get
-Frontendaufruf übergeben und in der Regel serverseitig generiert. - Legen Sie
site-1.com
als erwartete RP-ID fest, die auf dem Server verifiziert werden soll, wenn Sie die Anmeldedatenüberprüfungen vor der Authentifizierung des Nutzers ausführen.
- Lege
Fehlerbehebung
Weitere Hinweise
Passkeys für Websites und mobile Apps freigeben
Mit ähnlichen Ursprungsanfragen können Ihre Nutzer einen Passkey auf mehreren Websites wiederverwenden. Damit Nutzer einen Passkey auf einer Website und in einer mobilen App wiederverwenden können, können Sie die folgenden Methoden verwenden:
- In Chrome: Digital Asset Links Weitere Informationen finden Sie unter Unterstützung für digitale Asset-Links hinzufügen.
- In Safari: Verknüpfte Domains
Passwörter für Websites freigeben
Mit ähnlichen Ursprungsanfragen können Ihre Nutzer einen Passkey websiteübergreifend wiederverwenden. Die Lösungen zur Freigabe von Passwörtern auf Websites unterscheiden sich je nach Passwortmanager. Verwenden Sie für den Google Passwortmanager Digital Asset Links. Safari verwendet ein anderes System.
Rolle von Anmeldedaten-Managern und User-Agents
Dies geht über Ihren Aufgabenbereich als Websiteentwickler hinaus. Beachten Sie jedoch, dass die RP-ID langfristig kein für Nutzer sichtbares Konzept im User-Agent oder im Anmeldedaten-Manager Ihrer Nutzer sein sollte. Stattdessen sollten User-Agents und Anmeldedaten-Manager Nutzern anzeigen, wo ihre Anmeldedaten verwendet wurden. Die Implementierung dieser Änderung wird einige Zeit in Anspruch nehmen. Eine vorübergehende Lösung wäre, sowohl die aktuelle Website als auch die ursprüngliche Registrierungswebsite anzuzeigen.