C++ 如何正确创建oauth签名基字符串?

C++ 如何正确创建oauth签名基字符串?,c++,oauth,libcurl,C++,Oauth,Libcurl,我想实现OAuth 1.0协议,以便使用。但是当我在C++中实现了OAuthTebug,以获取请求令牌并发送请求复制它的返回时,签名无效,我无法确定签名中的错误。以下是我的程序生成的所有参数: oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr oauth_timestamp=1381745375 oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php oauth_signatur

我想实现OAuth 1.0协议,以便使用。但是当我在C++中实现了OAuthTebug,以获取请求令牌并发送请求复制它的返回时,签名无效,我无法确定签名中的错误。以下是我的程序生成的所有参数:

oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr 
oauth_timestamp=1381745375
oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php
oauth_signature_method=HMAC-SHA1
这是我用来生成令牌的基本字符串:

获取https%3A%2F%2Fapi.copy.com%2fauth%2Frequest&oauth\u consumer\u密钥%3D[my 32个符号 密钥]%26oauth\u当前%3dxoviybopokqnxdwlnkeoorawfijgezr%26oauth\u签名\u方法%3DHMAC-SHA1%26oauth\u时间戳%3D1381745375%26oauth\u时间戳%3D

它是生成签名的关键:

[我的消费者秘密,48个符号]&

这是我在base64和百分比编码后收到的签名:

LNAOAWYGTKJWJ%2BVLKTVGYL0%3D

最后一件事是将所有参数发送到服务器。为此,我使用libcurl:

char * abc="https://api.copy.com/oauth/request/?oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php&oauth_consumer_key=[my 32 symbols key]&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1381745375&oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr&oauth_signature=lNaaOaWyGtkJWj%2BVLjLlKTVGYL0%3D";

CURL *curl;
  CURLcode res;

  curl_global_init(CURL_GLOBAL_DEFAULT);

  curl = curl_easy_init();
  if(curl) 
  {
      curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, TRUE);
      curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\a\\a\\a\\cacert.pem");
    curl_easy_setopt(curl, CURLOPT_URL, abc);

    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */ 
    curl_easy_cleanup(curl);
  }

  curl_global_cleanup();
然后我的控制台将输出:

oauth_错误_消息=oauth_问题%3Dsignature_无效%26debug_sbs


我的实现出了什么问题?

以下是一些立即浮现在我脑海中的事情:

  • 签名基字符串应包括oauth_回调参数

  • oauth_令牌不应包含在签名基字符串中,因为您没有将其包含在querystring参数中

  • url的路径不应以正斜杠结尾,除非在签名基字符串中也包含此项:

        char * abc="https://api.copy.com/oauth/request?oauth_callback= ...
    
  • 您应该从查询字符串的末尾删除“&”字符


  • 主要问题是oauth_回调应该是
    两倍百分比编码的
    ,以便创建签名基字符串。这是我在请求中发送的字符串:

    oauth\u回调=”http://copy-oauth.local/get_access_token.php“

    这是我添加到签名基字符串中的字符串:

        char * abc="https://api.copy.com/oauth/request?oauth_callback= ...
    

    http%253A%252F%252F复制oauth.local%252Fget\u access\u token.php

    1。我尝试了包含oauth_回调,但没有将其添加到基字符串,但没有帮助。2.我还尝试了使用和不使用该参数。3.Thx,但它的输出是相同的错误4。只是打字错误。这里还有什么错误?您能用Fiddler检查请求并发布实际发送的内容吗?该请求表明oauth参数是在授权头中发送的,而不是在querystring中发送的。虽然这还可以,但上面的代码似乎表明了相反的情况。我假设您已经更改了代码,那么只需检查一下,在没有查询字符串的情况下,为什么url路径以问号结尾,并且在构建基串时是否考虑到了这一点?是的,我更改了代码,现在发送了授权标头。在我的基本字符串中,我并没有包含问号,但在url路径中却包含问号。但当我取下它时,什么也没发生。如果有帮助的话,我可以提供我的签名基本字符串。您可能希望使用Oauth测试控制台检查您的基本字符串和签名