register.json meldet den Benutzer nicht an und gibt die Sitzung / das Token / das Kennwort des Benutzers nicht zurück

9

Ich habe viel zu viele Variationen ausprobiert, um sie hier aufzulisten, aber der grundlegende Punkt ist, dass ich den Benutzer nicht sofort nach der Registrierung über Services anmelden kann. Ich habe versucht, Drupal 7.33 neu zu installieren, wobei nur Services 7.x.3.11 aktiviert und die Standardressourceneinstellungen von drupalgap 7.x.1.9 bereitgestellt wurden

Wenn ich mich über die Drupal-Oberfläche registriere, wird der Benutzer erstellt, die Sitzung geöffnet und ich lande auf meiner angemeldeten Profilseite.

vs.

Wenn ich den Service-Endpunkt /services/user/register.jsonaufrufe, erstellt Drupal das Konto, aber die Sitzung bleibt nicht bestehen. Siehe meine Screenshots unten.

Geben Sie hier die Bildbeschreibung ein

Wie kann ich entweder A. die Sitzung für nachfolgende Serviceressourcenaufrufe fortsetzen lassen oder B. Hook, um das oder das automatisch generierte Kennwort des Benutzers wieder in die json-Antwort einzufügen, damit ich das Formular /login.json clientseitig programmgesteuert erneut senden kann (welches bleibt bestehen)?

Diese Frage: Wie kann sich der globale $ user zwischen der Drupal-Schnittstelle und dem Services-Modul unterscheiden? beschreibt mein gleiches Problem mit LoginToboggan.

In meinem Screenshot sehen Sie eine Debug-Zeile namens "Login Debug". Es kommt aus Zeile 333 von "/sites/all/modules/logintoboggan/logintoboggan.module", wo ich all dies ohne Erfolg versucht habe ...

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');
ESSEN
quelle
@Clive, ist es gegen die Bedingungen, hier um bezahlte Hilfe zu bitten?
ESSEN
Es ist @EliATaylor, ich habe gerade einen Kommentar hinterlassen. Wir sind nur an der Frage und der Antwort hier interessiert. Alles andere (um bezahlte Arbeit zu bitten, nach Links zu Tutorials zu fragen oder im Grunde die meisten anderen Dinge, die außerhalb des Standorts passieren) ist eine Ablenkung davon und etwas, vor dem wir uns schützen. Alles was wir wirklich wollen ist eine gute Frage (die wir hier haben, großartig) und eine gute Antwort (die Sie hoffentlich bekommen werden)
Clive
Du hast mir zu oft geholfen, mich hier zu beschweren, aber gosh @clive. Ich könnte dieses Gespräch offline schalten und diesen Bildschirm nur dann überladen, wenn wir es gelöst haben. Auch hier habe ich nicht einmal den Ruf, die Chat-Funktion zu nutzen. Kann ich einige von StackOverflow handeln? Nicht einmal meinen Github-Link mit dem Repo verknüpfen?
ESSEN
1
Nicht einmal :) Ganz einfach, wir sind kein Support-Forum, und alles, was nicht "Frage" oder "Antwort" ist, widerspricht unserer Mission, ein qualitativ hochwertiges Wissensspeicher über Drupal zu schaffen. Alles, was zur Beantwortung der Frage erforderlich ist, muss in der Frage selbst enthalten sein. Andernfalls wird die Frage unbrauchbar, sobald die externen Links nicht mehr funktionieren oder das Problem behoben ist. Die Regeln mögen willkürlich oder sogar streng erscheinen, aber das gesamte Stack Exchange-Modell hat sich über mehrere Jahre als notwendig erwiesen. Wenn Sie sich erinnern, dass es hier nur Fragen und Antworten gibt, wird es nie ein Problem geben
Clive
In Bezug auf Ihren Repräsentanten für das Chatten - Sie sind dem jetzt sehr nahe, und ich vermute, dass diese Frage ein paar positive Stimmen anziehen wird, da sie gut geschrieben ist. Sie werden mit der Zeit kommen. Das ist das andere, was ich erwähnen sollte, wir haben hier kein Zeitgefühl als solches - wir möchten lieber, dass die Beantwortung von Fragen länger dauert, aber auf eine qualitativ hochwertigere Weise als schnelle und grundlegende Antworten. Nicht, dass wir die Leute dazu ermutigen, langsam zu sein oder so etwas, aber wenn Sie etwas benötigen, das zeitkritisch erledigt wird, ist es keine gute Idee, Ihre Wetten darauf abzusichern, da wir uns nicht darauf konzentrieren
Clive

Antworten:

1

Sie sind sich nicht sicher, ob Sie zu diesem Zeitpunkt eine Antwort benötigen (oder ob dies überhaupt eine ist), aber es sieht so aus, als hätten Sie "E-Mail-Bestätigung erforderlich, wenn ein Besucher ein Konto erstellt" aktiviert?

In Ihrem Bild wird im zweiten Fenster (in dem Sie die Nachricht von drupal_set_message () sehen) angegeben, dass eine E-Mail gesendet wurde, und Sie müssen den Anweisungen folgen, um die vollständige Nachricht zu erhalten.

Um dies zu deaktivieren , navigieren Sie zu / admin / config / people / accounts und deaktivieren Sie die Option E-Mail-Bestätigung erforderlich, wenn ein Besucher ein Konto erstellt.

Wenn Sie sich die Benutzertabelle in der Datenbank ansehen, sollte in der Statusspalte eine 1 für aktiviert und eine 0 für deaktiviert angezeigt werden (was bedeutet, dass er nicht auf den Link in der E-Mail geklickt hat).

Ich hoffe es hilft!

sshrestha
quelle
Es hat nicht funktioniert, auch wenn Sie registrierte Benutzer standardmäßig aktiviert haben
Mohammed Gomma
0

Es funktioniert gut für mich, Sie können folgenden Code verwenden

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

Übergeben Sie die Benutzer-E-Mail-ID und das Kennwort. Anschließend werden alle erforderlichen Werte wie Sitzungs-ID, Sitzungsname, Token und Benutzer-UID zurückgegeben

Altaf Hashmi
quelle
Es werden neue Sitzungen erstellt, aber kein Datensatz in der Sitzungstabelle eingefügt. Es ist also immer noch keine gültige Sitzung
verfügbar