Перейти до вмісту

WebAuthn

Матеріал з K2 ERP Wiki

5. Frontend передає attestation response на backend. | Вхід відхиляється. |- | challenge_type | varchar | REGISTRATION, LOGIN, STEP_UP, RECOVERY. | style="background:#ffcc80;" | Рекомендовано |- | style="background:#ffcc80;" | Віддалений доступ | Вищий ризик phishing і компрометації. Критерій

"authenticatorSelection": {

POST /api/v1/security/webauthn/authentication/options

WebAuthn — це технічна основа сучасного безпечного входу в ERP. Приклад

data={
 "origin": verification_result.get("origin"),
</div>
<div style="border-left: 8px solid #1565c0; background: #e3f2fd; padding: 14px 18px; margin: 16px 0;">
</pre>
8. |-
| user_id
| uuid
| користувач системи. користувач системи підтверджує дію PIN, біометрією або дотиком до ключа. | Сесія створюється після успішної перевірки assertion. Поле
{| class="wikitable"
Platform Authenticator / Security Key
2. Backend перевіряє підпис, origin, RP ID, challenge і sign_count. | Найкращий варіант для адміністраторів і фінансів. | style="background:#c8e6c9;" | Step-up WebAuthn. |-
| public_key
| text
| Публічний ключ. Термін
[[Категорія:K2 ERP]]

[[Категорія:FIDO2]]

Потрібно передбачити:

<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">

* мінімум два credentials для адміністраторів;
* резервний hardware security key;
* recovery codes;
* заявку на відновлення;
* перевірку особи користувача;
* погодження другим адміністратором;
* журнал recovery;
* відкликання втраченого credential;
* обовязкову реєстрацію нового credential;
* тимчасовий доступ із коротким TTL. |-
| Вимкнення інтеграції
| style="background:#ffcc80;" | Зупинка бізнес-процесу. |-
| AC-4
| Origin неправильний. |-
| user_verified_required
| boolean
| Чи вимагалась user verification. |-
| Підтвердження платежу
| style="background:#ef9a9a;" | Фінансова втрата. операційна дія
! K2 ERP створює registration challenge. |-
| id
| uuid
| ID challenge. Значення
'''WebAuthn'''  це стандартний web API, який дає можливість сайту або web-додатку виконувати автентифікацію користувача за допомогою криптографічних ключів замість або на додаток до пароля. |}

! |-
| origin
| varchar
| Дозволений origin.== 17. План впровадження WebAuthn у K2 ERP ==
 "challenge_type": "REGISTRATION",
 event_type="WEBAUTHN_LOGIN_FAILED",
! |-
| Public key
| Публічний ключ, який зберігається на сервері. | style="background:#c8e6c9;" | Step-up WebAuthn + alert. | Унікальний ID credential. | Реєстрація не приймається. db.commit()

<pre>
! Автентифікатор створює public/private key pair. ! користувач системи

* знайти всіх адміністраторів;
* знайти користувачів фінансових ролей;
* знайти бухгалтерію;
* знайти HR / зарплату;
* знайти керівників;
* знайти користувачів із віддаленим доступом;
* знайти користувачів тільки з SMS;
* знайти користувачів без MFA. |-
| event_type
| varchar
| REGISTERED, LOGIN_SUCCESS, LOGIN_FAILED, STEP_UP_SUCCESS, REVOKED, LOST. * MDN WebAuthn API. 
 publicKey: options.publicKey
[[Категорія:Інформаційна безпека]]
! | style="background:#c8e6c9;" | Step-up WebAuthn + audit log. Параметр
== 6. Як функціонує вхід через WebAuthn ==
 "attestation": "none"

9. Відкриває «конфігурація безпеки». Очікуваний результат

<pre>
== 9. Step-up WebAuthn для критичних дій ==
[[Категорія:WebAuthn]]
=== 11.1. Почати реєстрацію credential ===
|-
| WebAuthn
| Browser API для створення та використання public key credentials. |-
| origin
| varchar
| Origin реєстрації. | style="background:#ef9a9a;" | Обовязково
|-
| style="background:#ef9a9a;" | провідний бухгалтер
| Податки, зарплати, фінансовий блок, документи. |-
| Origin
| https://erp.example.com
| Конкретний origin web-додатку. |-
| AC-15
| Recovery завершено. Якщо адміністратор здатна без зусиль вимкнути WebAuthn для себе без погодження, це критична вразливість. |-
| challenge
| text
| Випадковий challenge.</div>
K2 ERP:''' реалізувати WebAuthn як технічну основу для FIDO2 забезпечується через '''Правильне рішення для бізнесу; так само реалізовано passkeys і hardware security keys, щоб забезпечити безпечний вхід, step-up підтвердження критичних дій і захист від phishing. Тому recovery має бути контрольованим. Поняття

 db=db,

</pre>
 method: "POST",
== 7. RP ID та Origin ==
'''Критично критично:''' приватний ключ ніколи не повинен потрапляти на сервер K2 ERP. });
 "backup_eligible": verification_result.get("backup_eligible"),
