بررسی تشخیص ویژگی API مدیریت اعتبارنامه

خلاصه

WebAuthn با آوردن احراز هویت مبتنی بر کلید عمومی در وب به افزایش امنیت کمک می کند و به زودی در کروم، فایرفاکس و اج ( با مشخصات به روز شده ) پشتیبانی می شود. این نوع جدیدی از شئ Credential را اضافه می‌کند، که ممکن است وب‌سایت‌هایی را که از Credential Management API استفاده می‌کنند بدون شناسایی ویژگی‌های نوع اعتبارنامه خاصی که استفاده می‌کنند، خراب کند.

اگر در حال حاضر این کار را برای تشخیص ویژگی انجام می دهید

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // use CM API
}

در عوض اینها را انجام دهید

if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

تغییرات ایجاد شده در کد نمونه را به عنوان نمونه ببینید.

برای کسب اطلاعات بیشتر به ادامه مطلب مراجعه کنید.

Credential Management API چیست؟

Credential Management API (CM API) به وب‌سایت‌ها دسترسی برنامه‌ریزی شده به فروشگاه اعتبار عامل کاربر برای ذخیره/بازیابی اعتبار کاربر برای مبدا تماس می‌دهد.

API های پایه عبارتند از:

  • navigator.credentials.get()
  • navigator.credentials.store()
  • navigator.credentials.create()
  • navigator.credentials.preventSilentAccess()

مشخصات اصلی CM API 2 نوع اعتبار را تعریف می کند:

  • PasswordCredential
  • FederatedCredential

PasswordCredential اعتباری است که شامل شناسه و رمز عبور کاربر است. FederatedCredential یک اعتبار است که شامل شناسه کاربر و رشته ای است که یک ارائه دهنده هویت را نشان می دهد.

با این 2 اعتبار، وب سایت ها می توانند:

  • به کاربر اجازه دهید به محض ورود به سیستم با یک اعتبار مبتنی بر رمز عبور ذخیره شده قبلی یا اعتبارنامه فدرال وارد شود (ورود خودکار)،
  • اطلاعات کاربری مبتنی بر رمز عبور یا اعتبار فدرالی که کاربر با آن وارد شده است را ذخیره کنید،
  • اطلاعات کاربری ورود به سیستم کاربر را به روز نگه دارید (به عنوان مثال پس از تغییر رمز عبور)

WebAuthn چیست؟

WebAuthn (Web Authentication) اعتبارنامه های کلید عمومی را به CM API اضافه می کند. به عنوان مثال، به وب‌سایت‌ها روشی استاندارد برای اجرای احراز هویت فاکتور دوم با استفاده از دستگاه‌های احراز هویت سازگار با FIDO 2.0 می‌دهد.

در سطح فنی، WebAuthn CM API را با رابط PublicKeyCredential گسترش می دهد.

مشکل چیه؟

قبلاً توسعه‌دهندگان را راهنمایی می‌کردیم تا CM API را با کد زیر شناسایی کنند:

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
  // Use CM API
}

But as you can see from the descriptions above, the `navigator.credentials` is
now expanded to support public-key credentials in addition to password
credentials and federated credentials.

The problem is that user agents don't necessarily support all kinds of
credentials. If you continue feature detect using `navigator.credentials`, your
website may break when you are using a certain credential type not supported by
the browser.

**Supported credential types by browsers**
<table class="properties with-heading-tint"><tbody><tr>
<th></th>
<th>PasswordCredential / FederatedCredential</th>
<th>PublicKeyCredential</th>
</tr><tr><th>Chrome
</th><td>Available
</td><td>In development
</td></tr><tr><th>Firefox
</th><td>N/A
</td><td>Aiming to ship on 60
</td></tr><tr><th>Edge
</th><td>N/A
</td><td>Implemented with <a href="https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/">older API</a>. New API (navigator.credentials) coming soon.
</td></tr></tbody></table>


## The solution
You can avoid this by modifying feature detection code as follows to explicitly
test for the credential type that you intend to use.

```js
if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

تغییرات واقعی ایجاد شده در کد نمونه را به عنوان نمونه ببینید.

برای مرجع، در اینجا نحوه تشخیص PublicKeyCredential اضافه شده در WebAuthn آمده است:

if (window.PublicKeyCredential) {
    // use CM API with PublicKeyCredential added in the WebAuthn spec
}

جدول زمانی

اولین پیاده‌سازی WebAuthn فایرفاکس است و قرار است در اوایل ماه مه 2018 پایدار باشد .

سرانجام

اگر سؤالی دارید، آنها را به @agektmr یا agektmr@chromium.org ارسال کنید.