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