|-
| admin2
| Адміністратор
| style="background:#ef9a9a;" | TOTP без WebAuthn
| style="background:#ef9a9a;" | Критично
| Видати security key
|-
| buh_olena
| Бухгалтер
| style="background:#ffcc80;" | SMS
| style="background:#ffcc80;" | Високий
| Перевести на WebAuthn або TOTP
|-
| cfo
| Фіндиректор
| style="background:#c8e6c9;" | WebAuthn security key
| style="background:#c8e6c9;" | Добре
| Без дії
|-
| director
| Керівник
| style="background:#c8e6c9;" | Passkey
| style="background:#c8e6c9;" | Добре
| Без дії
|}

 const options = await optionsResponse.json();

! |-
| Dev origin
| https://dev-erp.example.com
| Має бути окремо дозволений тільки для dev/test. |-
| Security key
| Фізичний FIDO2-ключ.=== 16.1. KPI адміністратора безпеки ===

 const verifyResponse = await fetch("/api/v1/security/webauthn/registration/verify", {
=== 14.3. Збереження credential ===
! ! |}

<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">

 event_type="WEBAUTHN_LOGIN_SUCCESS",
{| class="wikitable"
 });
 "CREATE_API_TOKEN",
|-
| id
| uuid
| ID події. MDN описує `PublicKeyCredential` як credential для входу в сервіс через стійку до phishing і витоків пару асиметричних ключів  public/private key pair  замість пароля. expected_origin="https://erp.example.com",
<syntaxhighlight lang="python">
 credential = webauthn_credential_repository.create(

 "id": "erp.example.com",
=== 12.2. webauthn_challenges ===
 "CHANGE_BANK_DETAILS",
 "public_key": verification_result ["public_key"],
Backend K2 ERP повинен перевірити:
 }
== 15. Recovery та втрата credential ==
 assertion_response=assertion_response,

[[Категорія:Кібербезпека]]

 "userVerification": "required",
<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
! |}

{| class="wikitable"

 is_valid = webauthn_service.verify_assertion(
Browser WebAuthn API
'''Орієнтир стандарту:''' WebAuthn  це W3C Web Authentication API для доступу до public key credentials. |-
| credential_record_id
| uuid
| Credential, якщо виступає як. |-
| authenticator_type
| varchar
| PLATFORM або ROAMING. |-
| AC-16
| Адміністратор відкриває dashboard WebAuthn. Роль
</div>

 if context and context.get("remote_access") is True:
<pre>
 )

=== 18.5. Dashboard ===

 },

K2 ERP Frontend
 },
 method: "POST",
=== 18.1. Реєстрація WebAuthn ===

 audit_logger.log(
== 13. Приклад frontend-логіки ==
 },
 return True
