Bu kılavuzda, oturum açmış bir kullanıcının hassas hesap değişiklikleri (ör. şifre güncellemeleri, finansal transferler) yapmadan önce adım adım kimlik doğrulama veya yeniden doğrulama işlemlerinin nasıl uygulanacağı ayrıntılı olarak açıklanmaktadır.
Delta akış mimarisi
Normal kimlik doğrulamanın aksine, geçiş anahtarı yeniden kimlik doğrulama, geçiş anahtarı iletişim kutusu istemlerini kesinlikle giriş yapmış kullanıcının önceden kayıtlı kimlik bilgileriyle sınırlandırır. Bu sayede, etkin oturumlar sırasında hesapların karışması veya geçiş anahtarı sahtekarlığı önlenir.
Sunucu Tarafı
Seçenek Oluşturma Değişimi
Özellikle etkin, bilinen kullanıcı için izin verilen kimlik bilgileri parametrelerini dolduran bir uç nokta oluşturun:
Kimlik Bilgilerini Kısıtlama: allowCredentials seçenekler dizisini, oturum açmış kullanıcının kayıtlı tüm kimlik bilgisi kimliklerini eşleyen belirli PublicKeyCredentialDescriptor kayıtlarıyla doldurun. Bu alanın boş bırakılması veya atlanması, keşfedilebilir kimlik bilgilerine geri dönülmesine neden olarak oturum güvenliğini ihlal eder.
// Node.js step-up options generation example
router.post("/api/reauth/options", enforceActiveSession, async (req, res) => {
const userPasskeys = await db.findCredentialsByUserId(req.user.id);
const options = {
challenge: serverGeneratedBase64UrlChallenge, // Random challenge stored in user session
rpId: "example.com",
// Enforce allowance strictly limited to the user's credentials list
allowCredentials: userPasskeys.map((cred) => ({
type: "public-key",
id: cred.id,
transports: cred.transports, // Speeds up resolution by indicating platform transports
})),
};
return res.json(options);
});
Doğrulama Uç Noktası Farkı
İstemci tarafından döndürülen onayı doğrulayın:
Hesap sahipliğini doğrulama: Doğrulama uç noktası, istemci tarafından döndürülen kimlik doğrulama bilgileri kimliğinin, ilişkili kullanıcı kimliği etkin oturum açmış kullanıcıyla (storedCredential.passkeyUserId === req.user.id) tam olarak eşleşen kayıtlı bir kimlik bilgisi kaydıyla çözümlendiğini açıkça doğrulamalıdır. Farklı bir kullanıcının geçerli geçiş anahtarı döndürülürse kimlik doğrulama hemen reddedilmelidir.
İstemci Tarafı Akış Farkları
Uygulamalar, işlem kullanıcı arayüzüne bağlı olarak iki yeniden kimlik doğrulama arayüzünden birini seçer:
C. Düğme Akışı (Giriş Alanı Yok)
Kullanıcı "Kimliği Doğrula" veya "İşleme Devam Et" düğmesine bastığında yeniden kimlik doğrulamayı tetikleyin.
<button id="reauth-btn" data-testid="reauth-button">Confirm Transaction</button>
let reauthAbortController = new AbortController();
async function triggerButtonReauth() {
// Abort any background suggestion flows to avoid passkey prompt collisions
reauthAbortController.abort();
reauthAbortController = new AbortController();
const optionsResponse = await fetch("/api/reauth/options", {
method: "POST",
});
const optionsJSON = await optionsResponse.json();
const publicKey =
PublicKeyCredential.parseRequestOptionsFromJSON(optionsJSON);
try {
const credential = await navigator.credentials.get({
publicKey,
signal: reauthAbortController.signal,
});
if (credential) {
const encodedCredential = credential.toJSON();
const verifyResponse = await fetch("/api/reauth/verify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(encodedCredential),
});
if (verifyResponse.ok) {
showTransactionSuccessUI();
} else if (verifyResponse.status === 404 && PublicKeyCredential.signalUnknownCredential) {
await PublicKeyCredential.signalUnknownCredential({
rpId, // RP ID must match the one defined on the server
credentialId: encodedCredential.id
});
}
}
} catch (err) {
if (err.name === "NotAllowedError") {
console.log("User cancelled reauthentication.");
}
}
}
document
.getElementById("reauth-btn")
.addEventListener("click", triggerButtonReauth);
Yedek Stratejiler
Geçiş anahtarı özelliği algılama yedeği
"webauthn-polyfills"i her zaman yükleyin ve bağlama aktarın.
PublicKeyCredential desteklendiği sürece PublicKeyCredential.getClientCapabilities de desteklenir.
import 'webauthn-polyfills';
Kolay JSON Serileştirme Yedeklemesi
"webauthn-polyfills"i her zaman yükleyin ve bağlama aktarın.
PublicKeyCredential desteklendiği sürece PublicKeyCredential.parseRequestOptionsFromJSON ve PublicKeyCredential.prototype.toJSON de desteklenir.
import 'webauthn-polyfills';