В настоящее время я создаю RESTful API для нашего веб-сервиса, к которому будут обращаться сторонние веб-приложения и мобильные приложения. Мы хотим иметь определенный уровень контроля над потребителями API (т. Е. Веб-приложениями и мобильными приложениями), чтобы мы могли регулировать запросы API и / или блокировать определенные вредоносные клиенты. Для этого мы хотим, чтобы каждый разработчик, который будет обращаться к нашему API, получал от нас ключ API и использовал его для доступа к нашим конечным точкам API. Для некоторых вызовов API, которые не имеют отношения к конкретной пользовательской информации, это единственный требуемый уровень аутентификации и авторизации, который я называю A & A уровня приложения. Однако некоторые вызовы API имеют дело с информацией, принадлежащей конкретным пользователям, поэтому нам нужен способ, позволяющий этим пользователям войти в систему и авторизовать приложение для доступа к их данным, что создает второй уровень (или пользовательский уровень A & A).
Имеет смысл использовать OAuth2 для пользовательского уровня A & A, и я думаю, что у меня есть достаточно хорошее понимание того, что мне нужно здесь делать.
Я также реализовал OAuth1-подобную схему, где разработчики приложений получают пару API-ключа и секрета, предоставляют свой API-ключ при каждом вызове и используют секрет для подписания своих запросов (опять же, это очень похоже на OAuth1, и мне, вероятно, следует просто использовать OAuth1 для этого).
Теперь у меня проблема в том, как соединить эти два разных механизма. Моя текущая гипотеза состоит в том, что я продолжаю использовать API ключ / секретная пара для подписания всех запросов, чтобы иметь возможность доступа ко всем конечным точкам API, и для тех вызовов, которые требуют доступа к пользовательской информации, приложения должны будут пройти через поток OAuth2 и получить токены доступа. и снабди их.
Итак, мой вопрос к сообществу: звучит ли это как хорошее решение, или есть несколько лучших способов это спроектировать.
Я также был бы признателен за любые ссылки на существующие решения, которые я мог бы использовать, вместо того, чтобы заново изобретать колесо (наши сервисы основаны на Ruby / Rails).