POST /api/v1/security/webauthn/authentication/verify
 "pubKeyCredParams": [
6. Якщо все коректно  створюється сесія K2 ERP. Frontend викликає navigator.credentials.get(). | Загальна технологічна основа WebAuthn + CTAP2. |-
| backup_state
| boolean
| Чи credential зараз у backup-синхронізації. Дія

11. |-
| AC-2
| користувач системи додає hardware security key. |-
| Private key
| Приватний ключ, який залишається в автентифікаторі. !=== 11.4. Завершити автентифікацію ===

<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
 const optionsResponse = await fetch("/api/v1/security/webauthn/registration/options", {
RP ID і Origin  критичні для безпеки WebAuthn. |-
| AC-5
| RP ID неправильний. SEO-опис

Session Service / Step-up Action Service

 "rp_id": verification_result.get("rp_id"),

* challenge збігається з тим, який був створений сервером;
* challenge не прострочений;
* origin дозволений;
* RP ID правильний;
* credential ще не зареєстрований;
* user_id відповідає активному користувачу;
* user verification виконано, якщо це вимагається політикою;
* алгоритм підпису підтримується;
* public key коректно витягнуто та збережено;
* credential_id унікальний. |-
| Roaming authenticator
| Переносний автентифікатор. ! POST /api/v1/security/webauthn/credentials/{credential_id}/revoke
 {"type": "public-key", "alg": -257}
 )

! WebAuthn перевіряє привязку credential до правильного домену, тому фішинговий сайт не зможе використати ключ для входу в справжню K2 ERP. SEO-опис
</div>
</div>
 if user.role in ["SUPER_ADMIN", "ADMIN", "CFO", "CHIEF_ACCOUNTANT"]:
[[Категорія:ERP]]
<pre>
{{SEO
|title=WebAuthn для ERP
|description=Стаття про WebAuthn для ERP-систем: що таке WebAuthn, як працює реєстрація та вхід, RP ID, origin, challenge, credential, passkeys, security keys, FIDO2, модель даних, API, безпека, dashboard та Acceptance Criteria.
|keywords=WebAuthn, FIDO2, passkeys, security key, K2 ERP, ERP security, MFA, 2FA, phishing-resistant MFA, PublicKeyCredential, CTAP2, Web Authentication API
}}

{| class="wikitable"
! |-
| device_name
| varchar
| Назва пристрою або ключа. |-
| AC-11
| Адміністратор створює API token.=== 12.1. webauthn_credentials ===

* бухгалтерський обліковий облік;
* фінансовий блок;
* HR;
* керівники;
* віддалені користувачі;
* поступова відмова від SMS. |
 | verify challenge, origin, rpId, signature
=== 5.1. Бізнес-процес ===
! | дає можливість використовувати USB/NFC/BLE security key. Очікуваний результат
!== 18. Acceptance Criteria ==

* super admin;
* адміністратори;
* фінансовий директор;
* провідний бухгалтер;
* 510 power users;
* перевірка recovery;
* перевірка step-up дій. Очікуваний результат

 "publicKey": {
def create_webauthn_registration_options(user: "User", db: "Session") -> dict:
<pre>

! | платформа вимагає step-up WebAuthn. |-
| AC-12
| користувач системи запускає масовий експорт. '''Критично критично:''' recovery-процедура не повинна обходити WebAuthn без контролю. audit_logger.log(
! | Він підсвічується червоним або помаранчевим. Приклад

! body: JSON.stringify(credential)
 db.commit()
! | K2 ERP. * MDN PublicKeyCredential. * W3C WebAuthn Level 2. WebAuthn можна використовувати не тільки для входу, а й для повторного підтвердження небезпечних операцій. | Windows Hello, Touch ID, Face ID, Android passkey. Стан
 if not credential or credential.status != "ACTIVE":
|-
| RP ID
| erp.example.com
| Домен, до якого привязується credential. Тип
 return False
K2 ERP Backend
|-
| AC-10
| користувач системи змінює банківські реквізити. | платформа вимагає step-up WebAuthn. ! ! |-
| AC-19
| виступає як втрачений credential. | PIN, Touch ID, Face ID, Windows Hello. | style="background:#c8e6c9;" | Step-up WebAuthn адміністратора. | дає можливість K2 ERP реєструвати ключі та перевіряти вхід. |-
| CTAP2
| Протокол взаємодії браузера / ОС із зовнішнім автентифікатором. | Вхід відхиляється. Очікуваний результат
</pre>

 });

7. {| class="wikitable"

{| class="wikitable"

* credential_id існує;
* credential активний;
* credential не відкликаний;
* challenge збігається;
* challenge не прострочений;
* origin дозволений;
* RP ID hash правильний;
* підпис assertion валідний;
* user verification відповідає політиці;
* sign_count не зменшився, якщо автентифікатор його підтримує;
* користувач системи не заблокований;
* політика ролі дає можливість цей метод входу. | style="background:#ffcc80;" | Рекомендовано
|-
| style="background:#ffcc80;" | Керівники
| Управлінська формування звітів, фінансові показники. |-
| rp_id
| varchar
| RP ID. * FIDO Alliance: Passkeys. Для production K2 ERP список дозволених origin має бути жорстко визначений. | Він підсвічується червоним. | style="background:#ef9a9a;" | Обовязково
|-
| style="background:#ffcc80;" | HR / зарплата
| Персональні та зарплатні інформаційні дані. * FIDO Alliance: User Authentication Specifications Overview. |-
| payload
| jsonb
| Технічні інформаційні дані без секретів. | Опційно застосовується для під час реєстрації. |-
| user_agent
| text
| Браузер / пристрій. |-
| created_at
| timestamp
| Дата створення. | https://erp.example.com.
|-
| Challenge
| Випадкові інформаційні дані, які сервер створює для реєстрації або входу. | Перевіряється сервером. * Внутрішні вимоги K2 ERP до доступів, MFA, WebAuthn, журналювання та критичних дій. )

[[Категорія:MFA]]
== 1. Що таке WebAuthn ==
</pre>
<pre>
 ],
=== 6.1. Бізнес-процес ===
4. |-
| created_at
| timestamp
| Дата. |-
| user_id
| uuid
| користувач системи. | Зберігається в K2 ERP. |-
| Credential ID
| Ідентифікатор зареєстрованого ключа. |}

=== 11.8. Step-up WebAuthn ===

ERP  це платформа, де викрадений доступ здатна призвести не тільки до витоку даних, а й до прямої фінансової шкоди. |-
| AC-7
| користувач системи використовує невідомий credential. |-
| rp_id
| varchar
| RP ID. Натискає «Додати passkey / security key». |-
| transport
| varchar
| USB, NFC, BLE, INTERNAL. | Не передається в K2 ERP. |-
| Platform authenticator
| Автентифікатор, вбудований у пристрій. |-
| Assertion
| Підпис challenge під час входу. Окремо варто відзначити вбудований у браузери і платформи для підтримки FIDO Authentication, а CTAP2 дає можливість використовувати зовнішні автентифікатори через USB, NFC або BLE. |-
| AC-3
| Challenge прострочений. db=db,

! |-
| credential_id
| text
| WebAuthn credential ID. це не без зусиль ще один спосіб 2FA виступає ключовою рисою '''Критично критично:''' WebAuthn. |-
| Origin
| Повний origin web-додатку. |
 "status": "PENDING",
5. | style="background:#c8e6c9;" | Step-up WebAuthn + погодження. });
9. | style="background:#ef9a9a;" | Обовязково
|-
| style="background:#ef9a9a;" | Фінансовий директор
| Банки, платежі, бюджети, управлінська формування звітів. Що означає
'''Ризик без WebAuthn:''' SMS, email-код або TOTP можуть бути введені на фальшивому сайті. Критерій
== 12. Модель даних WebAuthn ==

!=== 6.2. Важливі перевірки під час входу ===
</pre>
 data={
 audit_logger.log(
 return await verifyResponse.json();
 const optionsResponse = await fetch("/api/v1/security/webauthn/authentication/options", {
=== 18.4. Recovery ===
== 11. API K2 ERP для WebAuthn ==

 body: JSON.stringify({ email })

=== Етап 3. Технічна реалізація ===
 "transport": verification_result.get("transport"),
У K2 ERP можуть бути:
<syntaxhighlight lang="javascript">
! |-
| RP ID
| Домен, до якого привязаний credential. const options = await optionsResponse.json();

 user_id=user.id,
== Див. 21. так само ==
 "expires_at": utc_now_plus_minutes(5),

async function loginWithWebAuthn(email) {

 )

* W3C WebAuthn Level 3. Frontend передає assertion response на backend. Критерій
<pre>

 "residentKey": "preferred"
 )
! ! Поле

 require_user_verification=True,

 });
10. |-
| AC-17
| виступає як admin без WebAuthn. Показник

 "status": "ACTIVE",

! |}

 const verifyResponse = await fetch("/api/v1/security/webauthn/authentication/verify", {

</pre>
Credential Storage + Audit Log
<pre>
1. |-
| Super Admin із WebAuthn
| 100%
| style="background:#c8e6c9;" | Норма
|-
| Адміністраторів із WebAuthn
| 100%
| style="background:#c8e6c9;" | Норма
|-
| Фінансових ролей із WebAuthn
| 82%
| style="background:#ffcc80;" | Потрібна дія
|-
| Бухгалтерів із WebAuthn
| 76%
| style="background:#ffcc80;" | Потрібна дія
|-
| Користувачів тільки з SMS
| 18
| style="background:#ef9a9a;" | Замінити
|-
| Втрачених credentials
| 2
| style="background:#ffcc80;" | Контроль
|-
| Credentials без використання понад 90 днів
| 11
| style="background:#fff9c4;" | Перевірити
|-
| Підозрілих WebAuthn-помилок
| 3
| style="background:#ef9a9a;" | Критично
|}

== 8. Де WebAuthn має бути обовязковим у K2 ERP ==

 expected_rp_id="erp.example.com",
challenge = webauthn_service.generate_challenge()

Червона зона: адміністратори, фінансовий блок, бухгалтерський обліковий облік або керівники входять у ERP через пароль, SMS або email-код без WebAuthn. | erp.example.com або example.com. |- | backup_eligible | boolean | Чи здатна credential бути синхронізованим. FIDO Alliance описує WebAuthn як стандартний web API. | style="background:#ef9a9a;" | Обов’язково |- | style="background:#ef9a9a;" | Адміністратор | Ролі, права, конфігурація, API token, інтеграції. Рівень

! |- | Неправильний origin | https://fake-erp.example.net | Повинен бути відхилений. Критерій

|

2. WebAuthn, FIDO2, CTAP2 і passkeys

11.3. Почати автентифікацію

! |- | expires_at | timestamp | Строк дії. №

db=db,
payload={

! | Реєстрація відхиляється. const assertion = await navigator.credentials.get({ 6. | платформа вимагає step-up WebAuthn і логування. credential = webauthn_credential_repository.get_by_credential_id(

if not is_valid:
event_type="WEBAUTHN_CREDENTIAL_REGISTERED",
MDN зазначає, що public key credential здатна використовуватись для автентифікації тільки з тим самим relying party, з яким він був зареєстрований, і RP ID має збігатися під час `navigator.credentials.get()`. користувач системи входить у K2 ERP. | Він бачить покриття WebAuthn по ролях. async function registerWebAuthnCredential() {

3. Чому WebAuthn важливий саме для ERP

} "origin": "https://erp.example.com",

5. Як функціонує реєстрація WebAuthn

return user.security_policy.require_webauthn_for_remote_access "timeout": 300000, Головне правило: для ERP, яка керує фінансами, зарплатами, договорами, складом і управлінською звітністю, WebAuthn має стати стандартом для критичних ролей.
v headers: { "Content-Type": "application/json" }

11.6. Відкликати credential

v
"rp_id": "erp.example.com",
headers: { "Content-Type": "application/json" },
"CHANGE_USER_ROLE",

14. Приклад Python-логіки

користувач системи здатна втратити пристрій, security key або доступ до passkey. |}

</syntaxhighlight>

Критерій
"challenge": challenge,
}
return await verifyResponse.json();

У контексті K2 ERP WebAuthn дає можливість: POST /api/v1/security/webauthn/registration/options

headers: { "Content-Type": "application/json" },
{"type": "public-key", "alg": -7},
return False
return True
Критично критично: не можна дозволяти wildcard origin або приймати будь-який домен. | style="background:#c8e6c9;" | Step-up WebAuthn + двоетапне погодження. Frontend викликає navigator.credentials.create(). |-
Super Admin Він показується в контрольному списку. Контроль
credential_id=assertion_response ["credential_id"],

Це основа сучасної phishing-resistant автентифікації, яка дає можливість K2 ERP захищати адміністраторів, фінансовий блок, бухгалтерію, HR, керівників і критичні операції краще, ніж SMS, email-коди або звичайні OTP. |-

Створення API token Прихований доступ до ERP. | style="background:#ffcc80;" | Рекомендовано
Масовий експорт }

def verify_webauthn_login(user: "User", assertion_response: dict, db: "Session") -> bool:

POST /api/v1/security/webauthn/step-up/verify

Поле
Зміна банківських реквізитів Підміна рахунку. "user": {
  • WebAuthn registration;
  • WebAuthn authentication;
  • credential storage;
  • challenge storage;
  • RP ID validation;
  • origin validation;
  • sign_count validation;
  • credential revocation;
  • lost credential flow;
  • WebAuthn events;
  • dashboard. headers: { "Content-Type": "application/json" },
public_key=credential.public_key,
return credential },

Етап 4. Пілот

Етап 1. Аудит доступів

Значення
v
 user_id=user_id,
! |-
| FIDO2
| Набір стандартів для сильної автентифікації. Автентифікатор підписує challenge приватним ключем. |-
| last_used_at
| timestamp
| Останнє використання. ]:

4. Чому потрібен WebAuthn

* реєструвати passkeys;
* реєструвати hardware security keys;
* входити без пароля або з сильним другим фактором;
* виконувати step-up підтвердження критичних дій;
* захищати користувачів від phishing;
* зберігати в ERP тільки публічний ключ, а не секрет користувача. def is_webauthn_required(user: "User", action: str | None = None, context: dict | None = None) -> bool:

* визначити ролі, для яких WebAuthn обовязковий;
* визначити дозволені типи credential;
* визначити, чи дозволені synced passkeys;
* визначити, чи потрібні hardware keys для admin;
* визначити recovery-процедуру;
* визначити step-up WebAuthn для критичних дій. | YubiKey, Feitian, Titan Key або інший FIDO2-ключ. |-
| AC-18
| виступає як користувач системи тільки з SMS. Роль у K2 ERP
{| class="wikitable"
 v
{| class="wikitable"
</div>
7. | Credential реєструється, public key зберігається. | Потрібне погодження другим адміністратором. |-
| Passkey
| FIDO credential, привязаний до акаунта користувача. |-
| risk_score
| integer
| Оцінка ризику. Очікуваний результат
"credential_id": verification_result ["credential_id"],

18.2. Вхід через WebAuthn

10. технічна архітектура WebAuthn у K2 ERP

__TOC__
 "credential_record_id": str(credential.id),
 "aaguid": verification_result.get("aaguid"),

Backend K2 ERP повинен перевірити:

! |-
| Масовий експорт клієнтів
| style="background:#ef9a9a;" | Витік бази. |}

<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
! |-
| created_at
| timestamp
| Дата створення. |-
| AC-9
| Admin не має WebAuthn.== 19. Висновок ==

14.4. Перевірка входу

"MASS_EXPORT",
AC-1 }
"name": user.email,

POST /api/v1/security/webauthn/step-up/options

"sign_count": verification_result.get("sign_count", 0),
});
db.commit()
if action in [
- status varchar PENDING, PASSED, FAILED, EXPIRED. ! Ризик

</syntaxhighlight>


* фінансові документи;
* банківські виписки;
* платежі;
* зарплати;
* податкові інформаційні дані;
* договори;
* контрагенти;
* реквізити;
* ціни;
* знижки;
* залишки;
* виробництво;
* управлінська формування звітів;
* інтеграції з банками, ПРРО, маркетплейсами, доставкою та електронним підписом. Тип
 "authenticator_type": verification_result.get("authenticator_type"),
! |}

