Integração SSO / autenticação com 'serviço de diretório' externo

15

Estou prestes a começar a trabalhar em um protótipo para um cliente - e um dos recursos necessários é a integração com um sistema interno de autenticação / registro de usuários.

Este sistema atuará como o banco de dados oficial do usuário e fornece uma interface RESTful para criar novos usuários e autenticar usuários válidos.

  1. Eu preciso ser capaz de criar novos usuários no WP e, como parte desse processo, fazer uma chamada para a API de autenticação externa para criar / validar esse usuário.

  2. Uma pessoa que é um usuário válido, mas não conhece o WP, deve poder fazer login para comentar, sem precisar se registrar no site do WP.

  3. Uma pessoa logada no site em geral também deve fazer login automaticamente no WordPress.

Eu estou pensando o seguinte é o caminho a percorrer.

  • Para (1) - existe um gancho de registro que eu possa usar?

  • Para (2) - suponho que eu conecte o filtro de autenticação - ou seja, quando alguém tenta fazer login, intercepto isso, faço uma chamada para o sistema externo e, em seguida, processamos o login do WP ou os redirecionamos para o processo de registro em que ( 1) leva oer.

  • Para (3) - leia o cookie de login definido pelo site principal e prossiga com (2)?

Acho que também vou precisar inserir um registro nos usuários e na tabela usermeta.

Então, o que foi dito acima faz sentido - não pensei em algo. Alguém tem bons recursos para ajudar com isso (@hakre - vi que você fez algum trabalho nisso !!).

Atualizar

Então, ainda estou pensando um pouco sobre isso, basicamente estou tentando conectar o filtro de autenticação e usá-lo para:

  1. verifique se um cookie de logon para o site 'mestre' está definido e, se for, revalidar a API de autenticação e, se for válido, force um logon WP wp_signon()usando as informações contidas no cookie do site mestre (email e senha com hash) como credenciais para o WP
  2. se o cookie não estiver definido, redirecione para a página de login do site principal e obtenha um login / inscrição e volte para a etapa 1
  3. se não houver um usuário WP quando existir um usuário autenticado do site mestre, crie-o e faça um logon 'transparente' (ou seja, para que o usuário não veja um formulário de login do WP)

Basicamente, quero ocultar totalmente o formulário de login do WP para usuários que estão apenas comentando, e mais tarde encontrar uma maneira de permitir que autores e administradores acessem diretamente.

Está indo bem devagar, aqui está o que eu poderia usar para ajudar:

  • o filtro de autenticação é o correto para usar? Ele não parece ser chamado em todas as situações que eu esperaria - por exemplo, o meta widget exibe links de logon / logout sem o disparo de gancho autenticado

  • posso wp_signon()retornar um WP_Userobjeto (indicando sucesso), mas isso não afeta o status de logon - ou seja, o meta widget ainda seria exibido em "Login", mesmo após a atualização.

Qualquer ajuda recebida com gratidão :)

anu
fonte
talvez essa deva ser uma pergunta separada?
anu
ah, e eu não sei se isso pode ser mencionado, mas eu ficaria feliz em pagar meio dia ou mais por isso - detalhes de contato no meu perfil.
anu

Respostas:

12

OK, a abordagem que está funcionando para mim é a seguinte:

  1. Suponha que o banco de dados do usuário principal do site seja autoritário. O cookie de login do site principal contém um ID e um hash da senha do site.

  2. Obtenha o cookie do site principal e revalide-o na API de autenticação do site principal

  3. Se válido, use o endereço de email do valor retornado como o 'user_login'valor para WP e a senha do site com hash como a senha WP.

  4. Teste se este usuário existe no WP usando wp_authenticate('user_login', 'user_pass'). Isso retorna um WP_Userobjeto em caso de sucesso ou um WP_Errorobjeto em falha.

  5. Se WP_Error/is_wp_error(), use use wp_update_user()para criar um usuário (ou atualizar um usuário com uma senha alterada).

  6. Entrada via wp_set_current_user(), wp_set_auth_cookie()edo_action('wp_login, id)

(Tudo isso está contido em uma função anexada à 'init'ação)

Isso parece estar funcionando - usuários do site válidos desconhecidos pelo WP são criados automaticamente. As alterações de senha são atendidas e, se o cookie do site estiver definido e o usuário do WP existir, o SSO será automático e bastante uniforme.

anu
fonte
1
+1 Descrição / resposta impressionante. Espero que você encontre tempo um dia para mostrar um pouco mais de detalhes um dia. Iria nos ajudar outros a evitar a maior parte do julgamento / Erro;)
kaiser
1
É exatamente isso que estou procurando. Você pode explicar um pouco mais o processo? Especialmente os passos 1,2,3 não são muito claros para mim. Obrigado!!
chifliiiii
3

Todo o sistema de autenticação é conectável. Eu sugiro olhar os plugins existentes para ter uma idéia de como substituir o sistema. Talvez por olhar para alguns plugins LDAP ?

Dougal Campbell
fonte
Sim e sem querer ser sarcástico, isso é óbvio !!
anu
Para algumas informações que podem ajudar com refletindo o usuário assinou-on status, veja a minha resposta a essa outra pergunta: wordpress.stackexchange.com/questions/8998/...
Dougal Campbell
1

Várias funções relacionadas ao usuário são definidos condicionalmente em !function_exists()em wp-includes/pluggable.phpe são fáceis de substituir com suas próprias versões.

Rarst
fonte
1

A ativação do logon único no WordPress levou mais de 18 horas de luta, mas pode levar apenas alguns minutos:

Basicamente, você desejará usar https://wordpress.org/plugins/wp-force-login/ e uma versão modificada de https://as.wordpress.org/plugins/jwt-authenticator/ e criar uma autenticação endpoint protegido em seu site principal que gera um JWT (JSON Web Token) e redireciona de volta para o URL especial do seu site WordPress.

Veja o código completo aqui .

Ryan
fonte
Obrigado pela sua resposta. As respostas apenas aos links são desencorajadas, pois os links podem desaparecer e tornar a resposta inútil. É melhor incluir os bits relevantes aqui.
kaiser