این راهنمای متمرکز بر تفاوتها جزئیات نحوه پیادهسازی اصالتسنجی گامبهگام یا درستیسنجی مجدد برای کاربر واردشده به سیستم را قبلاز انجام تغییرات حساس در حساب (مانند بهروزرسانی گذرواژه، انتقال مالی) شرح میدهد.
Delta Flow Architecture
برخلاف اصالتسنجی معمولی، اصالتسنجی مجدد با گذرکلید، پیاموارههای کادر گفتگوی گذرکلید را بهطور دقیق به اطلاعات اعتباری پیشثبتنامشده کاربر واردشده به سیستم محدود میکند تا از ترکیب حسابها یا جعل گذرکلید درطول جلسههای فعال جلوگیری شود.
سمت سرور
اختلاف تولید گزینهها
نقطه پایانیای ایجاد کنید که پارامترهای اطلاعات کاربری مجاز را بهطور خاص برای کاربر فعال و شناختهشده پر کند:
محدود کردن اطلاعات اعتباری: آرایه گزینههای allowCredentials را با رکوردهای PublicKeyCredentialDescriptor خاصی که همه شناسههای اطلاعات اعتباری ثبتشده برای کاربر واردشده به سیستم را نگاشت میکنند پر کنید. خالی گذاشتن یا حذف کردن این مورد باعث بازگشت به اطلاعات اعتباری قابلکشف میشود که ایمنی جلسه را نقض میکند.
// 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);
});
تغییرات نقطه پایان درستیسنجی
درستیسنجی ادعای برگرداندهشده توسط کارخواه:
بهتأیید رساندن مالکیت حساب: نقطه پایانی درستیسنجی باید صریحاً تأیید کند که شناسه اعتبارنامه اصالتسنجیشده حاصل که توسط کارخواه برگردانده شده است به یک سابقه اعتبارنامه ذخیرهشده منتهی میشود که شناسه کاربر مرتبط با آن دقیقاً با کاربر فعال واردشده به سیستم (storedCredential.passkeyUserId === req.user.id) مطابقت دارد. اگر گذرکلید معتبر کاربر دیگری برگردانده شود، اصالتسنجی باید فوراً رد شود.
تغییرات جریان سمت کارخواه
برنامهها بسته به واسط کاربر تراکنش، از بین دو میانای بازاصالتسنجی انتخاب میکنند:
الف. جریان دکمه (بدون فیلد ورودی)
وقتی کاربر دکمه «تأیید هویت» یا «ادامه تراکنش» را فشار میدهد، بازدرستیسنجی را راهاندازی کنید.
<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);
راهبردهای جایگزین
جایگزین تشخیص ویژگی گذرکلید
همیشه «webauthn-polyfills» را نصب کنید و آن را در بافت وارد کنید.
درنظر بگیرید که تا زمانی که از PublicKeyCredential پشتیبانی میشود، از PublicKeyCredential.getClientCapabilities نیز پشتیبانی میشود.
import 'webauthn-polyfills';
Easy JSON Serialization Fallback
همیشه «webauthn-polyfills» را نصب کنید و آن را در بافت وارد کنید.
درنظر بگیرید که تا زمانی که PublicKeyCredential پشتیبانی میشود، PublicKeyCredential.parseRequestOptionsFromJSON و PublicKeyCredential.prototype.toJSON نیز پشتیبانی میشوند.
import 'webauthn-polyfills';