POST /api/v1/security/webauthn/registration/verify

def save_webauthn_credential(user_id: str, verification_result: dict, db: "Session") -> "WebAuthnCredential":
=== 18.3. Step-up WebAuthn ===
 |
 | navigator.credentials.create()
 | navigator.credentials.get()
=== 13.2. Вхід через WebAuthn ===
 "user_id": user_id,
 |
 "challenge": challenge,
3.<syntaxhighlight lang="python">

 credential.last_used_at = utc_now()

=== 11.2. Завершити реєстрацію credential ===

</syntaxhighlight>
{{DISPLAYTITLE:WebAuthn для ERP: стандарт безпечного входу в K2 ERP через FIDO2 та passkeys}}
 "backup_state": verification_result.get("backup_state"),
 return False
|-
| id
| uuid
| ID запису. |-
| Зміна ролі користувача
| style="background:#ef9a9a;" | Розширення доступу. користувач системи відкриває K2 ERP. SEO-опис
 method: "POST",

 "displayName": user.full_name,

== 4. Основні поняття WebAuthn ==
=== 11.5. Список credential користувача ===
 "APPROVE_PAYMENT",
 v
|-
| Relying Party
| Сервіс, який виконує автентифікацію користувача. | style="background:#ffcc80;" | Step-up WebAuthn
|}

 "name": "K2 ERP",

 payload={"credential_record_id": str(credential.id)},

