Создать API для единого входа на сторонний сайт

13

Мой сайт должен быть интегрирован с программным обеспечением сторонних производителей, которое будет размещаться на собственном поддомене, размещенном компанией-разработчиком программного обеспечения. Мне нужно предоставить сторонним разработчикам конечную точку, которую они могут использовать для выполнения вызовов API (на мой сайт WordPress), чтобы позволить пользователям моего сайта получить доступ к поддомену.

Другой сайт должен аутентифицировать пользователей с моего сайта через своего рода API.

Я не уверен, с чего начать, но я чувствую, что это выяснили люди умнее меня. Заранее спасибо!

emersonthis
источник
1
Какие вызовы API будут необходимы? Что ты пытаешься сделать? Вы смотрели на поддержку WP-XML-RPC ( codex.wordpress.org/XML-RPC_Support )?
Anu
Другой сайт должен проверять / аутентифицировать пользователей с моего сайта WP.
emersonthis

Ответы:

16

Проблемы межсайтового скриптинга

Вы не можете передавать файлы cookie WP auth между доменами. Вы также не хотите хранить незашифрованные пароли для программного входа в другую установку WP. Таким образом, вам нужно будет, чтобы пользователи входили в WordPress, а затем получали доступ к своему состоянию входа через конечную точку API со стороннего сайта. Это позволяет WordPress обрабатывать все аутентификации. Это довольно безопасно, так как пользователь должен будет физически войти в систему на стороне WP, чтобы конечная точка API передавала данные сторонним лицам.

Создать конечную точку API

Проверьте эту статью, которую я только что написал здесь: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Также вы можете увидеть демонстрацию кода здесь: https://gist.github.com/2982319

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

Поскольку вы используете WordPress в качестве сайта аутентификации, вы можете использовать проверку как is_user_logged_in (). Если они вошли в систему, верните объект пользователя третьей стороне с любой необходимой ему информацией.

Вход в систему от третьих лиц

Сторонние разработчики могут ссылаться на вашу страницу входа для беспроблемного использования запроса redirect_to var. После входа он передает их на сторонний сайт.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Удаленные логины

Если вам необходимо войти в WordPress со стороннего сайта, вы можете использовать некоторые простые функции WP, перечисленные на этом сайте: http://kuttler.eu/code/log-in-a-wordpress-user-programmatics/

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

Третья сторона отправляет запрос с отметкой времени и токеном, сгенерированным общим секретом:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Установка WordPress получает запрос:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!
Брайан Фегтер
источник
Совершенно уверен, что стороннее программное обеспечение не имеет ничего общего с WP, поэтому по сути это единый вход, но с WP, действующим в качестве поставщика аутентификации.
Anu
@anu: Это правильно.
emersonthis
@Brian: Меня интересует идея перехода на многосайтовую установку, но я не совсем понимаю, что вы сделали по поводу файлов cookie. Все, что должно произойти, - это стороннее программное обеспечение, которое должно убедиться, что его пользователь на самом деле является одним из моих пользователей. В противном случае программное обеспечение является самодостаточным и может предоставлять собственные файлы cookie или что-либо подобное.
emersonthis
@ Эмерсон, теперь я вижу. Извините за путаницу. Вы можете использовать идею конечной точки, которую я создал, и использовать общий токен в пользовательской мета для аутентификации. Вернуть JSON-ответ стороннему лицу, если пользователь существует.
Брайан Фегтер
1
Очень хорошее решение. Может быть проблема, если приложения установлены на разных серверах и по какой-то причине время на каждой машине отличается. Я бы предложил использовать counterвместо time()и передать его с запросом. Обе стороны сохраняют последний переданный счетчик, и когда api получает запрос с новым счетчиком, он проверяет, что новый счетчик больше, чем последний. Таким образом, задержка не может причинить вреда.
Guyaloni