Подтвердить что ты не робот

Простая, безопасная система аутентификации API

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Удачи!

Крис

Ответ 2

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/

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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