Що означає RESTful Authentication і як це працює? Я не можу знайти хороший огляд в Google. Я розумію лише те, що ви передаєте ключ сеансу (ребераль) в URL, але це може бути жахливо неправильним.
Що означає RESTful Authentication і як це працює? Я не можу знайти хороший огляд в Google. Я розумію лише те, що ви передаєте ключ сеансу (ребераль) в URL, але це може бути жахливо неправильним.
Відповіді:
Як обробляти автентифікацію в архітектурі RESTful Client-Server - це питання дискусії.
Зазвичай це може бути досягнуто у світі SOA через HTTP за допомогою:
Вам доведеться адаптувати або навіть краще змішати ці методи, щоб найкраще відповідати вашій архітектурі програмного забезпечення.
Кожна схема аутентифікації має свої PRO та CON, залежно від мети вашої політики безпеки та архітектури програмного забезпечення.
Базовий протокол HTTP через HTTPS
Це перше рішення, засноване на стандартному протоколі HTTPS, використовується більшості веб-сервісів.
GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Це легко здійснити, доступний за замовчуванням у всіх браузерах, але має деякі відомі недоліки, наприклад, жахливе вікно автентифікації, відображене в браузері, яке зберігатиметься (тут немає функції, схожої на LogOut), деяке додаткове споживання процесора на стороні сервера, і той факт, що ім’я користувача та пароль передаються (через HTTPS) на Сервер (слід бути більш захищеним, щоб пароль залишався лише на стороні клієнта під час введення на клавіатурі та зберігався як захищений хеш на сервері) .
Ми можемо використовувати дайджест аутентифікації , але він також вимагає HTTPS, оскільки він уразливий для атак MiM або Replay і специфічний для HTTP.
Сесія через куки
Якщо чесно, сеанс, керований на сервері, не справді без громадянства.
Однією з можливостей може бути збереження всіх даних у вмісті файлів cookie. І, за задумом, файл cookie обробляється на стороні Сервера (Клієнт насправді навіть не намагається інтерпретувати дані файлів cookie: він просто повертає його назад на сервер при кожному наступному запиті). Але ці файли cookie є даними про стан додатків, тому клієнт повинен керувати ними, а не сервером у чистому світі без громадянства.
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
Сама техніка файлів cookie пов'язана з HTTP, тому вона не є справді RESTful, яка повинна бути незалежною від протоколу, IMHO. Він уразливий для атак MiM або Replay .
Надано через Token (OAuth2)
Альтернативно - помістити маркер у заголовки HTTP, щоб запит був аутентифікований. Так, наприклад, робить OAuth 2.0. Дивіться RFC 6749 :
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer mF_9.B5f-4.1JqM
Коротше кажучи, це дуже схоже на файл cookie і страждає від одних і тих самих питань: не без громадянства, покладаючись на деталі передачі HTTP, і з урахуванням багатьох недоліків у безпеці - включаючи MiM та Replay - тому слід використовувати лише через HTTPS. Зазвичай JWT використовується як маркер.
Перевірка автентичності
Автентифікація запитів полягає у підписанні кожного запиту RESTful через деякі додаткові параметри URI. Дивіться цю посилальну статтю .
У цій статті було визначено як таке:
Усі REST-запити повинні бути аутентифіковані, підписуючи параметри запиту, відсортовані в нижньому регістрі, в алфавітному порядку, використовуючи приватний обліковий запис як маркер підписання. Підписання має відбуватися перед URL-кодуванням рядка запиту.
Ця методика, можливо, є більш сумісною з архітектурою без стану, і також може бути реалізована за допомогою легкого управління сеансами (використовуючи сеанси в пам'яті замість стійкості БД).
Наприклад, ось загальний зразок URI за посиланням вище:
GET /object?apiKey=Qwerty2010
має передаватися як таке:
GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789
Рядок, що підписується, є, /object?apikey=Qwerty2010×tamp=1261496500
а підпис - це хеш SHA256 цієї рядки з використанням приватного компонента ключа API.
Кешування даних на стороні сервера завжди може бути доступним. Наприклад, в нашій рамках ми кешуємо відповіді на рівні SQL, а не на рівні URI. Тому додавання цього додаткового параметра не порушує механізм кешування.
Дивіться цю статтю для отримання детальної інформації про RESTful аутентифікацію в нашій системі ORM / SOA / MVC клієнт-сервер, заснованої на JSON та REST. Оскільки ми дозволяємо спілкуватися не тільки через HTTP / 1.1, але також іменованими каналами або GDI-повідомленнями (локально), ми намагалися реалізувати справді схему аутентифікації RESTful, а не покладатися на специфіку HTTP (наприклад, заголовка чи куки).
Пізніша примітка : додавання підпису в URI можна сприймати як погану практику (оскільки, наприклад, вона з’явиться в журналах http-сервера), тому її необхідно пом'якшити, наприклад, належним TTL, щоб уникнути повторів. Але якщо ваші http-журнали будуть порушені, у вас, безумовно, виникнуть більші проблеми із безпекою.
На практиці майбутня аутентифікація токенів MAC для OAuth 2.0 може стати величезним покращенням стосовно поточної схеми "Надано токеном". Але ця робота все ще триває і пов'язана з передачею HTTP.
Висновок
Варто зробити висновок, що REST не лише на основі HTTP, навіть якщо на практиці він також здебільшого реалізований через HTTP. REST може використовувати інші шари зв'язку. Отже, RESTful аутентифікація - це не просто синонім автентифікації HTTP, незалежно від того, на що відповість Google. Він навіть не повинен використовувати механізм HTTP взагалі, але повинен бути абстрагований від рівня зв'язку. І якщо ви використовуєте HTTP-зв’язок, завдяки ініціативі Let Encrypt немає причин не використовувати належну HTTPS, яка потрібна на додаток до будь-якої схеми аутентифікації.
Cookie
як кращу заміну, HTTP Basic Auth
ви можете зробити справжню автентифікацію без стану за допомогою методу закінчення терміну автентифікації та можливості виходу з системи. Прикладом реалізації може бути використання файлу cookie, що Emulated-HTTP-Basic-Auth
має схоже значення з реальним HTTP Basic Auth, а крім того, встановлений строк закінчується. Потім вихід може бути реалізований за допомогою видалення цього файлу cookie. Я думаю, що будь-який клієнт, здатний підтримувати HTTP Basic Auth, також може підтримувати автентифікацію файлів cookie, зроблених таким чином.
Cookie
Натомість можна використовувати емуляцію, надану сервером для того ж самого матеріалу в іншому заголовку ( ).
Я сумніваюся, чи люди з ентузіазмом кричали "Аутентифікація HTTP" коли-небудь намагалися зробити додаток на базі браузера (замість веб-сервісу машина-машина) за допомогою REST (без правопорушень - я просто не думаю, що вони коли-небудь стикалися з ускладненнями) .
Проблеми, які я виявив при використанні автентифікації HTTP на сервісах RESTful, які створюють HTML-сторінки для перегляду в браузері:
Дуже прониклива стаття, талее ці точки на точках тут , але це призводить до великим з браузера конкретного яваскрипт вози , запряжені воли, обхідні шляхи для обхідних шляхів, і так далі. Як такий, він також не сумісний вперед, тому вимагатиме постійного обслуговування, коли випускаються нові браузери. Я не вважаю, що це чіткий та чіткий дизайн, плюс я відчуваю, що це багато зайвої роботи та головного болю просто для того, щоб я з ентузіазмом міг показати своїм REST-значкам своїм друзям.
Я вважаю, печиво - це рішення. Але зачекайте, печиво - це зло, чи не так? Ні, вони не такі, як часто використовуються файли cookie - це зло. Сам файл cookie - це лише інформація про клієнтську інформацію, подібно до інформації про автентифікацію HTTP, яку б браузер відстежував під час перегляду. І ця частина інформації на стороні клієнта надсилається на сервер при кожному запиті, знову так само, як і інформація про аутентифікацію HTTP. Концептуально єдиною відмінністю є те, що вміст цього фрагмента стану на стороні клієнта може визначатися сервером як частина його відповіді.
Здійснюючи сеанси ВІДКРИТИм ресурсом, дотримуючись наступних правил:
Єдина відмінність HTTP Authentication тепер полягає в тому, що ключ аутентифікації генерується сервером і надсилається клієнту, який продовжує його надсилати, замість того, щоб клієнт обчислював його з введених даних.
converter42 додає, що при використанні https (що ми повинні) важливо, щоб у файлу cookie встановлено захищений прапор, щоб інформація про автентифікацію ніколи не надсилалася через незахищене з'єднання. Чудова справа, я сам цього не бачив.
Я вважаю, що це достатньо рішення, яке добре працює, але мушу визнати, що мені недостатньо експерта з питань безпеки, щоб визначити потенційні дірки в цій схемі - все, що я знаю, це те, що сотні веб-додатків, які не є RESTful, використовують по суті те саме протокол входу ($ _SESSION в PHP, HttpSession в Java EE тощо). Вміст заголовка файлів cookie просто використовується для адреси ресурсу на сервері, подібно до того, як мова прийняття може використовуватися для доступу до ресурсів перекладу тощо. Я відчуваю, що це те саме, але, може, й інші? Як ви думаєте, хлопці?
Тут вже досить сказано на цю тему хорошими людьми. Але ось мої 2 копійки.
Існує 2 режими взаємодії:
Машина є загальним знаменником, вираженим як API REST, а суб'єкти / клієнти - люди чи машини.
Тепер, по-справжньому архітектурної архітектури, концепція безгромадянства передбачає, що всі відповідні стани заявки (маючи на увазі держави, що стоять перед клієнтом) повинні бути забезпечені кожним запитом. Під релевантним мається на увазі все, що вимагається API REST для обробки запиту та подання відповідної відповіді.
Якщо ми розглядаємо це в контексті програм "людина-машина", "заснованих на браузері", як вказує Скреббель вище, це означає, що (веб-додатку), що працює в браузері, потрібно буде надсилати свою інформацію та відповідну інформацію з кожним запитом це робить для REST API назад.
Враховуйте це: у вас є активна платформа REST API, що піддається впливу платформи даних / інформаційної платформи. Можливо, у вас є BI-платформа для самообслуговування, яка обробляє всі кубики даних. Але ви хочете, щоб ваші (людські) клієнти отримували доступ до цього через (1) веб-додаток, (2) мобільний додаток та (3) якесь стороннє додаток. Зрештою, навіть ланцюжок MTM веде до HTM - правильно. Тож користувачі людини залишаються на вершині інформаційного ланцюга.
У перших двох випадках у вас є справа про взаємодію людини з машиною, інформація фактично споживається користувачем людини. В останньому випадку у вас є машинна програма, що споживає API REST.
Поняття автентифікації застосовується в усьому світі. Як ви спроектуєте це так, щоб доступ до ваших API-програм REST отримував доступ однаково, захищено? Як я це бачу, є два способи:
Шлях-1:
Шлях-2:
Зрозуміло, що в Way-2 API REST знадобиться спосіб розпізнавання та довіри маркер як дійсний. API для входу здійснив перевірку автентичності, і тому "ключу valet" потрібно довіряти іншим API REST у вашому каталозі.
Це, звичайно, означає, що ключ / маркер автентичності потрібно буде зберігати та ділити між API REST. Це спільне сховане сховище токенів може бути локальним / федеративним будь-яким, що дозволяє API REST від інших організацій довіряти один одному.
Але я відволікаюсь.
Справа в тому, що "стан" (про статус автентифікованого клієнта) потрібно підтримувати та ділити, щоб усі API REST могли створити коло довіри. Якщо ми цього не робимо, а саме це Шлях-1, ми повинні прийняти, що для будь-якого / всіх запитів, що надходять, повинен бути виконаний акт аутентифікації.
Аутентифікація - це ресурсомісткий процес. Уявіть виконання SQL-запитів для кожного вхідного запиту проти вашого магазину користувачів, щоб перевірити відповідність uid / pwd. Або шифрувати та виконувати хеш-відповідність (стиль AWS). І архітектурно, кожен API REST повинен буде виконувати це, я думаю, використовуючи загальну послугу зворотного входу. Тому що, якщо ви цього не зробите, то ви скрізь засмічуєте авторський код. Великий безлад.
Так більше шарів, більше затримки.
Тепер перейдіть до Way-1 і подайте заявку на HTM. Чи дійсно ваш (людський) користувач хвилює, якщо вам доведеться надсилати uid / pwd / хеш чи що-небудь при кожному запиті? Ні, поки ви не заважаєте їй, кидаючи сторінку auth / login щосекунди. Удачі, якщо у вас є клієнти. Отже, що ви зробите, це зберігати інформацію для входу десь на стороні клієнта, у браузері, на самому початку, та надсилати її з кожним зробленим запитом. Для (людини) користувача вона вже увійшла, і "сеанс" доступний. Але насправді вона перевіряється автентичністю на кожен запит.
Те саме з Way-2. Ваш (людський) користувач ніколи не помітить. Тож ніякої шкоди не було зроблено.
Що робити, якщо ми застосуємо Way-1 до MTM? У цьому випадку, з моменту його роботи, ми можемо виправити цього хлопця, попросивши його подати інформацію про автентифікацію при кожному запиті. Всім все одно! Виконання шляху-2 на MTM не спричинить особливої реакції; його чортова машина. Це могло б турбуватися менше!
Тож справді, питання в тому, що відповідає вашим потребам. Без громадянства ціна повинна платити. Сплатіть ціну і рухайтеся далі. Якщо ви хочете бути пуристом, тоді заплатите ціну і за це, і рухайтеся далі.
Зрештою, філософії значення не мають. Що насправді важливо - це пошук інформації, презентація та досвід споживання. Якщо люди люблять ваші API, ви зробили свою роботу.
Way-3
, гібридний підхід. Клієнт входить як в, Way-2
але, як і в Way-1
, облікові дані не перевіряються на будь-якому стані сервера. Незалежно від цього, авторський маркер створюється та надсилається назад клієнту як у Way-2
. Пізніше цей маркер перевіряється на справжність, використовуючи асиметричну криптовалюту, шукаючи будь-яке стан клієнта.
Ось справді і повністю RESTful рішення аутентифікації:
Коли клієнт підтверджує автентифікацію:
3.1. видайте маркер, який містить таке:
3.2. Зашифруйте маркер приватним ключем.
3.3. Відправити зашифрований маркер назад користувачеві.
Коли користувач отримує доступ до будь-якого API, він також повинен перейти у свою токену аутентифікації.
Це аутентифікація без стану / RESTful.
Зауважте, що якщо було включено хеш пароля, користувач також надсилатиме незашифрований пароль разом із маркером аутентифікації. Сервер міг переконатися, що пароль відповідає паролю, який використовувався для створення маркера аутентифікації, порівнюючи хеші. Необхідним буде безпечне з'єднання, що використовує щось на зразок HTTPS. Javascript на стороні клієнта може обробляти отримання пароля користувача та зберігання його на стороні клієнта, або в пам'яті, або в файлі cookie, можливо, зашифрованому відкритим ключем сервера .
Якщо чесно з вами, я бачив тут чудові відповіді, але щось, що мене трохи турбує, - це коли хто докладе всю концепцію без громадянства до крайності, де це стане догматичним. Це нагадує мені тих старих шанувальників Smalltalk, які хотіли лише прийняти чистий ОО і якщо щось не є об'єктом, значить, ви робите це неправильно. Дай мені перерву.
Підхід RESTful повинен полегшити ваше життя та зменшити накладні витрати та витрати на заняття, спробуйте дотримуватися його, як це розумно робити, але хвилини, коли ви будете дотримуватися дисципліни (будь-якої дисципліни / настанови) до крайньої міри, де вона більше не забезпечує вигоду, для якої вона була призначена, ви робите це неправильно. Деякі з найкращих мов сьогодні мають функціональне програмування та орієнтацію на об'єкти.
Якщо найпростіший спосіб вирішити вашу проблему - зберігати ключ автентифікації у файлі cookie та надсилати його на заголовку HTTP, тоді робіть це, просто не зловживайте ним. Пам'ятайте, що сеанси погані, коли вони стають важкими та великими, якщо весь ваш сеанс складається з короткого рядка, що містить ключ, то в чому ж головна справа?
Я готовий прийняти виправлення в коментарях, але я просто не бачу сенсу (поки що) робити наше життя нещасним, щоб просто уникнути великого словника хешей на нашому сервері.
Перш за все, веб-сервіс RESTful - СТАТЕЛЕС (або іншими словами, SESSIONLESS). Тому служба RESTful не має і не повинна включати поняття сеансу чи файлів cookie. Спосіб аутентифікації або авторизації в службі RESTful - це використання заголовка авторизації HTTP, визначеного в специфікаціях HTTP RFC 2616. Кожен окремий запит повинен містити заголовок авторизації HTTP, а запит повинен бути надісланий через з'єднання HTTP (SSL). Це правильний спосіб аутентифікації та перевірки авторизації запитів у веб-сервісах HTTP RESTful. Я впровадив RESTful веб-сервіс для програми Cisco PRIME Performance Manager в Cisco Systems. І як частина цього веб-сервісу я також здійснив автентифікацію / авторизацію.
Це, звичайно, не про "ключі сеансу", оскільки вони, як правило, використовуються для посилання на аутентифікацію без сеансу, яка виконується в межах усіх обмежень REST. Кожен запит є самоописом, містить достатньо інформації для авторизації запиту самостійно без будь-якого стану додатків на сервері.
Найпростіший спосіб підійти до цього - це почати із вбудованих механізмів аутентифікації HTTP в RFC 2617 .
Стаття про "дуже проникливий", про яку згадує @skrebel ( http://www.berenddeboer.net/rest/authentication.html ), обговорюється складний, але дійсно порушений метод аутентифікації.
Ви можете спробувати відвідати сторінку (яка повинна переглядатись лише зареєстрованому користувачеві) http://www.berenddeboer.net/rest/site/authentication.html без будь-яких ідентифікаційних даних для входу.
(Вибачте, що не можу коментувати відповідь.)
Я б сказав, що REST та автентифікація просто не змішуються. REST означає стан без громадянства, але "автентифікований" - це стан. Ви не можете мати їх обох на одному шарі. Якщо ви є прихильником RESTful і нахмурітесь на штати, вам доведеться перейти з HTTPS (тобто залишити питання безпеки на інший рівень).
Я думаю, що спокійна автентифікація передбачає передачу маркера аутентифікації як параметр у запиті. Прикладами є використання apikeys api's. Я не вірю, що використання файлів cookie чи http auth відповідає вимогам.
Раніше підхід, згаданий нижче, по суті є типом гранту " OAuth2.0" . Це простий спосіб встати і бігти. Однак при такому підході кожна програма в організації отримає власні механізми аутентифікації та авторизації. Рекомендований підхід - тип гранту "Код авторизації". Крім того, у своїй попередній відповіді нижче я рекомендував браузер localStorage для зберігання авторських жетонів. Однак я прийшов до думки, що печиво - це правильний варіант для цієї мети. У цій відповіді StackOverflow я детально пояснив свої причини, підхід до реалізації типу надання дозволу на отримання коду авторизації, міркування щодо безпеки тощо .
Я думаю, що для аутентифікації служби REST може бути використаний наступний підхід:
При такому підході ми робимо дорогу операцію завантаження кешу з певними користувачами деталями права доступу кожні 30 хвилин. Отже, якщо доступ скасовано або надано новий доступ, потрібно 30 хвилин для відображення або виходу з системи, а за ним - логін.
Ось так це зробити: Використання OAuth 2.0 для входу .
Ви можете використовувати інші методи аутентифікації, крім Google, якщо вони підтримують OAuth.
Використання інфраструктури відкритого ключа, в якій реєстрація ключа передбачає належне прив'язування, гарантує, що відкритий ключ прив’язаний до особи, якій він присвоєний, таким чином, що забезпечує неприйняття
Дивіться http://en.wikipedia.org/wiki/Public_key_infrastructure . Якщо ви дотримуєтесь належних стандартів PKI, особу чи агента, який неправильно використовує викрадений ключ, можна виявити та заблокувати. Якщо агент вимагає використовувати сертифікат, прив'язка стає досить жорсткою. Розумний і швидкоплинний злодій може втекти, але вони залишають більше крихти.
Щоб відповісти на це питання з мого розуміння ...
Система аутентифікації, яка використовує REST, щоб вам не потрібно було фактично відслідковувати або керувати користувачами у вашій системі. Це робиться за допомогою методів HTTP POST, GET, PUT, DELETE. Ми приймаємо ці 4 методи і думаємо про них з точки зору взаємодії з базами даних як CREATE, READ, UPDATE, DELETE (але в Інтернеті ми використовуємо POST і GET, тому що саме зараз підтримують теги прив’язки). Тож трактуючи POST і GET як наш CREATE / READ / UPDATE / DELETE (CRUD), ми можемо розробити маршрути в нашому веб-додатку, які зможуть визначити, які дії CRUD ми досягаємо.
Наприклад, за допомогою програми Ruby on Rails ми можемо створити наш веб-додаток таким чином, що якщо користувач, який увійшов у систему, відвідує http://store.com/account/logout то GET цієї сторінки може розглядатися як користувач, що намагається вийти. . У нашому контролері рейок ми створили б дію, яка виводить користувача та відправляє їх на головну сторінку.
GET на сторінці входу дасть форму. POST на сторінці входу буде розглядатися як спроба входу, приймаючи дані POST і використовуючи їх для входу.
Для мене це практика використання методів HTTP, відображених у сенсі їх бази даних, а потім побудови системи аутентифікації, маючи на увазі, що вам не потрібно обходити будь-які ідентифікатори сеансу або відстежувати сеанси.
Я все ще вчуся - якщо ви виявите що-небудь, що я сказав, що я помилявся, виправте мене, і якщо ви дізнаєтесь більше, опублікуйте його тут Дякую.
Поради щодо забезпечення будь-якої веб-програми
Якщо ви хочете захистити свою програму, тоді вам слід обов'язково почати використовувати HTTPS замість HTTP , це забезпечує створення захищеного каналу між вами та користувачами, що запобіжить нюхати дані, що надсилаються назад і назад користувачам, і допоможе зберегти дані обмінялися конфіденційно.
Ви можете використовувати JWTs (JSON Web Tokens) для захисту API RESTful , це має багато переваг у порівнянні з сеансами на сервері, переваги в основному:
1- Більш масштабована, оскільки ваші сервери API не повинні підтримувати сеанси для кожного користувача (що може бути великим тягарем, коли у вас багато сеансів)
2- JWT є автономними та мають претензії, які визначають роль користувача, наприклад, & що він може отримати та видав на дату та дату закінчення терміну дії (після чого JWT не буде дійсним)
3- Легше керувати через балансири завантаження і якщо у вас є кілька серверів API, оскільки вам не доведеться ділитися даними сеансу і не налаштовувати сервер для маршрутизації сеансу на один і той же сервер, коли запит із JWT потрапляє на будь-який сервер, його можна автентифікувати & уповноважений
4- Менший тиск на вашу БД, а також вам не доведеться постійно зберігати та отримувати ідентифікатори та дані сеансу для кожного запиту
5- JWT не можуть бути підроблені, якщо ви використовуєте сильний ключ для підписання JWT, тому ви можете довіряти претензії в JWT, що надсилаються із запитом, не перевіряючи сеанс користувача та чи він дозволений чи ні ви можете просто перевірити JWT & тоді ви все готові знати, хто і що може робити цей користувач.
Багато бібліотек надають прості способи створення та перевірки JWT в більшості мов програмування, наприклад: у node.js однією з найпопулярніших є jsonwebtoken
Оскільки API REST, як правило, спрямований на збереження сервера без стану, тому JWT більше сумісні з цією концепцією, оскільки кожен запит надсилається з токеном авторизації, який є автономним (JWT), без того, щоб сервер повинен відслідковувати сеанс користувача порівняно з сеансами, які роблять серверний стан, щоб він запам'ятовував користувача та його роль, проте сесії також широко використовуються та мають свої плюси, за якими ви можете шукати, якщо хочете.
Важливо відзначити, що вам потрібно надійно доставити JWT клієнту за допомогою HTTPS і зберегти його в безпечному місці (наприклад, на локальному сховищі).
Дізнатися більше про JWT можна за цим посиланням