! Такі credentials прив’язані до акаунта користувача на сайті чи в застосунку. |-
| sign_count
| integer
| Лічильник підписів, якщо підтримується. K2 ERP створює authentication challenge. №
1. |-
| status
| varchar
| ACTIVE, LOST, DISABLED, REVOKED. Тип

=== 5.2. Важливі перевірки під час реєстрації ===
 "user_id": user.id,
</div>
! |}

 },

=== Етап 2. Політика WebAuthn ===
 return {
=== 14.1. Перевірка, чи потрібен WebAuthn ===
 )
|-
| AC-6
| користувач системи входить через passkey. | Реєстрація відхиляється. SEO-опис

2. '''Зелена зона:''' K2 ERP використовує WebAuthn / passkeys / security keys для критичних ролей, step-up WebAuthn для небезпечних операцій, dashboard покриття credentials, журнал подій і контроль recovery. Браузер звертається до passkey або security key. | Подія логуються, користувач системи реєструє новий credential. |-
| ip_address
| varchar
| IP. У K2 ERP зберігаються тільки public key, credential_id, sign_count, metadata і статус credential. Backend перевіряє challenge, origin, RP ID і зберігає credential. | Base64url random bytes. "id": str(user.id),
|-
| AC-13
| користувач системи повідомляє про втрату ключа. Backend знаходить credential_id і public key. Роль / зона

