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