register.json은 사용자를 로그인하지 않거나 사용자의 세션 / 토큰 / 암호를 반환하지 않습니다


9

여기에 나열하기에는 너무 많은 변형을 시도했지만 기본 요점은 서비스를 통해 등록한 직후 사용자가 로그인 할 수 없다는 것입니다. Services 7.x.3.11 만 활성화하고 drupalgap 7.x.1.9에서 제공하는 기본 리소스 설정으로 새로운 Drupal 7.33 설치를 시도했습니다.

Drupal 인터페이스를 사용하여 등록하면 사용자가 생성되고 세션이 열리고 로그인 한 프로필 페이지에 도착합니다.

vs.

서비스 엔드 포인트를 호출하면 /services/user/register.jsonDrupal이 계정을 작성하지만 세션이 지속되지 않습니다. 아래 스크린 샷을 참조하십시오.

여기에 이미지 설명을 입력하십시오

어떻게 A. 후속 서비스 리소스 호출에 대해 세션을 유지하거나 B. 후크를 사용하여 사용자 또는 자동 생성 암호를 json 응답에 다시 추가하여 클라이언트 측 (/login.json 양식을 프로그래밍 방식으로 다시 제출 할 수 있습니까? 지속됩니까)?

이 질문 은 Drupal 인터페이스와 서비스 모듈 간의 글로벌 $ user가 어떻게 다를 수 있습니까? LoginToboggan을 사용하여 동일한 문제를 설명합니다.

스크린 샷에는 "login debug"라는 디버그 라인이 있습니다. "/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');

@Clive, 여기에 유료 지원을 요청하는 조건에 반하는가?
EAT

@EliATaylor입니다. 방금 의견을 남기고있었습니다. 우리는 문제에 관심과 대답 여기에 , 아무것도는 (기본적으로 현장을 일이 대부분의 다른 일을 유급 노동을 유혹 자습서에 대한 링크를 요구하거나) 우리가 방지 • 그래도에서 산만하고 무언가이다. 우리가 정말로 원하는 것은 좋은 질문 (우리가 여기에 왔습니다, 굉장합니다)과 좋은 답변 (바람직하게 당신이 얻게 될 것입니다)
Clive

당신은 나에게 너무 많은 시간을 여기에서 불평하는 데 도움이되었지만 gosh @clive. 대화를 오프라인으로 할 수 있고 일단 해결하면이 화면을 어지럽 힐 수 없습니다. 또한 채팅 기능을 사용하는 것으로도 평판이 없습니다. StackOverflow에서 일부를 거래 할 수 있습니까? 내 github 링크를 repo에 연결하지 않습니까?
EAT

1
심지어 :) 우리는 단순히 지원 포럼이 아니며 "질문"또는 "답변"이 아닌 것은 Drupal에 대한 고품질 지식 저장소를 만드는 우리의 사명에 위배됩니다. 질문에 대답하는 데 필요한 것은 질문 자체에 있어야합니다. 그렇지 않은 경우 오프 사이트 링크가 종료되거나 문제가 해결 되 자마자 질문이 쓸모 없게되기 때문입니다. 규칙은 임의적이거나 가혹한 것처럼 보일 수 있지만 지금은 수년에 걸쳐 Stack Exchange 모델에서 전체적으로 필요한 것으로 입증되었습니다. 여기서 Q + A 일 뿐이라는 사실을 기억한다면 아무런 문제가 없을 것입니다
Clive

채팅에 대한 귀하의 담당자와 관련하여-귀하는 지금 그와 매우 가깝습니다.이 질문은 잘 작성된대로 몇 가지 공감대를 끌어 들일 것으로 생각됩니다. 그들은 시간과 함께 올 것이다. 그것은 제가 언급해야 할 또 다른 것입니다. 우리는 여기에 시간이 없습니다. 질문에 대답하는 데 시간이 오래 걸리고, 기본 응답보다 더 빠른 방법으로 질적으로 향상되었습니다. 우리는 사람들이 느리거나 그와 비슷한 것을 장려하는 것이 아니라, 시간에 민감한 방식으로 성취 된 것이 필요하다면, 우리가 그것에 집중하지 않기 때문에 여기에서 일어나는 것에 베팅을 헤지하는 것은 좋은 생각이 아닙니다.
Clive

답변:


1

이 시점에서 답변이 필요한지 확실하지 않은지 또는 "고객이 계정을 만들 때 전자 메일 확인 필요"가 설정되어있는 것 같습니까?

이미지에서 두 번째 창 (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.