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

标签 c++ oauth libcurl

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

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

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

GET&https%3A%2F%2Fapi.copy.com%2Foauth%2Frequest&oauth_consumer_key%3D[my 32 symbols key]%26oauth_nonce%3Dxoviybpokqnxdwlnkeoorawfijgezr%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1381745375%26oauth_tokey%3D

生成签名的关键:

[My consumer secret, 48 symbols]&

这是我在进行 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...

我的实现有什么问题?

最佳答案

主要问题是 oauth_callback 应该两次百分比编码才能创建签名基本字符串。这是我在请求中发送的字符串:

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

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

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

关于c++ - 如何正确创建oauth签名基字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19358388/

相关文章:

c++ - : `CURLcode' does not name a type 的 libcurl API 升级问题

C++:在程序逻辑/条件命名空间中使用命名空间?

c++ - 如何使 shared_ptr 包装类与 make_shared 一起工作

node.js - 如何使用 everyauth 进行简单(单步)身份验证?

php - 在哪里放置 OAuth 逻辑?

python - 将 curl 翻译成 python urllib2

c++ - C++自注册类成员

c++ - 从原始数据就地创建 std::vector

azure - 阻止来自 login.microsoftonline.com 的 cookie - ADAL

c++ - 异步下载,如何使用 libcurl 或其他东西?