Не могу заставить OAuth работать в Drupal 6 / Сервисы 3 - PullRequest
3 голосов
/ 04 января 2012

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

По сути, на D6 установлены модули Services 6.x-3.1 и OAuth 6.x-3.0-beta4. Я создал контекст oauth, используя эту документацию . Затем я настраиваю фиктивного пользователя, потому что я хочу создать только один набор учетных данных для всех моих клиентов. Я назначил контекст пользователю и сервису. Я использую http://mydomain/oauth/authorized в качестве URL обратного вызова.

Для проверки подключаюсь с помощью http://term.ie/oauth/example/client.php. Я использую конечную точку http://mydomain/oauth/request_token. Я добавляю жетоны ответов в соответствующие поля. Затем я изменяю конечную точку на http://mydomain/oauth/authorize. Он берет меня на страницу, где я должен нажать, чтобы разрешить соединение. Я перешел на страницу http://mydomain/oauth/authorized, где получил сообщение об успехе.

Теперь я изменяю конечную точку на http://mydomain/oauth/access_token и получаю ответ с новым токеном. В соответствии с этими инструкциями я заменяю новые токены доступа и меняю конечную точку на http://mydomain/myserviceendpoint. Соединяется с помощью запроса GET и возвращает

401 Несанкционированный: потребитель не авторизован для доступа к этому сервис.

Такое ощущение, что я что-то упустил. В системе существует только один контекст, и он назначается как потребителю, так и службе. Ключ и секретный ключ пользователя являются частью окончательного URL-адреса вместе с токеном доступа. Я посмотрел на разрешения и не могу найти что-то неуместное. Я даже изменил свой сервис, чтобы просто вернуть TRUE для hook_services_access для обхода разрешений.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Сначала вы должны понять разницу между ними.

  1. Сначала аутентификация сеанса берет имя пользователя и пароль и аутентифицируется.Затем он получает пользовательские разрешения от drupal, поэтому вам нужно проходить аутентификацию на каждом шаге, чтобы пройти через ваше приложение, которое взаимодействует с вашим drupal.Анонимные пользователи могут получить то, что они хотят, в соответствии с вашим разрешением в drupal.

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

  3. Наконец: перейдите на страницу пользователя и создайте пользователя и дайте ему имя приложения, также токен и код вашего приложения.передать токен приложению и пройти аутентификацию для вновь созданного пользователя.

Необходимо проверить права доступа для вновь созданного пользователя.

Проверить эту ссылку

0 голосов
/ 05 мая 2012

Та же проблема, что и у вас ... Так как не очень хорошие учебники, иногда это сложно, так что надеюсь, что это кому-нибудь поможет.

Решение:

Вы должны дать разрешения oauth своим ресурсам в своем определении конечной точки, в my_module_default_services_endpoint (). Допустим, вы хотите включить ресурсного пользователя через oauth. Обычно у вас будет:

...
  $endpoint->resources['user'] = array(
    'operations'       => array(
      'ta_create'        => array('enabled' => 1, ),
    ),
    'actions'          => array(
      'login'            => array('enabled' => 1, ),
      'logout'           => array('enabled' => 1, ),
      'ta_register'      => array('enabled' => 1, ),
    ),
  );
...

Таким образом, вы должны авторизовать свои ресурсы следующим образом (user_info - это разрешение, необходимое для доступа к этому ресурсу):

...
  $endpoint->resources['user'] = array(
    'operations'       => array(
      'ta_create'        => array('enabled' => 1, 'services_oauth' => array('credentials' => 'token', 'authorization' => 'user_info', ), ),
    ),
    'actions'          => array(
      'login'            => array('enabled' => 1, ),
      'logout'           => array('enabled' => 1, 'services_oauth' => array('credentials' => 'token', 'authorization' => 'user_info', ), ),
      'ta_register'      => array('enabled' => 1, ),
    ),
  );
...

Те, которые вы активируете через «services_oauth», будут доступны только через oauth. Мне интересно, можно ли смешивать службы доступа oauth и обычные службы oauth.

Как я нашел решение:

Если вы включите отладку служб, вы увидите следующее предупреждение PHP:

Примечание: неопределенный индекс: services_oauth en _services_oauth_authenticate_call () (стр. 26 из C: /.../ services_oauth.inc).

Если вы перейдете к _services_oauth_authenticate_call () в services_oauth.inc и напечатаете трассировку стека (спасибо http://php.net/manual/en/function.debug-print-backtrace.php):

ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean();
watchdog('my_module', 'StackTrace: %st', array('%st' => $trace,), WATCHDOG_DEBUG);

Тогда вы увидите, что * $ method ['endpoint'] ['services_oauth']; * не установлен. Поэтому вы должны установить его в my_module_default_services_endpoint ()

0 голосов
/ 17 апреля 2012

Ваша конечная точка службы не должна использоваться с тестовым клиентом OAuth.После проверки подлинности вы передаете свои OAuth-токены конечной точке службы вместе со своим методом.

...