【问题标题】:How properly create oauth signature base string?如何正确创建 oauth 签名基本字符串?
【发布时间】:2013-10-19 17:30:34
【问题描述】:

我想实现 OAuth 1.0 协议以使用 COPY。但是当我在 C++ 中实现 OAuth 协议以获取请求令牌并发送该请求以复制它时,返回签名无效,我无法弄清楚我的签名有什么问题。以下是我的程序生成的所有参数:

oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr 
oauth_timestamp=1381745375
oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php
oauth_signature_method=HMAC-SHA1

这是我用来生成令牌的基本字符串:

GET&https%3A%2F%2Fapi.copy.com%2Foauth%2Frequest&oauth_consumer_key%3D[我的 32 个符号 密钥]%26oauth_nonce%3Dxoviybpokqnxdwlnkeoorawfijgezr%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1381745375%26oauth_tokey%3D

生成签名的关键:

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

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

lNaaOaWyGtkJWj%2BVLjLlKTVGYL0%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_error_message=oauth_problem%3Dsignature_invalid%26debug_sbs...

我的实现有什么问题?

【问题讨论】:

    标签: c++ oauth libcurl


    【解决方案1】:

    主要问题是 oauth_callback 应该是 two time percent encoded 以便创建签名基本字符串。这是我在请求中发送的字符串:

    oauth_callback="http://copy-oauth.local/get_access_token.php"

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

    http%253A%252F%252Fcopy-oauth.local%252Fget_access_token.php

    【讨论】:

      【解决方案2】:

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

      1. 您的签名基本字符串应包含 oauth_callback 参数

      2. oauth_token 不应包含在签名基本字符串中,因为您没有将其包含在查询字符串参数中

      3. 您的 url 路径不应以正斜杠结尾,除非您还在签名基本字符串中包含此内容:

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

      【讨论】:

      • 1.我尝试包含 oauth_callback 而没有它作为基本字符串,但它没有帮助。 2.我也尝试过使用和不使用该参数。 3. 谢谢,但它输出相同的错误 4. 只是错字。这里还有什么问题?
      • 你能用 Fiddler 检查请求并发布实际发送的内容吗?
      • 请求表明oauth参数是在Authorization头而不是querystring中发送的。虽然这没关系,但您上面的代码似乎暗示了相反的情况。我假设您已经更改了代码,因此只需检查为什么在没有查询字符串时 url 路径以问号结尾,您在构建基本字符串时是否考虑到了这一点?
      • 是的,我更改了代码,现在我发送了授权标头。在我的基本字符串中,我没有包含问号,但是在 url 路径中包含问号。但是当我删除它时,什么都没有发生。如果有帮助,我可以提供我的签名基本字符串。
      • 您可能想使用 Oauth 测试控制台检查您的基本字符串和签名like this one
      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2014-09-20
      • 2016-08-20
      • 2021-03-21
      • 2012-03-16
      • 2019-04-01
      相关资源
      最近更新 更多