我想实施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 ...
我的实施有什么问题?
答案 0 :(得分:3)
主要问题是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
答案 1 :(得分:0)
以下是一些让人想起的事情:
您的签名基本字符串应包含oauth_callback参数
oauth_token不应包含在签名基本字符串中,因为您未将其包含在查询字符串参数中
您的网址路径不应以正斜杠结尾,除非您还在签名基本字符串中包含此内容:
char * abc="https://api.copy.com/oauth/request?oauth_callback= ...
你应该删除'&'查询字符串末尾的字符