Drupalログインフォームを使用すると、ユーザーはusernameまたはemailを入力してサイトにログインできます。
サービスで同じことを達成する必要があります。ただし、サービスではユーザーはユーザー名でログインできます(電子メールでは機能しません)。
ユーザーログイン用のJSON形式(機能)。
{"username":'myusername', "password":"mypassword"}
しかし、ユーザー名として「メール」を使用してログインするにはどうすればよいでしょうか。次のJSON形式を試しました
入力:
{"username":'[email protected]', "password":"mypassword"}
応答:
["Wrong username or password."]
入力:
{"mail":'[email protected]', "password":"mypassword"}
応答:
["Missing required argument username"]
このリンク によると、この要件を達成するにはサービスモジュールを微調整する必要があります。
これを達成する方法はありますか?
カスタムモジュールでこれを行うことができます:
/**
* Implements hook_services_resources_alter().
*/
function my_module_services_resources_alter(&$resources, &$endpoint) {
// Override the normal user login callback.
if (isset($resources['user']['actions']['login']['callback'])) {
$resources['user']['actions']['login']['callback'] = 'my_module_services_login';
}
}
/**
* Replacement callback for the Services user login resource. Optionally use the email address to login.
*
* @see _user_resource_login().
* @see https://drupal.org/node/1431724
*/
function my_module_services_login($username, $password) {
$result = db_query(
"SELECT name FROM {users} WHERE LOWER(mail) = LOWER(:username)",
array(':username' => $username)
)->fetch();
if (!empty($result->name)) { $username = $result->name; }
return _user_resource_login($username, $password);
}
この手法を使用すると、サービスモジュールにパッチを適用する必要はありません。
このソリューションはDrupalGapから借用したものです。
とりあえず、サービスモジュールに独自のパッチを追加しました。
User_resource.incファイルで、_user_resource_login
関数のuser_authenticate
を呼び出す直前に、次のコード行を追加しました
if (valid_email_address($username)) {
$username = db_query("SELECT name FROM {users} WHERE mail = :mail",array(':mail' => $username))->fetchField();
}
私はユーザーをログインさせるために以下の両方のフォーマットをテストしました。
{"username":"myusername","password":"mypassword"}
{"username":"[email protected]","password":"mypassword"}
時間が取れたら、@ Clivesの提案(コメントから)を私の回答として投稿します:)
これが自分のサービスモジュールに独自のパッチを追加しようとしている人に役立つことを願っています