Передо мной стоит задача реализовать API, который будет использоваться относительно нетехническими клиентами - вставка некоторого образца кода в их WordPress или собственный PHP-сайт, вероятно, все, что мы можем попросить. Их не просят установить SSL на свои серверы. Поэтому я ищу простой, но безопасный способ аутентификации клиентов API.
OAuth - очевидное решение, но я не думаю, что он проходит «простой» тест.
Добавление идентификатора клиента и хешированного секрета в качестве параметра к запросам ближе - это не сложно сделать md5($secret . $client_id)
или что бы там ни было.
Мне кажется, что если клиентские запросы могут использовать тот же подход, что и открытые ключи SSH (клиент дает нам ключ со своего сервера (ов), должна существовать какая-то магия, чтобы все последующие транзакции прозрачно работали так же, как обычные запросы HTTP API .
Я все еще работаю над этим (очевидно :-), поэтому, если я идиот, было бы неплохо знать, почему.
Спасибо!
Это довольно большая тема, ваш API - чисто веб-интерфейс? Почему SSL слишком сложен? Если вам нужна надежная связь от автоматических клиентов и гарантия неотказуемости, вам понадобится SSL. Если доступ к вашему API осуществляется из пользовательского сеанса, можете ли вы реализовать двухфакторную аутентификацию. Используя что-то вроде токенов RSA или даже аутентификатора Google, если у них есть смартфоны.
Нечто похожее на открытые ключи SSH - это проверка подлинности сертификата клиента SSL, также известная как двухсторонний SSL.
Если вы размещаете услугу, вы можете настроить SSL на своей стороне. Есть несколько вариантов аутентификации клиентов.
Самый простой способ - включить HTTP-аутентификацию на своей стороне. При условии, что вы включили HTTPS на своем сервере и убедились, что клиенты настроены с https://
URI (не полагаться на автоматические перенаправления, особенно с HTTP Basic на самом деле). Просто дайте каждому зарегистрированному клиенту имя пользователя и пароль.
Большинство клиентов должны поддерживать эту форму аутентификации. Если ваш клиент - сервер PHP, установка CURLOPT_USERPWD
параметры стоит сделать.
Также довольно часто используется ключ API (на основе некоторого UUID, например) в качестве параметра запроса для некоторых API. Насколько это удобно, может зависеть от вашей стороны кода. В целом, с точки зрения безопасности, это эквивалентно базовому имени пользователя / паролю (за исключением того, что вам, возможно, придется сопоставить ключ с именем пользователя).
Если вы хотите использовать аутентификацию с открытым ключом, используйте клиентские сертификаты SSL / TLS. Это более сложно. Возможно, вам придется создать для этого свой собственный центр сертификации (это можно сделать таким образом, чтобы генерация ключей производилась в браузере пользователя, но это все равно может быть неудобно).1
Обратной стороной является то, что пользователям может потребоваться преобразовать сертификаты из одного формата в другой, чтобы их можно было использовать.
В любом случае, если на вашей стороне используется SSL, и вы ожидаете, что они вставят некоторый код PHP / Curl, им все равно, возможно, придется выполнить небольшую настройку. По крайней мере, CURLOPT_SSL_VERIFYPEER
должно быть TRUE
, CURLOPT_SSL_VERIFYHOST
должно быть 2
(по умолчанию) и CURLOPT_CAPATH
должен указывать на каталог, содержащий их доверенные сертификаты CA. Где это, может зависеть от их хозяина.
1 Также можно превратить ключ SSH RSA в самозаверяющий сертификат X.509, но это довольно технический вопрос (и также потребует некоторой работы с вашей стороны). Другие механизмы аутентификации с открытым ключом (возможно, на основе ключей SSH) поверх HTTP должны быть созданы вами, что, как правило, является плохой идеей (трудно реализовать самостоятельно). Это, конечно, не стоит усилий, поскольку HTTPS с аутентификацией клиента предоставит вам что-то проверенное и уже поддерживаемое существующими библиотеками.
Я думаю, что вы можете использовать Диффи Хеллмана для создания общего секрета на основе пар открытого / закрытого ключей. Я использовал похожий подход; Я думаю, что если вы пытаетесь контролировать авторизацию своего API из нескольких источников, этот подход может хорошо работать.
Пожалуйста, посмотрите это http://p4r1tyb1t.com/?p=723