ここにリストするにはあまりにも多くのバリエーションを試してみましたが、基本的なポイントは、サービスを介して登録した直後にユーザーをログインさせることができないことです。私は新しいDrupal 7.33をインストールし、サービス7.x.3.11のみを有効にして、drupalgap 7.x.1.9によって提供されるデフォルトのリソース設定を試してみました
Drupalインターフェースを使用して登録すると、ユーザーが作成され、セッションが開かれ、ログインしたプロフィールページが表示されます。
vs.
サービスエンドポイントを呼び出すと/services/user/register.json
、Drupalはアカウントを作成しますが、セッションは持続しません。以下のスクリーンショットを参照してください。
どのようにしてA.後続のサービスリソース呼び出しのためにセッションを持続させるかOR B.ユーザーまたは自動生成されたパスワードをプログラムで/login.jsonフォームをクライアント側に再送信できるようにjson応答(永続化します)?
この質問 グローバル$ userがDrupalインターフェースとサービスモジュールの間でどのように異なる可能性があるか は、LoginTobogganを使用した同じ問題を説明しています。
スクリーンショットには、「ログインデバッグ」というデバッグ行があります。これは、「/ sites/all/modules/logintoboggan/logintoboggan.module」の333行目にありますが、ここではすべてを試してみましたが...
function logintoboggan_process_login($account, &$edit, $redirect = array()){
global $user;
$user = user_load($account->uid);
//watchdog('login debug', json_encode($account));
watchdog('login debug', json_encode($edit));
//user_login_submit(array(), array('uid' => $account->uid));
user_login_finalize($edit);
// $user = user_load($account->uid);
// $user->token = drupal_get_token('services'); // WE HAVE A TOKEN ALTHOUGH I DOUBT THIS WOULD WORK IN TERMS OF SESSION PERSISTANCE
// user_login_finalize($edit);
// module_invoke_all('hook_user_login');
// module_invoke_all('tripchi_user_login');
// module_invoke_all('logintoboggan_user_login');
この時点で回答が必要かどうか(または回答が1つであるかどうか)はわかりませんが、「訪問者がアカウントを作成するときに電子メールの確認を要求する」がオンになっているようですか?
画像の2番目のウィンドウ(drupal_set_message()からのメッセージが表示されている)には、メールが送信されたことが示されているため、指示に従ってメッセージ全体を取得する必要があります。
これをオフにするには、/ admin/config/people/accountsに移動し、訪問者がアカウントを作成するときに電子メールの確認を要求するのチェックを外します。
データベースのユーザーテーブルを見ると、ステータス列には、有効の場合は1、無効の場合は0が表示されているはずです(つまり、電子メールのリンクをクリックしていません)。
それが役に立てば幸い!
次のコードを使用して、うまくいきます
global $user;
$username=$data['email'];
$password=$data['pass'];
if ($user->uid) {
// user is already logged in
return services_error(t('Already logged in as @user.', array('@user' => $user->name)), 406);
}
// Check if account is active.
if (user_is_blocked($username)) {
return services_error(t('The username %name has not been activated or is blocked.', array('%name' => $username)), 403);
}
// Emulate drupal native flood control: check for flood condition.
$flood_state = array();
if (variable_get('services_flood_control_enabled', TRUE)) {
$flood_state = _user_resource_flood_control_precheck($username);
}
// Only authenticate if a flood condition was not detected.
if (empty($flood_state['flood_control_triggered'])) {
$uid = user_authenticate($username, $password);
}
else {
$uid = FALSE;
}
// Emulate drupal native flood control: register flood event, and throw error
// if a flood condition was previously detected
if (variable_get('services_flood_control_enabled', TRUE)) {
$flood_state['uid'] = $uid;
_user_resource_flood_control_postcheck($flood_state);
}
if ($uid) {
$user = user_load($uid);
if ($user->uid) {
user_login_finalize();
$return = new stdClass();
$return->sessid = session_id();
$return->session_name = session_name();
$return->token = drupal_get_token('services');
$account = clone $user;
services_remove_user_data($account);
$return->user = $account;
return $return;
}
}
watchdog('user', 'Invalid login attempt for %username.', array('%username' => $username));
return services_error(t('Wrong username or password.'), 401);
ユーザーの電子メールIDとパスワードを渡すと、セッションID、セッション名、トークン、ユーザーUIDのような必要なすべての値が返されます