Аутентификация между службами, идентификация служб и управление правами доступа

#ruby-on-rails #ruby #web-services #rest #soa

#ruby-on-rails #ruby #веб-сервисы #rest #soa

Вопрос:

В настоящее время я разрабатываю распределенное приложение с использованием Ruby, Ruby on Rails, Sinatra и веб-сервисов pure Rack.

У меня будет несколько сервисов (RESTful, не основанных на SOAP), которые будут взаимодействовать с использованием JSON, и мне понадобится способ защитить и проверить идентичность каждого из этих сервисов во время обмена данными между ними, чтобы никто не мог притворяться сервисом и отправлять запросы к другим сервисам.

Основная идея заключается в том, чтобы относиться к другим службам как к «пользователям» и иметь возможность проверять их личность и при необходимости ограничивать их доступ к данным.

Итак, вопрос в том, как это сделать, используя только Ruby и как эффективно управлять идентификаторами служб и их правами доступа.

Должен ли я создать какую-либо дополнительную службу аутентификации, используемую службами?

Должен ли я создавать внутренние gems для предоставления некоторого промежуточного программного обеспечения для подключения с ключами / общими секретами?

Может быть, есть какой-то другой способ сделать это?

Ответ №1:

Я бы сгенерировал идентификатор приложения и секрет, которые вы могли бы передавать с каждым запросом. Поскольку вы имеете дело не с другими пользователями, а просто с приложениями, попробуйте просмотреть токены аутентификации с помощью devise.

Комментарии:

1. Это решение будет работать в отношении обслуживания «один ко многим», но здесь это скорее отношение «многие ко многим». Каждая служба должна иметь возможность при необходимости взаимодействовать с другой. И если одна из служб будет скомпрометирована, я должен быть в состоянии изолировать ее от остальной группы, отозвав права доступа у других или отозвав ключ доступа.

2. Хммм, может быть, какой-то центральный сервер аутентификации, который вы можете использовать для управления учетными данными служб для приложений? Это не моя область знаний, но я думаю, что это был бы лучший способ

3. Я думаю о чем-то промежуточном, например, о локальных копиях действительных учетных данных, которые будут обновлены службой аутентификации, которая сможет автоматически развертывать их через gems. Что-то в этом роде. Если у кого-то есть лучшее решение, даже через несколько месяцев, пожалуйста, оставьте комментарий здесь 🙂

4. если вы можете легко выполнить развертывание в обеих службах, то сохранение ключа приложения / секрета в коде — это самая простая вещь, которая может сработать. В случае нарушения безопасности повторно создайте ключи, измените обе службы и повторно разверните. Если развертывание затруднено, поместите ключи в config.

Ответ №2:

Я думаю, что OAuth — это протокол, который обычно используется для аутентификации во время выполнения между веб-сервисами, особенно с RESTful API.