【问题标题】:Can't make OAuth work in Drupal 6 / Services 3无法使 OAuth 在 Drupal 6 / Services 3 中工作
【发布时间】:2012-10-30 09:04:14
【问题描述】:

我正在处理一个项目,客户要求我使用 OAuth 来保护我构建的一些自定义服务。使用无身份验证和会话身份验证,我已经让一切工作完美,但使用 OAuth 会使整个事情崩溃。我还没有找到任何真正好的分步教程。

基本上我已经在 D6 上安装了 Services 6.x-3.1 和 OAuth 6.x-3.0-beta4 模块。我使用this documentation 创建了一个 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,并收到带有新令牌的响应。根据these instructions,我替换了新的访问令牌并将端点更改为http://mydomain/myserviceendpoint。它使用 GET 请求连接并返回

401 Unauthorized:消费者无权访问此 服务。

感觉好像我错过了什么。系统中只有一个上下文,它被分配给消费者和服务。消费者密钥和秘密与访问令牌一起是最终 URL 的一部分。我查看了权限,但找不到任何不合适的地方。我什至将我的服务更改为只为 hook_services_access 返回 TRUE 以绕过权限。

有什么想法吗?

【问题讨论】:

  • 您的问题解决了吗?我遇到了同样的问题,找不到文件。

标签: drupal oauth drupal-6 access-control


【解决方案1】:

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

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

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

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

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

查看this link

【讨论】:

    【解决方案2】:

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

    解决方案:

    您必须在 my_module_default_services_endpoint() 中的端点定义中为您的资源授予 oauth 权限。假设您想通过 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() (line 26 de C:/.../services_oauth.inc)。

    如果您转到 services_oauth.inc 中的 _services_oauth_authenticate_call() 并打印堆栈跟踪(感谢 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() 中设置它

    【讨论】:

      【解决方案3】:

      您的服务端点不能与 OAuth 测试客户端一起使用。通过身份验证后,您将 OAuth 令牌与您的方法一起传递给服务端点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-26
        • 2015-09-03
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2017-06-04
        相关资源
        最近更新 更多