register.json ne connecte pas l'utilisateur ou ne renvoie pas la session / le jeton / le mot de passe de l'utilisateur


9

J'ai essayé beaucoup trop de variantes pour les énumérer ici, mais le point de base est que je ne peux pas connecter l'utilisateur immédiatement après son inscription via les services. J'ai essayé une nouvelle installation de Drupal 7.33 avec uniquement les services 7.x.3.11 activés et les paramètres de ressources par défaut fournis par drupalgap 7.x.1.9

Lorsque je m'inscris en utilisant l'interface Drupal, l'utilisateur est créé, la session ouverte et j'atterris sur ma page de profil connectée.

contre.

Lorsque j'appelle le point de terminaison Services /services/user/register.json, Drupal crée le compte mais la session ne persiste pas. Voir mes captures d'écran ci-dessous.

entrez la description de l'image ici

Comment puis-je A. faire en sorte que la session persiste pour les appels de ressources de service ultérieurs OU B. hook pour ajouter le mot de passe de l'utilisateur ou généré automatiquement dans la réponse json afin que je puisse resoumettre par programme le côté client du formulaire /login.json (qui persiste)?

Cette question comment l'utilisateur global $ pourrait-il être différent entre l'interface Drupal et le module Services? décrit mon même problème en utilisant LoginToboggan.

Dans ma capture d'écran, vous verrez une ligne de débogage appelée "debug de connexion". Il vient de la ligne 333 de "/sites/all/modules/logintoboggan/logintoboggan.module" où j'ai essayé tout cela en vain ...

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');

@Clive, est-ce contraire aux conditions de l'aide payée de solicite ici?
EAT

C'est @EliATaylor, je laissais juste un commentaire. Nous ne sommes intéressés que par la question et la réponse ici , toute autre chose (solliciter un travail rémunéré, demander des liens vers des didacticiels, ou essentiellement la plupart des autres choses qui se produisent hors site) est une distraction de cela et quelque chose que nous protégeons. Tout ce que nous voulons vraiment, c'est une bonne question (que nous avons ici, génial) et une bonne réponse (qui, espérons-le, vous obtiendrez)
Clive

vous m'avez aidé trop de fois à me plaindre ici, mais ça alors @clive. je pourrais mettre cette conversation hors ligne et ne pas encombrer cet écran, sauf une fois que nous l'avons résolu. Ici aussi, je n'ai même pas la réputation d'utiliser la fonction de chat. Puis-je en échanger avec StackOverflow? Pas même lier mon lien github au repo?
EAT

1
Pas même :) Tout simplement, nous ne sommes pas un forum de support, et tout ce qui n'est pas "question" ou "réponse" va à l'encontre de notre mission de créer un référentiel de connaissances de haute qualité sur Drupal. Tout ce qui est nécessaire pour répondre à la question doit être dans la question elle-même, car si ce n'est pas le cas, la question devient inutile dès que les liens hors site disparaissent ou que le problème est résolu. Les règles peuvent sembler arbitraires, voire rigoureuses, mais elles se sont révélées nécessaires par le modèle Stack Exchange dans son ensemble depuis plusieurs années maintenant. Si vous vous souvenez que c'est juste Q + A ici, il n'y aura jamais de problème
Clive

En ce qui concerne votre représentant pour discuter - vous en êtes très proche maintenant, et je soupçonne que cette question attirera quelques votes positifs car elle est bien écrite. Ils viendront avec le temps. C'est l'autre chose que je dois mentionner, nous n'avons pas le sens du temps ici en tant que tel - nous préférerions que les questions prennent plus de temps à répondre, mais de manière plus qualitative que les réponses rapides et basiques. Ce n'est pas que nous encourageons les gens à être lents ou quelque chose comme ça, mais si vous avez besoin de quelque chose d'accompli dans le respect du temps, ce n'est pas une bonne idée de couvrir vos paris sur ce qui se passe ici, car nous ne nous concentrons pas là-dessus
Clive

Réponses:


1

Vous ne savez pas si vous avez besoin d'une réponse à ce stade (ou si elle est même une), mais il semble que vous ayez activé "Exiger la vérification des e-mails lorsqu'un visiteur crée un compte"?

Dans votre image, dans la deuxième fenêtre (où vous voyez le message de drupal_set_message ()), il indique qu'un e-mail a été envoyé et vous devrez suivre les instructions pour obtenir le message complet.

Pour désactiver cette option, accédez à / admin / config / people / accounts et décochez Exiger la vérification des e-mails lorsqu'un visiteur crée un compte.

Si vous regardez la table des utilisateurs dans la base de données, la colonne d'état doit afficher un 1 pour activé, 0 pour désactivé (ce qui signifie qu'il n'a pas cliqué sur le lien dans l'e-mail).

J'espère que cela aide!


Cela n'a pas fonctionné même si vous activez les utilisateurs enregistrés par défaut
Mohammed Gomma

0

Cela fonctionne bien pour moi, vous pouvez utiliser le code suivant

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);

transmettez l'identifiant et le mot de passe de l'e-mail de l'utilisateur, puis il renverra toutes les valeurs requises comme l' identifiant de session, le nom de la session, le jeton, l'uid de l'utilisateur


Il crée de nouvelles sessions mais aucun enregistrement dans le tableau des sessions inséré, donc toujours pas de session valide
Mohammed Gomma
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.