Я разрабатываю веб-службу RESTful, к которой должны обращаться пользователи, а также другие веб-сервисы и приложения. Все входящие запросы должны быть аутентифицированы. Вся связь осуществляется через HTTPS. Аутентификация пользователя будет работать на основе токена аутентификации, полученного путем POSTing имени пользователя и пароля (через соединение SSL) с ресурсом/сеансом, предоставляемым службой.
В случае клиентов веб-сервисов за клиентской службой нет конечного пользователя. Запросы инициируются запланированными задачами, событиями или некоторыми другими компьютерными операциями. Список соединительных сервисов известен заранее (очевидно, я думаю). Как мне аутентифицировать эти запросы, поступающие из других (веб-сервисов)? Я хочу, чтобы процесс аутентификации был максимально простым для реализации для этих служб, но не ценой безопасности. Какими будут стандартные и лучшие практики для такого сценария?
Параметры, о которых я могу думать (или были предложены мне):
-
Попросите клиентские службы использовать "поддельные" имя пользователя и пароль и аутентифицировать их так же, как и пользователи. Мне не нравится этот вариант - он просто не чувствует себя хорошо.
-
Назначьте постоянный идентификатор приложения для клиентской службы, возможно, и ключ приложения. Насколько я понял, это то же самое, что и имя пользователя + пароль. С помощью этого идентификатора и ключа я могу либо аутентифицировать каждый запрос, либо создать токен аутентификации для аутентификации дальнейших запросов. В любом случае, мне не нравится этот параметр, потому что любой, кто может завладеть идентификатором и ключом приложения, может олицетворять клиента.
-
Я могу добавить проверку IP-адреса в предыдущую опцию. Это затруднит выполнение поддельных запросов.
-
Клиентские сертификаты. Настройте собственный центр сертификации, создайте корневой сертификат и создайте клиентские сертификаты для клиентских сервисов. Пара вопросов приходит на ум, хотя: а) как я все еще разрешаю пользователям проходить аутентификацию без сертификатов и б) насколько сложна эта сценария для реализации с точки зрения обслуживания клиентов?
-
Что-то еще - там должны быть другие решения?
Моя служба будет работать на Java, но я намеренно отказался от информации о том, на какой конкретной основе она будет построена, потому что меня больше интересуют основные принципы и не столько детали реализации - я предполагаю, что лучшее решение поскольку это можно будет реализовать независимо от базовой структуры. Тем не менее, я немного неопытен в этом вопросе, поэтому очень полезны конкретные советы и примеры фактической реализации (например, полезные сторонние библиотеки, статьи и т.д.).