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


9

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

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

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

ここに画像の説明を入力してください

A.後続のサービスリソース呼び出しのためにセッションを持続させるか、またはB.フックを使用してjson応答にユーザーのパスワードまたは自動生成されたパスワードを追加し、プログラムで/login.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');

@クライヴ、ここで有償の助けを求めることは条件に反していますか?
EAT

@EliATaylorです。コメントを残しました。私たちはここでの質問と回答にのみ興味があります。それ以外のもの(有料の仕事を求めたり、チュートリアルへのリンクを要求したり、基本的にはオフサイトで発生するほとんどのこと)は、それと気が散ることです。私たちが本当に望んでいるのは、良い質問(ここにあります、素晴らしい)と良い答え(うまくいけば、あなたが理解できるでしょう)です
Clive

ここで文句を言うのを何度も助けてくれましたが、@ cliveを大丈夫です 会話をオフラインにして、解決しない限りこの画面を乱雑にすることはできません。ここでも、チャット機能を使う評判はありません。StackOverflowから取引できますか?私のgithubリンクをリポジトリにリンクしていませんか?
EAT

1
さえ:)まったく私たちはサポートフォーラムではありません。「質問」や「回答」ではないものは、Drupalに関する知識の高品質なリポジトリを作成するという私たちの使命に反します。質問に答えるために必要なものはすべて質問自体に含まれている必要があります。そうでない場合、オフサイトリンクが停止するか、問題が修正されるとすぐに、質問は役に立たなくなります。ルールは恣意的または厳しいものに見えるかもしれませんが、何年にもわたってStack Exchangeモデル全体で必要であることが証明されています。ここでQ + A だけだと覚えていれば、問題はありません
クライヴ

チャットの担当者について-あなたは現在それに非常に近いです。この質問はよく書かれているため、いくつかの賛成票を集めると思います。彼らは時間とともに来るでしょう。それは私が言及すべきもう一つのことです、ここにはそのような時間感はありません-質問は答えるのに時間がかかりましたが、素早い基本的な回答よりも質の高い方法でしたいと思います。ではない私たちが遅いか、そのようなものであることを人々を奨励していますが、何かが時間に敏感な方法で達成必要がある場合、我々がそれに焦点を当てていないことから、ここで起こっにあなたの賭けをヘッジするためには良い考えではありませんこと
クライヴ

回答:


1

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

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

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

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

それが役に立てば幸い!


登録ユーザーをデフォルトでアクティブにしても機能しませんでした
Mohammed Gomma

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


新しいセッションが作成されますが、挿入されたセッションテーブルにレコードがないため、有効なセッションはまだありません
Mohammed Gomma
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.