2012-01-04 24 views
3

我正在开发一个项目,并且客户端要求我使用OAuth来保护我构建的一些自定义服务。我没有使用身份验证和会话身份验证完美地工作,但使用OAuth使整个事情崩溃。我一直无法找到一步一步的教程。无法使OAuth在Drupal 6/Services中工作3

基本上我已经安装了D6上的服务6.x-3.1和OAuth 6.x-3.0-beta4模块。我使用this documentation创建了一个oauth上下文。然后,我设置了一个虚拟用户,因为我只想为我的所有客户创建一组消费者凭据。我将上下文分配给用户和服务。我使用http://mydomain/oauth/authorized作为回调网址。

要测试我使用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,然后使用新令牌获得响应。根据these instructions,我替换了新的访问令牌,并将端点更改为http://mydomain/myserviceendpoint。它使用GET请求连接并返回

401未经授权:消费者未被授权访问此 服务。

感觉就像我失去了一些东西。系统中只有一个上下文,它被分配给消费者和服务。消费者密钥和秘密是访问令牌的最终url的一部分。我看过权限,但找不到任何不合适的地方。我甚至改变了我的服务,只是返回TRUE为hook_services_access绕过权限。

任何想法?

+0

你解决了你的问题了吗?我遇到了同样的问题,找不到文件。 – 2013-09-04 03:44:12

回答

1

首先你必须了解两者的区别。

  1. 首先会话认证需要用户名和密码进行认证。然后它从drupal获得用户权限,因此您需要在每个步骤中进行身份验证,以便通过与您的drupal进行通信的应用程序。根据您在drupal中的许可,匿名用户可以获得他们想要的内容。

  2. 在Aouth身份验证中,您将创建一个用户并向他添加令牌,并且只有拥有令牌的用户才能根据您为其设置的权限规则与应用程序进行通信。对于匿名用户,他们无法检索或获取任何内容。在创建过程中,drupal和客户端之间的通信使用特定的令牌。

  3. 最后:转到用户页面并创建一个用户,并为他提供应用程序名称也是令牌,并在您的应用程序代码中将该令牌提供给应用程序并使用新创建的用户进行身份验证。

您必须检查您对新创建用户的权限。

检查this link

0

您的服务端点没有与OAuth的测试客户端使用。一旦通过身份验证,您就可以将OAuth令牌与您的方法一起传递到服务端点。

0

和你一样的问题...由于没有真正好的教程,有时候很难,所以希望这可以帮助某人。

解决方案:

你必须给的OAuth permisions你的资源,你的终点定义,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”是访问此资源所需的permision):通过“services_oauth”

... 
    $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,), 
    ), 
); 
... 

那些你启用将只能通过oauth访问。我想知道你是否可以混合使用oauth访问服务和正常的oauth服务。

我是怎么找到的解决方案:

如果启用服务的调试,你会发现下面的PHP警告:

注意:未定义指数:services_oauth EN _services_oauth_authenticate_call()(拉利内阿26德丙:/.../ 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); 

然后你会看到* $方法[ '端点'] [ 'services_oauth' ]; *未设置。所以你必须把它设置在my_module_default_services_endpoint()