Дизайн OAuth для API без разрешения пользователя
Я разрабатываю API, который будет использоваться пользователями моих клиентов. Вот как будет выглядеть поток:
- Пользователь моего облачного сервиса создает ключ API.
- Пользователь вводит ключ API в свои собственные приложения.
- Пользователь развертывает приложение для своих конечных пользователей.
- Приложение обращается к нашему API.
Я ищу советы по защите этого API. Я вижу несколько вопросов:
- Ключ API должен быть встроен в приложение пользователя и поэтому уязвим для кражи и злоупотребления.
- Когда ключ API скомпрометирован, его можно легко отключить, но как мои пользователи будут обновлять свои приложения, чтобы использовать новый ключ API, не имея необходимости перестраивать приложение и повторно развертывать.
Есть ли у кого-нибудь идеи о том, как это сделать?
Ответы
Ответ 1
Возможно, я ошибаюсь, но, может быть, вы могли бы попросить своих клиентов поговорить с API ваших клиентов. В основном, ваши клиенты будут хранить свой секретный ключ на своих серверах и не будут внедрять их в клиентов, которых они предоставляют своим пользователям, поэтому их нельзя было бы заблокировать (если, конечно, их сервер не был скомпрометирован). Затем пользователи будут обращаться к вашему API через API ваших клиентов.
Это будет медленнее и потребует дополнительной работы со стороны ваших клиентов, но также и безопаснее.
Ответ 2
Два решения, которые я могу видеть, хотя я уверен, что их больше.
-
Использовать метод подписи RSA и использовать безопасный обмен сертификатами ключей с помощью "облачной службы" в качестве механизма обмена (или публичного поставщика сертификатов).
-
Внедрение службы, которая позволяет клиентам "обновлять" свой потребительский ключ/секрет автоматически, но затем защищать этот механизм с помощью RSA или другого метода шифрования с открытым ключом.
Оба из них нелегки и потребуют от ваших пользовательских приложений "позвонить домой", чтобы обновить их потребительские ключи.
В будущем я думаю, что OAuth 2 предоставит хотя бы определения протоколов для таких вещей, но пока, если вы используете OAuth 1.0a, то, что вы хотите сделать, не очень хорошо вписывается в спецификацию ( т.е. вы сами должны проектировать большую часть этого.)