【问题标题】:PHP Oauth 1.0 provider, signatures do not matchPHP Oauth 1.0 提供者,签名不匹配
【发布时间】:2014-12-05 17:52:41
【问题描述】:

我正在尝试使用 pecl-php oauth 库 http://php.net/manual/en/book.oauth.php 设置 Oauth 服务器

此代码假定客户端已收到用户验证的访问令牌,为简单起见,我没有包含任何数据库调用,并将匹配值硬编码到我的客户端和提供程序中。

Class OauthVerify
{
   private static $consumer_secret = 'f63ed7f7a8899e59d3848085c9668a0d';
   private static $token_secret = '72814e6059441037152eecef2e8559a748b84259';
   private $provider;

   public function __construct()
{
    $this->provider = new OAuthProvider();
    $this->provider->consumerHandler(array($this,'consumerHandler'));
    $this->provider->timestampNonceHandler(array($this,'timestampNonceHandler'));
    $this->provider->tokenHandler(array($this,'checkAccessToken'));

} 

  //Check the client request

   public function checkRequest()
{
    try {
        $this->provider->checkOAuthRequest();
    } catch (Exception $Exception) {
        return OAuthProvider::reportProblem($Exception);

    }
    return true;
}


   public static function timestampNonceHandler($Provider)
{
     //I'm leaving out this logic now, to keep it simple and for testing purposes
     return OAUTH_OK;
}

  public static function consumerHandler($Provider)
{
    //I'm leaving out this logic now, to keep it simple and for testing purposes

    $Provider->consumer_secret = self::$consumer_secret;
    return OAUTH_OK;
}

  public static function checkAccessToken($Provider)
{
    $Provider->token_secret = self::$token_secret;
    return OAUTH_OK;
}
}

上面的代码应该为我提供了验证 Oauth 请求所需的准系统。 在执行任何特定路由之前,我调用 $OauthVerify->checkRequest() 方法来检查客户端请求是否有效,但是服务器不断抛出“签名不匹配”错误。我不认为问题出在客户端,因为我尝试了邮递员(用于 chrome)和 PHP 实现,它们都生成相同的签名。但是,出于兴趣考虑,我已将我的客户电话包括在内。

$consumer_key = '87d6d61e87f0e30d8747810ae40041d1';
$consumer_secret = 'f63ed7f7a8899e59d3848085c9668a0d';
$token= 'b9d55b3ec4b755d3fe25d7a781da1dfd044b5155';
$token_secret = '72814e6059441037152eecef2e8559a748b84259';
$timestamp = '1417515075';
$nonce = '9QV4rn';
$version = '1.0';

$method = 'GET';
$url = 'https://localhost/micro/v1/nappi';

try {
     $oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1,       OAUTH_AUTH_TYPE_URI);
     $oauth->enableDebug();
     $oauth->disableSSLChecks();
     $oauth->setNonce($nonce);
     $oauth->setTimestamp($timestamp);
     $oauth->setToken($token, $token_secret);
     $oauth->setVersion($version);
     $oauth->fetch("$url");
     $json = json_decode($oauth->getLastResponse());
     print_r($json);
 }
    catch(OAuthException $E) {
        print_r($E);
 }

我花了好几个小时试图解决这个问题,请有人帮忙!

【问题讨论】:

  • 问题肯定出在 OAuth 提供者用来生成签名的 uri 信息上。如果我将代码放在 web 根目录中的静态 php 文件中,它会完美运行。但是,我使用的是 MVC 框架,并且路由不是字面的。我已经尝试在 checkOAuthRequest 方法中手动设置 uri 和 http 方法,如下所示:$this->provider->checkOAuthRequest('https://localhost/micro/v1/nappi',OAUTH_HTTP_METHOD_GET); 根据docs 但它仍然不能在框架的上下文中工作。

标签: php oauth


【解决方案1】:

我终于设法解决了,我的 .htaccess 文件有一个重写规则,它正在为我的框架处理一个 _url 参数。该参数当然包含在服务器生成的签名中。我只是指示 OAuth Provider 忽略构造函数中的 _url 参数: $this->provider->setParam('_url',NULL);, 仅此而已,现在一切运行良好。

【讨论】:

  • 我也面临同样的问题。虽然我没有看到额外的 _url 参数,但我仍然没有得到导致签名不匹配的原因。有什么方法可以查看服务器端的签名是什么以及用户生成该签名的参数是什么?
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2012-04-22
  • 2020-02-21
相关资源
最近更新 更多