Criar API para logon único com site de terceiros

13

Meu site precisa se integrar a um software de terceiros, que viverá em seu próprio subdomínio, hospedado pela empresa de software. Preciso fornecer aos desenvolvedores de terceiros um ponto de extremidade que eles possam usar para fazer chamadas de API (para o meu site wordpress) para permitir que os usuários do meu site acessem o subdomínio.

O outro site precisa autenticar usuários do meu site por meio de algum tipo de API.

Não sei por onde começar, mas meu senso é que isso foi descoberto por pessoas mais inteligentes que eu. Desde já, obrigado!

emersonthis
fonte
1
Que tipo de chamadas de API serão necessárias? O que você está tentando fazer? Você já viu o suporte XML-RPC do WP ( codex.wordpress.org/XML-RPC_Support )?
anu
O outro site precisa verificar / autenticar usuários do meu site WP.
perfil completo de Emersonthis

Respostas:

16

Problemas de script entre sites

Você não pode transferir cookies de autenticação WP entre domínios. Você também não deseja armazenar senhas de texto sem formatação para efetuar logon em outra instalação do WP programaticamente. Portanto, é necessário que os usuários efetuem login no WordPress e, em seguida, acessem o status de login por meio de um endpoint da API a partir do site de terceiros. Isso permite que o WordPress lide com toda a autenticação. É bastante seguro, pois o usuário terá que efetuar login fisicamente no lado do WP para que o ponto de extremidade da API sirva os dados para terceiros.

Crie um ponto de extremidade da API

Confira este artigo que acabei de escrever aqui: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Além disso, você pode ver a demonstração do código aqui: https://gist.github.com/2982319

Você terá que descobrir a lógica para suas próprias necessidades de aplicativos, mas isso permitirá que você crie um terminal em que possa servir o que quiser do lado do WordPress.

Como você está usando o WordPress como site de autenticação, pode usar uma verificação como is_user_logged_in (). Se eles estiverem conectados, retorne um objeto de usuário para terceiros com as informações necessárias.

Fazendo logon de terceiros

De terceiros, eles podem criar um link para sua página de login para uma experiência perfeita usando a consulta redirect_to var. Uma vez logado, ele os passará de volta para o site de terceiros.

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

Logins remotos

Se você precisar logar usuários no WordPress a partir de um site de terceiros, poderá usar algumas funções WP simples listadas neste site: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Você definitivamente precisará usar um segredo compartilhado e criar hashes baseados em tempo com esse segredo para manter as coisas seguras. Basicamente, aqui está o que seria:

Terceiros enviam solicitação com um carimbo de data e hora e um token gerado por um segredo compartilhado:

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

A instalação do WordPress recebe a solicitação:

$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!
Brian Fegter
fonte
Bastante certo de que o software de terceiros não tem nada a ver com o WP, portanto, essencialmente, é o logon único, mas com o WP atuando como o provedor de autenticação.
anu
@anu: Está correto.
emersonthis
@ Brian: Estou interessado na ideia de mudar para uma instalação em vários sites, mas não entendo completamente o que você fez sobre os cookies. Tudo o que precisa acontecer é que o software de terceiros precise verificar se o usuário é realmente um dos meus usuários. Caso contrário, o software é auto-suficiente e pode fornecer seus próprios cookies ou qualquer outra coisa.
emersonthis
@Emerson eu vejo agora. Desculpe pela confusão. Você pode usar a ideia do terminal que eu criei e usar o token compartilhado na meta do usuário para autenticação. Retorne uma resposta JSON para terceiros, se o usuário existir.
22712 Brian Fegter
1
Solução muito boa. Pode haver um problema se os aplicativos estiverem instalados em servidores diferentes e, por algum motivo, o tempo de cada máquina for diferente. Eu sugeriria usar em countervez de time()e passá-lo com a solicitação. Ambos os lados mantêm o último contador passado e, quando a API recebe uma solicitação com um novo contador, verifica se o novo é maior que o último. Dessa maneira, um atraso não pode causar nenhum dano.
guyaloni