2013-10-14 3 views
1

Я хочу реализовать протокол OAuth 1.0 для работы с COPY. Но когда я реализовал протокол OAuth на 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 ...

Что случилось в моей реализации?

ответ

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

+0

Ты, чувак! Благодаря! – 99miles

0

Вот несколько вещей, которые сразу приходят на ум:

  1. Ваша подпись базовая строка должна включать в себя параметр oauth_callback

  2. oauth_token не должны быть включены в подпись базовой строки, как вы не включая его в ваших параметрах querystring

  3. Путь к вашему URL не должен заканчиваться прямой косой чертой, если вы также не включаете это в свою базовую строку подписи:

    char * abc="https://api.copy.com/oauth/request?oauth_callback= ... 
    
  4. Вы должны удалить «&» характер с конца вашей строки запроса

+0

1. Я попытался с включением oauth_callback и без него на базу строка, но это не помогает. 2. Я также пробовал с этим параметром и без него. 3. Thx, но он выводит ту же ошибку 4. Это просто опечатка. Что еще здесь может быть неправильным? – Sunrise

+0

Можете ли вы проверить запрос с помощью Fiddler и отправить то, что действительно отправлено? –

+0

Для этого я использовал 'http Analyzer' http://pastebin.com/U6yEThxq – Sunrise

Смежные вопросы