Простая, безопасная система аутентификации API - PullRequest
35 голосов
/ 11 мая 2009

У меня есть простой REST JSON API для других веб-сайтов / приложений для доступа к базе данных моего веб-сайта (через шлюз PHP). В основном сервис работает следующим образом: call example.com/fruit/orange, сервер возвращает JSON-информацию об апельсине. Вот в чем проблема: мне нужны только сайты, которым я разрешаю доступ к этой услуге. С помощью простой системы ключей API любой веб-сайт может быстро получить ключ, скопировав ключ из клиентского кода авторизованного веб-сайта (потенциально). Я посмотрел на OAuth, но это кажется немного сложным для того, что я делаю. Решения?

Ответы [ 5 ]

28 голосов
/ 06 июня 2009

Вы должны использовать OAuth.

На самом деле существует две спецификации OAuth: 3-сторонняя версия и 2-сторонняя версия. Большая часть внимания привлекает трехногая версия, и , а не та, которую вы хотите использовать.

Хорошей новостью является то, что 2-сторонняя версия делает именно то, что вам нужно, она позволяет приложению предоставлять доступ к другому через общий секретный ключ (очень похоже на модель веб-службы Amazon, вы будете использовать HMAC-SHA1). метод подписи) или через систему открытого / секретного ключей (используйте метод подписи: RSA-SHA1). Плохая новость заключается в том, что она еще не так хорошо поддерживается, как 3-сторонняя версия, поэтому вам, возможно, придется выполнить немного больше работы, чем в противном случае сейчас.

По сути, двухсторонний OAuth просто указывает способ «подписать» (вычислить хэш) несколько полей, которые включают текущую дату, случайное число, называемое «nonce», и параметры вашего запроса. Это очень затрудняет олицетворение запросов к вашему веб-сервису.

OAuth медленно, но верно становится общепринятым стандартом для подобных вещей - в конечном итоге вам будет лучше, если вы примете его, потому что тогда люди смогут использовать различные библиотеки, доступные для этого.

Это сложнее, чем вы хотели бы поначалу задуматься, но хорошая новость заключается в том, что многие люди потратили на это много времени, поэтому вы знаете, что ничего не забыли. Отличным примером является то, что совсем недавно Twitter обнаружил пробел в безопасности OAuth, над которым в настоящее время работает сообщество. Если вы изобрели свою собственную систему, вам придется самому разбираться со всем этим.

Удачи!

Chris

21 голосов
/ 09 марта 2012

OAuth здесь не является решением .
OAuth - это когда у вас есть конечные пользователи и вы хотите, чтобы сторонние приложения не обрабатывали пароли конечных пользователей. Когда использовать OAuth: http://blog.apigee.com/detail/when_to_use_oauth/

Перейти на простой API-ключ .
И принять дополнительные меры, если есть необходимость в более безопасном решении.

Вот еще немного информации, http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/

4 голосов
/ 11 мая 2009

Если чей-то код на стороне клиента скомпрометирован, он должен получить новый ключ. Вы не можете ничего сделать, если их код разоблачен.

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

Я не уверен, что вы имеете в виду, используя «простой ключ API», но вы должны использовать какую-то аутентификацию, которая имеет закрытые ключи (известные только клиенту и серверу), а затем выполнить какой-то алгоритм контрольной суммы на данные, чтобы убедиться, что клиент действительно тот, о ком вы думаете, и что данные не были изменены при передаче. Amazon AWS является отличным примером того, как это сделать.

Я думаю, может быть немного строго гарантировать, что код не был скомпрометирован на стороне ваших клиентов. Я думаю, что разумно возложить на ваших клиентов ответственность за безопасность их собственных данных. Конечно, это предполагает, что злоумышленник может испортить только учетную запись этого клиента.

Возможно, вы могли бы вести журнал того, откуда поступают ip-запросы для конкретной учетной записи, и, если появляется новый ip, пометьте учетную запись, отправьте электронное письмо клиенту и попросите его авторизовать этот ip. Я не знаю, может быть, что-то подобное может сработать.

2 голосов
/ 11 мая 2009

