Drupal с аутентификацией веб-сервиса - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть простой настроенный веб-сайт Drupal, и он близок к завершению.
Этот веб-сайт должен быть полностью заблокирован, за исключением всплывающего окна, позволяющего войти в систему, и это нормально, но вход в систему не должен проходить через стандартную аутентификацию Drupal, вместо этого имя пользователя и пароль должны быть переданы в веб-сервис. который возвращает true или false, для успешной или неудачной авторизации.

Я могу создать всплывающее окно, но как я могу направить аутентификацию через веб-сервис, а также открыть сеанс, чтобы прекратить прямые ссылки без входа в систему. Все, что мне нужно проверить, это то, что человек зарегистрирован на родительском сайте (кто предоставил веб-сервис).

1 Ответ

3 голосов
/ 16 декабря 2011

Шаг 1 - создать новый модуль.

Я нашел эту ссылку полезной: http://yetanotherprogrammingblog.com/node/14

Это решение основано на drupal-6. Есть различия в 7.

В модуле вам необходимо переопределить hook_login_validate. например

function mymodule_login_validate($form, &$form_state) {
   $username = $form_state['values']['name'];

   // do if condition to see if your authentication is required.  
   // e.g. you might want to keep the drupal administration users.
   if (_mymodule_use_webservice_login($username)) {
     // We are logging in using service.
     if (_mymodule_validate_password($username, $form_state['values']['pass']) {
       user_external_login_register($username, 'mymodule');
       user_authenticate_finalize($form_state['values'];
    } // else drop through to the end and return nothing - Drupal will handle the rejection for us
   }
} else {
    // Username is not an member number, so use standard Drupal authentication function
    user_login_authenticate_validate($form, &$form_state);
}

В приведенном выше примечании, что

  • Вам нужно будет создать функцию с _use_webservice_login в заголовке. Проверьте, стоит ли переходить на службу REST. Мне нравится помещать их в классы php для здравомыслия пространства имен.
  • Вам необходимо создать функцию, которая выполняет проверку учетных данных. _mymodule_validate_password. Это идет к вашим услугам.
  • В соответствии с нормальным drupal - замените 'mymodule' на имя создаваемого вами модуля, чтобы не было столкновений в пространстве имен.

Я подключался к приложению Grails (Spring / Java) для вызова службы. Это в основном определяет вызов и переменные. Я использую встроенную службу аутентификации Grails, чтобы выполнить аутентификацию, а также переопределить ее, чтобы сделать собственную аутентификацию. Вызов как раз против службы отдыха должен быть похожим. Вам нужен http запрос и разберите ответ.

Фрагмент из моего PHP-класса, выполняющий _mymodule_validate_password:

$headers = array(
        'Content-Type' => 'application/x-www-form-urlencoded',
        'X-Requested-With' => 'XMLHttpRequest',
    );

    // _spring_security_remember_me
    $data = array(
        'j_username' => urlencode($username),
        'j_password' => urlencode($password),
        '_spring_security_remember_me' => 'on',
    );

    $query_string = http_build_query($data, '', '&');

    // WARNING - API changes in drupal 7
    // CAUTION - don't allow it to retry. Grails gives us a redirect which drupal_http_request follows, losing the cookie
    $response = drupal_http_request($endpoint_url, $headers, 'POST', $query_string, 0);

    // Did the initial login succeed.
    if ($response->code != 200 && $response->code != 302) {
        watchdog(self::module_name, self::module_name, 'Failed to log in %error.', array('%error' => $response->status_message));
        // FAIL
        return false;
    }

    // Initial login success. Follow the redirect. 
    // Redirected request. Look for 200 && {"success":true,"username":"888"}
    $redirect_response = drupal_http_request($response->redirect_url, array(), 'GET', NULL);

    // The true success criteria
    if ($redirect_response->code == 200 && array_key_exists('Set-Cookie', $response->headers)) {
        // Authentication worked.
        $response_data = json_decode($redirect_response->data);
        if (property_exists($response_data, 'success') && $response_data->success &&
                property_exists($response_data, 'username')) {
            $login_success = true;
        } else {
            return false;
        }

В конце дня мой запрос дает мне JSON {"success": true, "username": "888"}. Имя пользователя излишне.

Grails выполняет перенаправление при аутентификации в службе, предоставляющей данные. Вы можете просто проверить, что вы вернули «200» из своего веб-сервиса и все готово, или, в качестве альтернативы, просто проверить, что ваши JSON-данные имеют эквивалент «успеха». В приведенном выше случае мы проверяем аутентификацию, записываем редирект и затем вызываем редирект, чтобы получить данные аутентификации.

Вы можете вернуть основную информацию о профиле drupal из сервиса и установить детали. Переопределите mymodule_user, чтобы получить доступ к обратным вызовам после обновления. Я обновляю детали при каждом входе в систему, поскольку бэкэнд является основным источником данных. Ссылка в верхней части этой статьи использует «обновление».

function mymodule_user($type, &$edit, &$account, $category = null) {
   switch ($type) {


    case 'login' :
        // Login should theoretically fail if the details don't get set.
        ... whatever you have to do to get the details. I call my class.   
       user_save($account, array('mail' => $fedAuth->email_address));
    case 'logout' :
        // remove the grails cookies.

}

}

В зависимости от того, что вы пытаетесь сделать, веселье может не закончиться здесь. В моем случае мне пришлось обновить информацию о своем профиле и сохранить файл cookie клиента, чтобы записать данные для входа в систему для последующих вызовов веб-службы. Некоторые утверждают, что это не «успокоительно», так как в провайдере веб-сервисов есть сеанс drupal и сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...