register.json non effettua il login dell'utente o restituisce la sessione / token / password dell'utente


9

Ho provato troppe varianti per elencarle qui, ma il punto di base è che non riesco a far accedere l'utente immediatamente dopo la registrazione tramite Servizi. Ho provato una nuova installazione di Drupal 7.33 con solo i Servizi 7.x.3.11 abilitati e le impostazioni delle risorse predefinite fornite da drupalgap 7.x.1.9

Quando mi registro utilizzando l'interfaccia Drupal, l'utente viene creato, la sessione viene aperta e arrivo sulla pagina del mio profilo.

vs.

Quando chiamo l'endpoint Servizi /services/user/register.json, Drupal crea l'account ma la sessione non persiste. Vedi i miei screenshot qui sotto.

inserisci qui la descrizione dell'immagine

Come posso A. ottenere la persistenza della sessione per le successive chiamate alle risorse del servizio OPPURE B. hook per aggiungere la password dell'utente o generata automaticamente nella risposta json in modo da poter inviare nuovamente a livello di codice il modulo /login.json lato client (che persiste)?

Questa domanda come potrebbe l'utente $ globale essere diverso tra l'interfaccia Drupal e il modulo Servizi? descrive il mio stesso problema usando LoginToboggan.

Nel mio screenshot vedrai una linea di debug chiamata "login debug". Viene dalla riga 333 di "/sites/all/modules/logintoboggan/logintoboggan.module" dove ho provato tutto questo senza risultati ...

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, è contro i termini sollecitare l'aiuto pagato qui?
Mangia il

È @EliATaylor, stavo solo lasciando un commento. Siamo interessati solo alla domanda e alla risposta qui , qualsiasi altra cosa (sollecitare il lavoro retribuito, chiedere link a tutorial o fondamentalmente la maggior parte delle cose che accadono fuori sede) è una distrazione da ciò e qualcosa contro cui ci guardiamo. Tutto ciò che vogliamo davvero è una buona domanda (che abbiamo qui, fantastica) e una buona risposta (che speriamo che tu possa ottenere)
Clive

mi hai aiutato troppe volte a lamentarmi qui, ma accidenti @clive. potrei portare quella conversazione offline e non ingombrare questa schermata se non una volta risolta. Anche qui, non ho nemmeno la reputazione di usare la funzione di chat. Posso scambiare alcuni da StackOverflow? Neanche collegare il mio link github al repository?
Mangia il

1
Nemmeno :) Semplicemente non siamo un forum di supporto e tutto ciò che non è "domanda" o "risposta" va contro la nostra missione di creare un repository di alta qualità delle conoscenze su Drupal. Tutto ciò che è necessario per rispondere alla domanda deve trovarsi nella domanda stessa, perché in caso contrario, la domanda diventa inutile non appena i collegamenti esterni al sito si interrompono o il problema viene risolto. Le regole possono sembrare arbitrarie o addirittura severe, ma sono state dimostrate necessarie dal modello Stack Exchange nel suo complesso da diversi anni ormai. Se ricordi che è solo Q + A qui, non ci sarà mai un problema
Clive

Per quanto riguarda il tuo rappresentante per le chat - sei molto vicino a questo ora e sospetto che questa domanda attirerà alcuni voti poiché è ben scritta. Arriveranno con il tempo. Questa è l'altra cosa che dovrei menzionare, non abbiamo il senso del tempo qui in quanto tale - preferiremmo che le domande richiedessero più tempo per rispondere, ma in un modo di qualità superiore rispetto alle risposte rapide e di base. Non che incoraggiamo le persone a essere lente o qualcosa del genere, ma se hai bisogno di qualcosa realizzato in modo sensibile al tempo non è una buona idea coprire le tue scommesse su ciò che accade qui, dal momento che non siamo concentrati su di esso
Clive

Risposte:


1

Non sei sicuro di aver bisogno di una risposta a questo punto (o se questa è anche una), ma sembra che tu abbia attivato "Richiedi verifica e-mail quando un visitatore crea un account"?

Nella tua immagine, nella seconda finestra (dove vedi il messaggio da drupal_set_message ()), dice che è stata inviata una e-mail e dovrai seguire le istruzioni per ottenere il messaggio completo.

Per disattivarlo, vai su / admin / config / people / account e deseleziona Richiedi verifica e-mail quando un visitatore crea un account.

Se guardi la tabella degli utenti nel database, la colonna di stato dovrebbe mostrare 1 per abilitato, 0 per disabilitato (il che significa che non ha fatto clic sul collegamento nell'e-mail).

Spero che sia d'aiuto!


Non ha funzionato anche se rendi attivi gli utenti registrati per impostazione predefinita
Mohammed Gomma

0

Per me funziona benissimo, puoi usare il seguente codice

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

passa l'ID e-mail e la password dell'utente, quindi restituirà tutto il valore richiesto come ID sessione, nome sessione, token, uid utente


Crea nuove sessioni ma non viene inserito alcun record nella tabella delle sessioni, quindi ancora nessuna sessione valida
Mohammed Gomma,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.