Вы здесь

Ошибка 403 при аутентификации при запросе к REST-серверу

2

Добрый день.

Сейчас отлаживаю php-скрипт, который бы обращался к REST-серверу на drupal-сайте.

Вот функция, которая логинится на сервер и возвращает пару "имя сессии - ID сессии"

function test_login($username, $password)
{
    if (isset($_COOKIE['drupal_session_name']) && isset($_COOKIE['drupal_session_id']))
    {
        return $_COOKIE['drupal_session_name'].' = '.$_COOKIE['drupal_session_id'];
    }
    else
    {

        $u_data = array(
            'username' => $username, 
            'password' => $password,
        );


        $user_login_data = array(
            'http' => array(
                'header' => "Content-Type: application/json",
                'method' => 'POST',
                'content' => json_encode($u_data)
            )
        );

        $context = stream_context_create($user_login_data);

        $res = file_get_contents('http://dexam/rtest/user/login', false, $context);
        if ( $res!== FALSE )
        {
            $result = json_decode($res);
            setcookie('drupal_session_name', $result->session_name);
            setcookie('drupal_session_id', $result->sessid);

            return ''.$result->session_name.'='.$result->sessid.'';
        }
        else
            return false;

    };
}

А вот непосредственно код программы, которая должна создавать ноду с использованием Session Authentification

$node_type = 'article';
$node_title = 'Узел создан '.date('c');
$node_body = 'Содержимое ewwer werr нового узла !!!!';
$node_format = 'filtered_html';

$node_create_data = array(
    'type' => $node_type,
    'title' => $node_title,
    'body' => array(
        'und' => array(
            '0' => array(
                'value' => $node_body,
                'format' => $node_format,
            )
        )
    )
);

$sess = test_login('admin', '123456');

$context_data = array(
    'http' => array(
        'header' => "content-type: application/json".PHP_EOL.
                    "cookie: ".$sess.PHP_EOL,
        'method' => 'POST',
        'content' => json_encode($node_create_data),
    )
);

$context = stream_context_create($context_data);
$res = file_get_contents('http://dexam/rtest/node', false, $context);

И почему-то возвращается следующее:
HTTP request failed! HTTP/1.0 403 : Access denied for user anonymous

Объясните, пожалуйста, что я делаю не так ...

Заранее благодарен.

Версия Drupal: 
7.x
Вопрос задан 13.04.2015 - 00:30

То есть ты хочешь со своего скрипта обращаться к сайту на Drupal и там проходить авторизацию?
Какой модуль на Drupal отвечает за REST?

Комментарий оставлен 13.04.2015 - 12:32

Ответы

3

Если ты модуль Services используешь, тебе при авторизации должен еще token выдаваться.
В header надо 2 параметра передавать, а не только Cookie:

  1. Cookie: [session_name]=[sessid]
  2. X-CSRF-Token: [token]

Взято из http://drupal.stackexchange.com/questions/77256/how-do-i-post-a-new-node...

Ответ дан 13.04.2015 - 13:18

Да, спасибо большое, добавил, заработало.

Дело в том, что я этот пример взял из одного видеоролика, где показывалось, как из одного Drupal-сайта обращаться к другому Drupal-сайту (там делалось через drupal_http_request) и переделал его, чтобы запускать из простого php-файла.
А вот токена в том примере не было, скорее всего, в Drupal эта возможность уже встроена.
Вот поэтому работа и застопорилась ...

Комментарий оставлен 13.04.2015 - 15:25