Обычно у вас есть два варианта: либо ограничить доступ по IP, либо использовать ключ API, оба варианта имеют свои положительные и отрицательные стороны.

ограничение по IP
Это может быть удобным способом ограничить доступ к вашему сервису. Вы можете точно определить, каким сторонним сервисам будет разрешен доступ к вашему сервису, не применяя их для реализации каких-либо специальных функций аутентификации. Однако проблема этого метода заключается в том, что если сторонняя служба написана, например, полностью на JavaScript, то IP-адрес входящего запроса будет не IP-адресом сторонней службы, а IP-адресом пользователя, когда выполняется запрос. браузером пользователя, а не сервером. Использование ограничения IP, следовательно, сделает невозможным написание клиентских приложений и заставит все запросы проходить через сервер с надлежащими правами доступа. Помните, что IP-адреса также могут быть подделаны.

API ключ
Преимущество API-ключей заключается в том, что вам не нужно вести список известных IP-адресов, вам нужно поддерживать список API-ключей, но их автоматизировать проще. В основном, как это работает, у вас есть два ключа, например, идентификатор пользователя и секретный пароль. Каждый запрос метода к вашей службе должен предоставлять хеш аутентификации, состоящий из параметров запроса, идентификатора пользователя и хеша этих значений (где в качестве хеш-соли используется секретный пароль). Таким образом, вы можете как аутентифицировать, так и ограничить доступ. Проблема в том, что, если еще раз, если сторонний сервис написан как управляемый клиентом (например, JavaScript или ActionScript), тогда любой может проанализировать идентификатор пользователя и секретные значения соли из кода.

По сути, если вы хотите быть уверены, что только нескольким определенным вами службам будет разрешен доступ к вашему сервису, тогда вам остается только использовать ограничение IP и, следовательно, заставить их направлять все запросы через свои серверы. Если вы используете ключ API, у вас не будет возможности применить это.

0 голосов
/ 06 октября 2014

Кажется, что все производство безопасности IP создает огромную ошибку для пользователей перед подключением. Symbian 60s обладает самой полной возможностью оставлять неисследованный, надежный и безопасный сигнал среди множества пользователей (применяя Opera Handler UI 6.5, Opera Mini v8 и 10) вместе с закодированным пользовательским интерфейсом + полностью заполненную настройку сети. Зачем ограничивать другие функции, когда обнаруживаемый способ создания более быстрого метода связи, наконец, получен. Ведение более идентифицированных учетных записей, надлежащий мониторинг этой «истинной учетной записи» - если они находятся на пути к соответствию оплаты счетов и знание, что у пользователей есть неистекший поддерживающий баланс, создаст более быструю ссылку интернет-сигнала на популярный / подписанный мобильный телефон промышленность. Зачем делать жесткие функции безопасности перед тем, как отправлять их на сайт, посещение их учетных записей ежемесячно может стереть все проблемы с подключением? Все пользователи мобильного телефона не должны иметь возможности «подключиться», если у них есть неоплаченные счета. Почему бы не предоставить «ВСЕ в одном» - регистрационную / прикладную учетную запись, запрограммированную фиксированную с ОС (возможно, учетную запись электронной почты), вместо этого с «возможностью мониторинга», если они платят или нет (следует учитывать проблемы с паролем) в другой отдел). А если «нет», то точно отключите их учетную запись и другие функции ссылок. У каждого из них есть свои интересы в отношении того, куда ежедневно подключаться, если вы заблокировали / отключили их из-за неоплаченных счетов, которые могут побудить их повторно подписаться и дисциплинировать их, чтобы они стали более ответственными пользователями, и срок их действия может даже истечь. учетная запись, если не поддерживается. Ежемесячный мониторинг или доступ к идентифицированной «истинной учетной записи» в сотрудничестве с провайдером сети обеспечивает более высокую конфиденциальность, вместо того, чтобы всегда запрашивать у пользователей «имя» и «пароль», «местоположение», «разрешения» для просмотра их услуг передачи данных. IP-адреса уже помечены как их первая личность или «поиск местоположения пользователей», поэтому, кажется, неоправданно размещать их в предварительном поиске в браузерах, почему бы не использовать «Получение данных» или «Обработка данных».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...