Паролі додатків (авторизація)
У WordPress 5.6 введено нову систему створення авторизованих запитів до різних API WordPress, зокрема до REST API. Ця система називається – Application Passwords (паролі додатків).
Якщо говорити просто, то паролі додатків потрібні для того, щоб дати можливість додатку авторизуватися як користувач сайту (з тими ж правами), але при цьому не давати пароль від облікового запису. Пароль створюється в профілі окремо і не зберігається в чистому вигляді в базі даних (зберігатися він у вигляді хеша). Таких паролів можна створити скільки завгодно багато. Також будь-який із створених паролів у будь-який момент може бути відкликаний (видалений).
Існуюча система автентифікації на основі файлів cookie нікуди не видаляється, і все, що працювало на цій основі, буде працювати як і раніше.
Логіка паролів програм була взята з плагіна Application Passwords , тому рекомендується його деактивувати після оновлення до WordPress 5.6. Втім, якщо його залишити активним, сайт все одно має працювати без помилок. Цей плагін можна використовувати для майбутнього прототипування.
Формат Пароля програми
Довжина пароля вказується константою wp_generate_password() , у якій відключено використання спеціальних символів. Виходить, пароль може складатися із символів: a-zA-Z0-9
– малих, великих букв, чисел.
На виводі пароль ділитися на фрагменти по 4 символи, наприклад:
abcd EFGH 1234 ijkl MNOP 6789
Паролі програм можна використовувати як з пробілами, так і без них . Пробіли будуть просто видалені до того, як пароль буде перевірено. Замість пробілів можна також використовувати символи _
та -
.
abcd_EFGH_1234_ijkl_MNOP_6789 abcd-EFGH-1234-ijkl-MNOP-6789
А ось так паролі очищаються від зайвих символів (пробіл, тире) перед порівнянням:
/* * Strip out anything non-alphanumeric. This is so passwords can be used with * або без областей для визначення групування для readability. * * Generated application passwords є exclusively alphanumeric. */ $password = preg_replace( '/[^azd]/i', '', $password );
Зберігання даних
Хеш пароля буде зберігатися як масиву в метаполі користувача _application_passwords
, як і зараз зберігатися сесія логіна, див. WP_Session_Tokens .
Приклад значення метаполя _application_passwords
:
Array ( [0] => Array ( [uuid] => fbadcb50-4385-4701-96a6-9a4f07527d08 [app_id] => [name] => My Aplication [password] => $P$Bui9Czv.OEQ6ES6YYMWge8/e.qmWJP/ [created] => 1607599946 [last_used] => [last_ip] => ) )
Як видно, дані мають унікальний ID пароля uuid, Назва програми, Дата створення пароля, дані останнього використання ключа.
Клас WP_Application_Passwords містить усі необхідні методи для збереження та отримання пароля.
Створення Пароля програми
Читайте також: Встановлення свого пароля для програми .
Є 3 способи створити Пароль для програми.
Спосіб 1: на сторінці профілю в адмінці WP
Тут можна дивитися які паролі використовуються і якщо потрібно видаляти паролі.
Цей блок доступний лише якщо сайт працює за https .
При авторизації з використанням конкретного пароля в таблиці з’явиться дані, коли і ким він був використаний. Це поля last_used
та last_ip
.
Дані в ці поля записуватимуться один раз і оновляться через 24 години при повторному використанні цього пароля. Це невелика оптимізація продуктивності, щоб не оновлювати метадані щоразу під час запиту.
Спосіб 2: спеціальна сторінка в адмінці/authorize-application.php
Цей спосіб створений для використання самим додатком.
При звичайному GET запиті на кореневий маршрут REST /wp-json/
у відповіді, в полі authentication
містяться дані про способи авторизації. З версії WP 5.6 там з’явилася авторизаціяapplication-passwords
, в якій зазначено посилання, яке можна дати користувачеві сайту. Пройшовши за цим посиланням користувач авторизує вашу програму (створить для нього пароль за яким програма зможе спілкуватися з сайтом від імені користувача).
{ "name": "wptest.dev", "description": "Ще один сайт на WordPress", "url": "http://example.com/wp", "home": "https://example.com", "namespaces": [ "oembed/1.0", "wp/v2", "wp-site-health/v1" ], "authentication": { "application-passwords": { "endpoints": { "authorization": "https://example.com/wp/wp-admin/authorize-application.php" } } }, "routes": {...} }
Якщо такого посилання немає, то, швидше за все, сайт не використовує HTTPS протокол або цю можливість має намір відключити.
Значення JSON властивості response.authentication['application-passwords'].endpoints.authorization
зазвичай виглядає так:
https://example.com/wp-admin/authorize-application.php
Пройшовши за цим посиланням, можна також як і вище створити черговий пароль програми.
Однак, якщо вас на таке посилання надсилає програма, то в неї можна передати додаткові параметри GET. Щоб не потрібно було вводити ім’я та ID програми. Доступні GET параметри:
-
app_name
(рядок) (рекомендується вказати) -
Назва програми, зрозуміла для людини. Це ім’я стане ім’ям створеного пароля (за ним ви зможете орієнтуватись). Наприклад:
WordPress Mobile App on iPhone 12
. -
app_id
(UUID) (рекомендується вказати) -
Ідентифікатор програми
у форматі UUID . Цей ID дозволяє ідентифікувати конкретну програму. Особливого значення цього ID немає. Ви, як розробник, можете використовувати його для пошуку всіх паролів додатків, створених для вашої програми. -
success_url
(рядок) (рекомендується вказати) - URL-адреса, на яку користувач перейде після створення пароля. При цьому вказана URL буде додано 3 додаткові GET параметри:
site_url
,user_login
,password
. Ці дані потрібно зберегти в додатку, щоб авторизуватися API.Якщо цей параметр не вказано, то при натисканні на кнопку створення пароля користувача нікуди не перенаправить, а йому буде показаний створений пароль. Його йому потрібно буде ввести у додаток.
-
reject_url
(рядок) - URL-адресу, на яку надіслати користувач при відмові від створення пароля.
Якщо не вказано, то користувача відправить на
success_url
параметр?success=false
. Якщо не вказано таsuccess_url
, то користувача перенаправить у консоль.
Тепер розглянемо на прикладі, як це працює. Допустимо ми отримали наступне посилання від програми (для зрозумілості переніс параметри на окремі рядки):
https://example.com/wp-admin/authorize-application.php ?app_name=My Site On Android &app_id=d2321b5c-edf0-4a3c-9223-4719f8e6b028 &success_url=https://example.com/auth-ok &reject_url=https://example.com/auth-error
Перейдемо за посиланням:
Тепер при натисканні на «Так, я дозволяю…» буде створено пароль і користувача перекине на посилання
https://example.com/auth-ok ?site_url=https://example.com/wp &user_login=kama &password=GENERATED_PASS
Нічого страшного, якщо користувачеві спочатку потрібно увійти на сайт. Оскільки параметри передаються через GET змінні, всі вони потраплять до параметра ?redirect=...
і після авторизації на сайті користувач зможе продовжити авторизацію програми.
success_url
і reject_url
повинні використовувати https://
з’єднання або протоколи додатків myapp://
, інакше користувач побачить таке повідомлення.
Ось приклад простого javascript-додатку (менше 100 рядків коду), який використовує його для автентифікації на WordPress. Це не найакуратніший код, він був створений за пару годин, але в ньому видно, як потрібно робити авторизовані запити.
Спосіб 3: REST API
POST запит на маршрут /wp/v2/users/{id}/application-passwords
. Детальніше дивіться тут .
Спосіб 4: Функція create_new_application_password()
WP_Application_Passwords ::create_new_application_password()
Використання Пароля програми
Пароль програми не буде працювати на сторінці wp-login.php
. Він створений для програм, а чи не людей.
REST API
Пароль може бути переданий у REST запиті https://
через Basic авторизацію .
Тобто. вам потрібно передати в заголовках запиту параметр Authorization
із значенням Basic base64(login:password)
.
Дивіться також приклад оновлення запису (поста) через REST і пароль програми .
HTTP API авторизація через Пароль програми
$response = wp_remote_request( 'http://example.com/wp-json/wp/v2/posts/113', [ 'method' => 'DELETE', 'headers' => [ 'Authorization' => 'Basic' . base64_encode( 'login:abcd_EFGH_1234_ijkl_MNOP_6789' ) ] ] ); if( 200 == wp_remote_retrieve_response_code( $response ) ) echo 'Піст видалено!'; else echo 'Помилка: Не вдалося видалити пост';
Дивіться також: WP HTTP API
JavaScript авторизація через Пароль програми
Така авторизація потрібна лише якщо надсилається AJAX запит з одного сайту на інший. Якщо AJAX запит відбувається всередині сайту, і користувач вже авторизований, то разом із запитом буде відправлено куки аутентифікації, а це означає, що авторизація вже є, потрібно тільки вказати nonce-код ( див. вище ).
Зверніть увагу, що такий JS повинен підключатися на сторінках куди мають доступ тільки адміни або будь-який зможе відкрити js файл і подивитися логін і пароль.
$.ajax({ url: 'http://example.com/wp-json/wp/v2/posts/113', method: 'DELETE', crossDomain: true, beforeSend: function ( xhr ) { xhr.setRequestHeader( 'Authorization', 'Basic' + Base64.encode( 'login:abcd_EFGH_1234_ijkl_MNOP_6789' ) ); }, success: function( data, txtStatus, xhr ) { console.log(data); console.log(xhr.status); } });
CLI авторизація через Пароль програми
Оновимо опис у користувача 12
curl -X PUT -d "description=Опис користувача" --user "login:aaaa ssss d3d3 f4f4 g5g5 h6h6" https://example.com/wp-json/wp/v2/users/12 | json_pp
Видалимо пост 12
curl -X DELETE --user "login:aaaa ssss d3d3 f4f4 g5g5 h6h6" https://example.com/wp-json/wp/v2/posts/12 | json_pp
| json_pp
(JSON Pretty Print) потрібно, щоб JSON відповідь не була в один рядок.
XML-RPC API
Щоб використовувати пароль програми XML-RPC API, ви можете використовувати його замість реального пароля облікового запису.
Приклад запиту командного рядка. У ньому вам потрібно просто замінити логін, пароль та ім’я хоста:
curl -H 'Content-Type: text/xml' -d '<methodCall><methodName>wp.getUsers</methodName><params><param><value>1</value></param><param>< value>USERNAME</value></param><param><value>PASSWORD</value></param></params></methodCall>' https://HOSTNAME/xmlrpc.php
Інші API
Аутентифікацію через пароль програми також можна буде застосувати до майбутнього API WordPress. Наприклад, якщо GraphQL буде додано до WordPress, паролі додатків забезпечать йому усталену логіку автентифікації, яка працюватиме з коробки.
Приклад перевірки чи є поточний запит запитом до якогось API для WPGraphQL . Тепер WPGraphQL зможе приймати автентифіковані запити без додаткових плагінів, використовуючи лише функціонал паролів додатків.
нотатки
За промовчанням паролі програм доступні всім користувачам на сайтах, що обслуговуються за протоколом SSL/HTTPS . Змінити доступ можна за допомогою фільтрів wp_is_application_passwords_available_for_user .
Наприклад, щоб повністю відключити паролі додатків, додайте такий код до functions.php :
add_filter( 'wp_is_application_passwords_available', '__return_false');
Без SSL зловмисник буде бачити пароль програми у перехопленому запиті між вашим сайтом та програмою. Якщо такий ризик вас влаштовує, можна повністю вимкнути перевірку доступності паролів програми.
add_filter( 'wp_is_application_passwords_available', '__return_true');
За бажанням можна обмежити, які користувачі можуть використовувати функцію паролів додатків на вашому сайті. Наприклад, використовуйте наступний код, щоб дозволити використання паролів програм тільки для адміністраторів:
add_filter( 'wp_is_application_passwords_available_for_user', 'fix_app_password_availability', 10, 2); function fix_app_password_availability( $available, $user ){ if ( ! user_can( $user, 'manage_options' ) ) { $available = false; } return $available; }
Подальший розвиток
Область доступу
У майбутніх версіях передбачається включити обмеження доступу для конкретного пароля. Поки що передбачається розширювати такий функціонал через плагіни, які потім будуть додані в ядро.
Більше відповідні права
Наразі паролями додатків користувача може керувати будь-який користувач, який має право edit_user
. Можливість настроїти цю поведінку за допомогою нового набору більш тонких можливостей запланована на WP 5.7 .
Двофакторна автентифікація
Введені паролі додатків усувають перешкоди для включення багатофакторної автентифікації.
Раніше при включенні ще одного фактора аутентифікації на сторінці входу wp-login.php
. Не було можливості впровадити таку саму авторизацію на застарілу систему XML-RPC. І від цієї функціональності довелося відмовитися. Але тепер, коли є інший варіант використовувати різні API, також з’являється можливість розвивати базову авторизацію через wp-login.php
.
Пов’язані функції
Усі функції дивіться тут .
wp_authenticate_application_password() | Авторизує користувача використовуючи Basic авторизацію . |
wp_is_application_passwords_available() | Перевіряє, чи можна використовувати Паролі програм для поточного запиту. |
–
Посилання по темі: