Estou procurando a API que permitirá que eu entre com um usuário, passando o nome de usuário e a senha. Alguém tem experiência com isto?
Para esclarecer, estou tentando criar uma caixa de login do AJAX que apareça como um pop-up na página inicial e não atualize a página no caso de credenciais incorretas, mas apenas se o login estiver correto. Então, aqui está o que eu fiz até agora:
Atualizar
Agora, carrego o formulário de login na minha página inicial e, após o envio, inicio uma solicitação AJAX que envia credencial para este script:
function user_login_submit_try() {
global $user;
$uid = user_authenticate($_POST['name'],$_POST['pass']);
$arr = array ('name'=>$_POST['name'],'pass'=>$_POST['pass']);
if ($uid){
$user = user_load($uid);
user_login_finalize($arr);
}
echo drupal_json_encode($uid);
exit;
};
Até agora, funciona, mas minhas preocupações são (como mencionado pelo googletorp) problemas de segurança; parece que nenhuma das API que usei nesse script higienizou os dados de qualquer maneira.
Alguém veria uma maneira melhor de fazer isso?
Respostas:
Isso pode ajudar alguém:
Uma versão melhor baseada no comentário:
fonte
hook_user_insert
mas as funções acima na resposta desejam a senha como texto sem formatação original. Eu acho que vou precisar tentarhook_form_alter
...Não existe uma função API simples para isso.
Você pode fazer o que o Drupal faz:
Substitua o
global $user
.Lidar com sessões
Para os passos dois e 3, consulte
user_login_submit()
Todas essas funções são baseadas em chamadas de um formulário. O fluxo normal é que os manipuladores de validação testam a entrada dos usuários e retornam o uid do usuário se a validação for aprovada. O manipulador de envio lida com o logon real do usuário e com o gancho do usuário que está chamando.
fonte
$form_state['value']['name'] = $_POST['name']
e assim por diante ..$form_state
variável. Existem muitas verificações de segurança legais que você perderia e, possivelmente, abriria o site para ataques. Quando se trata de fazer login em um usuário, você não quer perder essa segurança.Se você precisar obter o objeto de usuário para a conta de usuário cuja senha e nome de usuário você conhece, poderá usar o seguinte código:
$account
seráFALSE
se o objeto do usuário não puder ser encontrado ou carregado.Você deve usar esse código quando, por exemplo, seu módulo obtiver o nome de usuário e a senha como entrada de um usuário, verificar se eles estão corretos e fazer algo com o objeto de usuário.
Se você estiver escrevendo um módulo que precisa se passar por um usuário para escrever um comentário ou fazer algo que precise resultar como feito por um usuário, é o que o módulo de rastreamento de problemas do Projeto faz ao fechar um relatório de problemas que está no diretório status fixo por duas semanas (nesse caso, ele adiciona o comentário "Problema resolvido automaticamente por 2 semanas sem atividade", que resulta escrito pelo usuário "Mensagem do sistema"), então você não precisa de nome de usuário e senha. Você acabou de carregar o objeto de usuário para o qual você conhece o ID do usuário.
Até onde eu sei, não há problemas de segurança com o código que relatei.
Você pode querer limitar o número de logins com falha; ou bloquear temporariamente o IP que tenta efetuar login sem êxito ou tenta logins diferentes em pouco tempo.
fonte
Esse código realmente funciona
fonte
Resposta limpa do acima. Verificar usuário e senha é um recurso adicional. Além disso, o false form_state precisa ser uma variável a ser passada por referência à função ou gera um erro.
Portanto, temos:
fonte
O usuário receberá a sessão e também fará logon em outras páginas:
fonte
Às vezes, precisamos de login rápido a partir da URL ou Esqueci a senha do administrador. Basta implementar abaixo de duas funções para fazer login como usuário 1 no Drupal.
fonte