ユーザー名とパスワードを渡してユーザーをログインさせるAPIを探しています。誰もがこれで経験がありますか?
明確にするために、ホームページにポップアップとして表示されるAJAXログインボックスを作成し、資格情報が間違っている場合にページを更新しないようにしていますが、ログインが正解です。これが私がこれまでに行ったことです。
ログインフォームをホームページにロードし、送信時にAJAXリクエストを起動して、このスクリプトに認証情報を送信します。
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;
};
これまでのところそれは機能しますが、私の懸念は(googletorpによって言及されたように)セキュリティ問題です。このスクリプトで使用したAPIのいずれも、とにかくデータをサニタイズしていないようです。
誰かがそうするためのより良い方法を見るでしょうか?
これは誰かを助けるかもしれません:
function mymodule_user_login_credentials($username, $password)
{
if(user_authenticate($username, $password))
{
$user_obj = user_load_by_name($username);
$form_state = array();
$form_state['uid'] = $user_obj->uid;
user_login_submit(array(), $form_state);
return true;
}
else
{
return false;
}
}
コメントに基づくより良いバージョン:
function mymodule_user_login_credentials($username, $password)
{
if($uid = user_authenticate($username, $password))
{
user_login_submit(array(), array('uid' => $uid));
return true;
}
else
{
return false;
}
}
そのための単純なAPI関数はありません。
あなたはDrupalがすることを行うことができます:
ser_login_name_validate()
ser_login_authenticate_validate()
ser_login_final_validate()
_global $user
_を上書きします。
_global $user;
$user = user_load($uid);
_
セッションを処理する
ステップ2と3については user_login_submit()
を参照してください
これらの関数はすべて、フォームから呼び出されることに基づいています。通常のフローでは、検証ハンドラーがユーザー入力をテストし、検証に合格するとユーザーのuidを返します。次に、送信ハンドラがユーザーの実際のログインと呼び出し元のユーザーフックを処理します。
ユーザー名とパスワードがわかっているユーザーアカウントのユーザーオブジェクトを取得する必要がある場合は、次のコードを使用できます。
function mymodule_get_user(name, $password) {
$account = FALSE;
if ($uid = user_authenticate($name, $password)) {
$account = user_load($uid);
}
return $account;
}
$account
は、ユーザーオブジェクトが見つからないかロードできない場合はFALSE
になります。
このコードは、たとえば、モジュールがユーザーからのユーザー名とパスワードを入力として取得し、それらが正しいかどうかを確認してから、ユーザーオブジェクトで何かを行うときに使用します。
コメントを書くためにユーザーを偽装する必要があるモジュールを書いている場合、またはユーザーが行った結果を必要とする他のことをしている場合 プロジェクトの問題追跡 モジュールは、2週間fixedステータスになっている問題レポートを閉じるときに実行します(その場合、コメント「自動クローズ-問題「システムメッセージ」ユーザーによって書き込まれた2週間の「アクティビティなし」の結果が修正された場合)、ユーザー名とパスワードは必要ありません。ユーザーIDがわかっているユーザーオブジェクトをロードするだけです。
私の知る限り、報告したコードにはセキュリティ上の問題はありません。
失敗したログインの数を制限することができます。または、成功せずにログインしようとしたり、短時間で別のログインを試みたりするIPを一時的にブロックする。
このコードは本当に機能します
//login
$uid = user_authenticate($username, $password);
global $user;
$user = user_load($uid);
//login finalize
watchdog('remote_user', 'Session opened for %name.', array('%name' => $user->name));
$user->login = REQUEST_TIME;
db_update('users')
->fields(array('login' => $user->login))
->condition('uid', $user->uid)
->execute();
drupal_session_regenerate();
上記の回答を整理しました。ユーザーとパスワードの確認は追加機能です。また、偽のform_stateは、関数への参照によって渡される変数である必要があります。そうしないと、エラーがスローされます。
したがって、次のようになります。
function mymodule_log_in_by_uid($uid) {
$faux_form_state = array('uid' => $uid);
user_login_submit(array(), $faux_form_state);
}
ユーザーはセッションを受け取り、他のページにもログオンします。
function custom_log_in_by_uid($uid) {
$form_state = array('uid' => $uid);
user_login_submit(array(), $form_state);
}
URLからの迅速なログインや管理者パスワードの忘れが必要になる場合があります。 Drupalでユーザー1としてログインするには、以下の2つの関数を実装するだけです。
function mymodule_menu(){
$items['login/as/admin'] = array(
'title' => 'Login as admin account',
'page callback' => 'mymodule_login_as_admin',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
function mymodule_login_as_admin(){
global $user;
$user = user_load(1);
return "Global user set as admin. Please refresh page ";
}