Шаг 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 и сеанс.