web-dev-qa-db-ja.com

register.jsonはユーザーにログインせず、ユーザーのセッション/トークン/パスワードを返しません

ここにリストするにはあまりにも多くのバリエーションを試してみましたが、基本的なポイントは、サービスを介して登録した直後にユーザーをログインさせることができないことです。私は新しいDrupal 7.33をインストールし、サービス7.x.3.11のみを有効にして、drupalgap 7.x.1.9によって提供されるデフォルトのリソース設定を試してみました

Drupalインターフェースを使用して登録すると、ユーザーが作成され、セッションが開かれ、ログインしたプロフィールページが表示されます。

vs.

サービスエンドポイントを呼び出すと/services/user/register.json、Drupalはアカウントを作成しますが、セッションは持続しません。以下のスクリーンショットを参照してください。

enter image description here

どのようにして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');
9
E.A.T

この時点で回答が必要かどうか(または回答が1つであるかどうか)はわかりませんが、「訪問者がアカウントを作成するときに電子メールの確認を要求する」がオンになっているようですか?

画像の2番目のウィンドウ(drupal_set_message()からのメッセージが表示されている)には、メールが送信されたことが示されているため、指示に従ってメッセージ全体を取得する必要があります。

これをオフにするには、/ admin/config/people/accountsに移動し、訪問者がアカウントを作成するときに電子メールの確認を要求するのチェックを外します。

データベースのユーザーテーブルを見ると、ステータス列には、有効の場合は1、無効の場合は0が表示されているはずです(つまり、電子メールのリンクをクリックしていません)。

それが役に立てば幸い!

1
sshrestha

次のコードを使用して、うまくいきます

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のような必要なすべての値が返されます

0
Altaf Hashmi