POST /api/v1/security/webauthn/credentials/{credential_id}/mark-lost

user_id=user.id,
Passkey — це FIDO-облікові інформаційні дані, які дозволяють входити в застосунки та сайти так само, як користувач системи розблоковує пристрій: біометрією, PIN або pattern.

WebAuthn функціонує через об’єкт `PublicKeyCredential`. |-

Attestation } Ризик
webauthn_challenge_repository.create(

}

13.1. Реєстрація passkey / security key

},

14.2. Створення registration options

- AC-8 - aaguid varchar Ідентифікатор моделі автентифікатора. №
method: "POST",
)
Зручний вхід у K2 ERP через пристрій, біометрію або PIN. | Credential позначається LOST або REVOKED. | Вхід блокується або вимагається реєстрація WebAuthn. | Credential реєструється як roaming authenticator. |- user_id uuid - AC-14 Admin recovery.== 20. Джерела ==

16. Dashboard WebAuthn

11.7. Позначити credential як втрачений

body: JSON.stringify(assertion)
"user_verified_required": True,

10. |-

User verification Перевірка користувача на пристрої. 8. GET /api/v1/security/webauthn/credentials
publicKey: options.publicKey
"rp": {
payload={"credential_record_id": str(credential.id)},

12.3. webauthn_events

return True

Етап 5. Масове впровадження

! 3. Поточний метод
"authenticator_type": credential.authenticator_type,
const credential = await navigator.credentials.create({
=== 16.2. Проблемні користувачі ===