Compreendendo o gerenciamento de sessões e a autenticação do usuário do Drupal

16

Eu tenho um requisito onde, eu tenho que substituir a autenticação do usuário padrão pela autenticação de um servidor central, ou seja, servidor SSO.
Ao depurar o Drupal, fiquei sabendo que todo o gerenciamento de sessões acontece em includes/session.incarquivo. Quero fazer a autenticação, como mostrado na imagem:

estalar

CENÁRIO: Login
Os detalhes das etapas seriam:

  1. Substitua o formulário de login para enviar o nome de usuário e a senha ao servidor SSO ( não no Drupal , mas no .NET).
  2. Autentique o usuário no servidor SSO usando o banco de dados desse site; e envie uma resposta de volta para alguma página PHP personalizada do meu site (ou um formulário de um módulo?).
  3. Usando a resposta, identifique o usuário na tabela de usuários e crie uma sessão para esse usuário sem verificar a senha (pois isso significaria autenticação dupla). Por padrão, o Drupal define um cookie com o nome da $insecure_session_namevariável e com o valor $sid. Quero que o Drupal não defina o cookie aqui, envie os valores das variáveis ​​para o servidor SSO.
  4. O servidor SSO pegará os valores, criará um cookie e o descartará no domínio principal domain.com(para lembrar os dois my websitee sso serverestá no subdomínio do domínio principal, que também não está no Drupal). Em seguida, o site drupal pode efetuar login usando esse cookie.

Eu sei que é uma pergunta difícil, só estou procurando indicações sobre como devo começar? como se costuma dizer "você não deve invadir o núcleo". Então, minhas perguntas são:

  1. Onde devo procurar para entender como a autenticação e o gerenciamento de sessões do Drupal funcionam em profundidade?
  2. Existe uma maneira de chamar as funções includes/session.incusando ganchos (como os comentários com funções dizem "apenas para uso interno / não devem ser modificados")?

NOTA: Vou usar o mesmo método para registrar o usuário, para que o registro permaneça no banco de dados central do servidor SSO. E durante isso, você inserirá uma senha indesejada para o mesmo usuário no banco de dados do site Drupal (pois a senha não será verificada durante o login).

AjitS
fonte
Você precisa de um SSO verdadeiro (faça login em um site e faça logon em todos os sites) ou apenas se autentique em um sistema externo?
mpdonadio
@MPD eu quero um verdadeiro SSO, o que exigirá o log in em um site e -> autenticando mesmo usuário em todos os sites (pode não estar em Drupal.
AjitS
@AjitS Se você implementou com êxito isso, por favor, responda detalhadamente. Estou usando user_login_finalize, mas estou sendo informado devido a problemas no GDPR. Não posso armazenar os detalhes no Drupal.
Jignesh Rawal

Respostas:

17

Drupal suporta autenticação externa . Existem muitas alternativas de módulos de autenticação para o Drupal, como OpenID (incluído no núcleo), OAuth Connector ou LDAP . Saiba mais sobre como a autenticação Drupal funciona; o melhor seria examinar os módulos OpenID e OAuth e enviar o retorno de chamada ao formulário de login principal. Mas, AFAIK, eles sempre iniciam a sessão normal do Drupal após uma autenticação bem-sucedida.

Para gerenciamento de sessões, o Drupal se conecta ao tratamento de sessões PHP e registra seus próprios manipuladores. A sessão backend Drupal é a própria pluggable, você pode definir a session_incvariável para o caminho de um arquivo fornecendo implementações alternativas das funções encontradas em includes/session.inc. O módulo memcache usa isso para armazenar a sessão no memcached.

Para referências, o módulo OpenID lida com a autenticação bem-sucedida na openid_authentication()qual ele cessa e chama o manipulador de envio do formulário de login do usuário (ou seja, user_login_submit()). Esse manipulador de envio em si é simples, carrega o usuário autenticado com êxito user_load()na $uservariável global e, em seguida, chama user_login_finalize()qual manipula sessão, efetua o registro de data usere hora na tabela e invoca hook_user_login()implementações.

Outra opção é usar a user_external_login_register()função A função fará logon em um usuário externo. Também cria um usuário local, se necessário. Se você precisar de mais controle sobre a criação do usuário local, você sempre pode usar user_save(), user_set_authmaps(), user_login_submit()e user_external_load()de você chamar costume, usando user_external_login_register()como modelo do que precisa ser feito.

Pierre Buyle
fonte
2
Este é praticamente o local. O lado Drupal de fazer logon em usuários externos é surpreendentemente fácil. O trabalho pesado (se houver) está realmente interagindo com o sistema externo.
mpdonadio
@MPD Encontrando o oposto, no meu caso particular. Sistema externo = serviço da web JSON = material relativamente fácil. Comportamento drupal = mudança imprevisível de versão para versão = difícil como o inferno e nenhum diagnóstico útil quando as coisas quebram.
precisa saber é o seguinte
1

A APi user_authenticate () pode ser útil aqui.

3.Usando a resposta, identifique o usuário na tabela de usuários e crie uma sessão para esse usuário sem verificar a senha (pois isso significaria autenticação dupla). Por padrão, o Drupal define um cookie com o nome da $insecure_session_namevariável e com o valor $sid. Quero que o Drupal não defina o cookie aqui, envie os valores das variáveis ​​para o servidor SSO.

EDIT: Quando o servidor SSO retornar com true, use esta API para efetuar login no usuário, que cuidará automaticamente das sessões para você. Eu acho que é melhor se você usar em user_authenticate()vez de criar sessões sozinho. Ele não deve causar problemas, mesmo que seja uma autenticação dupla, desde que seja fornecida uma senha válida.

Não tenho certeza de 4. Deseja que o cookie fique visível nos dois domínios? Nesse caso, em settings.php inicialize $cookie_domainno domínio. Em seguida, os cookies no subsite estarão disponíveis no site pai.

GoodSp33d
fonte
obrigado pela sua resposta. Não posso usar user_authenticateporque, a autenticação não precisa acontecer no site Drupal. Eu posso gerar a sessão chamando drupal_session_generate()e drupal_session_regenerate()do arquivo session.inc. Você acertou no requisito do cookie. Consulte a edição.
AjitS
@indrock Verifique esse link. User_authenticate permitirá que você efetue login em um usuário, desde que o nome de usuário e a senha estejam corretos. Na etapa 3, quando você verificar se o nome de usuário e a senha estão corretos no servidor SSO, use esta API para fazer login no usuário. Mas você deve ter uma senha armazenada no Drupal. Fazer isso tornará muito mais fácil do que o núcleo do hacking.
GoodSp33d