Я розробляю RESTful веб-сервіс, до якого потрібно звертатися користувачам, а також інші веб-сервіси та програми. Усі вхідні запити повинні бути засвідчені автентифікацією. Вся комунікація відбувається через HTTPS. Аутентифікація користувача буде працювати на основі маркера аутентифікації, отриманого шляхом POSTing імені користувача та пароля (через SSL-з'єднання) на ресурс / сеанс, наданий службою.
Що стосується клієнтів веб-служб, то за клієнтським сервісом немає кінцевого користувача . Запити ініціюються плановими завданнями, подіями чи іншими операціями на комп'ютері. Перелік послуг підключення відомий заздалегідь (очевидно, я думаю). Як я повинен автентифікувати ці запити, що надходять від інших (веб-служб)? Я хочу, щоб процес аутентифікації був максимально простим для здійснення цих служб, але не ціною безпеки. Які були б стандартні та найкращі практики для такого сценарію?
Варіанти, які я можу придумати (або мені були запропоновані):
Запропонуйте клієнтським службам використовувати "підроблені" ім'я користувача та пароль та підтвердити їх автентифікацію так само, як користувачі. Мені не подобається цей варіант - він просто не почуває себе правильно.
Призначте постійний ідентифікатор програми для обслуговування клієнтів, можливо, і ключ програми. Наскільки я зрозумів, це точно так само, як мати ім’я користувача + пароль. За допомогою цього ідентифікатора та ключа я можу або автентифікувати кожен запит, або створити маркер аутентифікації для автентифікації подальших запитів. Так чи інакше, мені не подобається цей варіант, тому що кожен, хто зможе втримати ідентифікатор програми та ключ, може себе представити клієнту.
Я можу додати перевірку IP-адреси до попереднього параметра. Це ускладнить виконання підроблених запитів.
Клієнтські сертифікати. Налаштувати власні повноваження щодо сертифікатів, створити кореневий сертифікат та створити клієнтські сертифікати для клієнтських послуг. Однак на думку приходить декілька питань: а) як я все ж дозволяю користувачам аутентифікуватись без сертифікатів; б) наскільки складно реалізувати цей сценарій з точки зору обслуговування клієнтів?
Ще щось - там повинні бути інші рішення?
Мій сервіс працював би на Java, але я навмисно відкинув інформацію про те, на якій конкретній основі він буде побудований, тому що мене більше цікавлять основні принципи, а не стільки деталі реалізації - я вважаю, що найкращим рішенням для цього буде можливо реалізувати незалежно від основи, що лежить в основі. Однак я трохи недосвідчений у цій темі, тому конкретні поради та приклади щодо реальної реалізації (такі як корисні сторонні бібліотеки, статті тощо) також будуть дуже вдячні.