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

11

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 autoritativo do usuário e fornecerá 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 conhecido pelo WP, deve poder fazer o login para comentar, sem precisar se registrar no próprio site do WP.

  3. Uma pessoa conectada ao site geral também deve estar automaticamente conectada ao WordPress.

  

Estou pensando que o seguinte é o caminho a seguir.

     
  • 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 efetuar login, intercepto isso, faço uma chamada para o sistema externo e então procuro o login do WP ou redireciono-o para o processo de registro, onde (1) leva oer.

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

  •   

Acho que também precisarei inserir um registro na tabela users e usermeta.

Então, o que está acima faz sentido - não pensei em algo? Alguém tem algum bom recurso para ajudar com isso (@hakre - eu vi que você fez algum trabalho sobre isso !!).

Atualizar

Então, eu ainda estou batendo minha cabeça contra isso um pouco, essencialmente, eu estou tentando ligar para o filtro de autenticação e usar isso para:

  1. verifique se um cookie de login para o site 'principal' está definido e, se estiver, revalidar com relação à API de autenticação e, se for válido, forçar um login do WP com wp_signon() , usando as informações contidas no cookie do site principal (email e senha com hash) como credenciais para WP
  2. se o cookie não estiver definido, redirecione para a página de login do site master e obtenha um login / inscrição e volte para a etapa 1
  3. se não houver um usuário do WP quando existir um usuário do site mestre autenticado, crie-o e, em seguida, um signon 'transparente' (ou seja, para que o usuário não veja um formulário de login do WP)
Basicamente, eu quero esconder o formulário de login do WP inteiramente para os usuários que estão apenas comentando, e depois encontrar uma maneira de permitir que autores e administradores acessem diretamente.

Está indo bem devagar, aqui está o que eu poderia usar com ajuda:

  • 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 login / logout sem o disparo de gancho autenticado

  • eu posso obter wp_signon() para retornar um objeto WP_User (indicando sucesso), mas isso não afeta o status registrado - ou seja, o widget meta ainda estaria exibindo "Login" mesmo após a atualização.

Qualquer ajuda recebida com gratidão:)

    
por anu 08.02.2011 / 18:26

3 respostas

10

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

  1. Suponha que o banco de dados do usuário do site principal seja autoritativo. 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 e-mail do valor de retorno como o valor 'user_login' para WP e a senha do site com hash como a senha do WP.

  4. Teste se esse usuário existe no WP usando wp_authenticate('user_login', 'user_pass') . Isso retorna um objeto WP_User em caso de sucesso ou um objeto WP_Error em caso de 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. Login via wp_set_current_user() , wp_set_auth_cookie() e do_action('wp_login, id)

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

Isso parece estar funcionando - usuários do site válidos, desconhecidos do 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 praticamente perfeito.

    
por anu 08.03.2011 / 14:35
3

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

    
por Dougal Campbell 04.03.2011 / 18:48
1

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

    
por Rarst 08.02.2011 / 19:51