2012-02-01 97 views
1

我对OAuth流和/或编码不是很熟悉,但我设法让我的网站(有点)成为OAuth提供者。OAuth签名生成(PHP)

我说莫名其妙,因为很长一段时间使用访问令牌来获取受保护的信息,当我收到“无效签名”的错误(我顺利地拿到了一个请求令牌,授权,并得到访问令牌)。

所以我看了一下签名生成方法(我正在使用Drupal 7和一些未公开的模块)。该代码是:

public function build_signature($request, $consumer, $token) { 
    $base_string = $request->get_signature_base_string(); 
    $request->base_string = $base_string; 

    $key_parts = array(
    $consumer->secret, 
    ($token) ? $token->secret : "" // the token object has a key and a secret property 
); 

    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); 
    $key = implode('&', $key_parts); 

    return base64_encode(hash_hmac($this->algo, $base_string, $key, TRUE)); 
} 

所以这是使用$token秘密生成请求(加上$base_string这并不重要)的签名。

所以我猜我的问题确实是:使用我的OAuth的应用程序(客户端),需要知道访问令牌的秘密才能工作?这个秘密是公开信息吗(我猜不是,因此这个名字)。我在这里做错了什么?

回答

1

是的,他们这样做。

访问令牌密钥(以及消费者的秘密)用来签署在访问受保护资源的后续请求客户端的签名基本字符串,因为它是在服务器端做了同样的方式,当签名正在验证。

OAuth 1.0规范还声明,OAuth提供程序在生成访问令牌时必须返回访问令牌密钥,请参阅section 6.3.2 of the specs