2016-11-16 51 views
0

我需要從C++應用程序連接到其餘服務器,我的問題是當發送服務器提供的令牌訪問。HTTP GET請求與提升C++ - oauth2訪問令牌

我嘗試了幾種方法,但找不到正確的語法。

其餘服務器使用oauth2進行身份驗證,令牌類型爲承載。

在您好!OAuth1我發現這句法:

std::ostream request_stream(&request_); 
request_stream << "GET " << path << " HTTP/1.0\r\n"; 
request_stream << "Host: " << server << "\r\n"; 
request_stream << "Content-Type: application/x-www-form-urlencoded\r\n"; 
request_stream << "Authorization: OAuth oauth_version=\"1.0\", " 
<< oauth_signature_method=\"PLAINTEXT\", " 
<<"oauth_consumer_key=\"<key>\", " 
<<"oauth_signature=\"<secret>&\"\r\n"; 
request_stream << "Accept: */*\r\n"; 
request_stream << "Connection: close\r\n\r\n"; 

但對於我的oauth2無法找到正確的語法。

我已經做我將重點介紹2的所有嘗試:

1.

std::ostream request_stream(&request_); 
request_stream << "GET " << path << " HTTP/1.0\r\n"; 
request_stream << "Host: " << server << "\r\n"; 
request_stream << "Authorization: Bearer accesstoken\r\n"; 
request_stream << "Accept: */*\r\n"; 
request_stream << "Connection: close\r\n\r\n"; 

返回錯誤: 「異常:未指定文件(1):未結束的字符串」

2。

std::ostream request_stream(&request_); 
request_stream << "GET " << path << " HTTP/1.0\r\n"; 
request_stream << "Host: " << server << "\r\n"; 
request_stream << "Content-Type: application/x-www-form-urlencoded\r\n"; 
request_stream << "Authorization: OAuth oauth_version=\"2.0\", " 
<<"oauth_token_type=\"Bearer\", " 
<<"oauth_access_token=\"accesstoken\"\r\n"; 
request_stream << "Accept: */*\r\n"; 
request_stream << "Connection: close\r\n\r\n"; 

錯誤返回:「狀態碼401返回的響應」

另外,在這兩種情況下,在行尾都可以嘗試沒有「\ r \ n」,但它不起作用。

request_stream << "Authorization: Bearer accesstoken"; 

request_stream << "Authorization: OAuth oauth_version=\"2.0\", " 
<<"oauth_token_type=\"Bearer\", " 
<<"oauth_access_token=\"accesstoken\""; 

我需要請求「授權」的訪問令牌發送到服務器的正確文本字符串:

request_stream << "Authorization: ??????? \r\n"; 

有誰知道發送的訪問令牌的正確語法?

謝謝!

編輯 - 11月18日

忘記提及的是,其餘服務器與Symfony2中和fosrestbundle製造。顯然fosrestbundle需要知道它適當地配置服務,否則它可能會產生問題。

現在我正在測試其餘的symfony3和firebase-jwt。我想我不會遇到任何問題,因爲我可以配置幾乎所有的東西,而無需在外部捆綁中走得太遠。

我還沒有嘗試過使用symfony3和fosrestbundle,但似乎fosrestbundle需要知道它正確配置它。

當我說需要關於這個包的更高級的知識時,這是因爲它對我的其他應用程序非常有用,例如android應用程序;但從一個C++應用程序給我的問題。

我希望這個信息是有用的人

編輯11月21日

我試着用symfony3和火力點,智威湯遜,它不斷給我同樣的錯誤。

我錯了fosrestbundle,實際上這兩個服務器(fosrestbundle和symfony3-jwt)都會進行身份驗證並正確發送客戶端請求的數據。

的問題是在客戶端:

void Restclient::handle_read_content(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     std::ostringstream ss; 
     ss << &response_; 
     std::string s = ss.str(); 
     boost::property_tree::ptree pt2; 
     stringstream is (s); 
     boost::property_tree::read_json (is, pt2); 

     boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&Restclient::handle_read_content, this, boost::asio::placeholders::error)); 
    } 
    else if (err != boost::asio::error::eof) 
    { 
     std::cout << "Error: " << err << "\n"; 
    } 
} 

執行幾個測試後,我證實,正是在這一行發生錯誤:

boost::property_tree::read_json (is, pt2); 

JSON的到來得好:(例如)

{ "Data1": "C++", "data2": "java", "data3": "python", "data4": "php", "data5": "C#"} 

我不會把實際的json,因爲它是一個漂亮長字符串,但它只是給你一個想法。

而在閱讀的時刻,轉換成JSON,這似乎:

{ "Data1": "C++", "data2": "java", "data3": "python", "dat 
Exception: <unspecified file> (1): unterminated string 

我暴露這裏的代碼是基於提升C++ async_client的例子,但它給了我這個問題。

如果有人解決了這個問題,我將不勝感激您的幫助。

編輯 - 11月27日[解決]

std::ostream request_stream(&request_); 
request_stream << "GET " << path << " HTTP/1.0\r\n"; 
request_stream << "Host: " << server << "\r\n"; 
request_stream << "Authorization: Bearer accesstoken\r\n"; 
request_stream << "Accept: */*\r\n"; 
request_stream << "Content-Length: 0\r\n\r\n"; 

void Restclient::handle_read_content(const boost::system::error_code& err) 
{ 
    if (!err) 
    { 
     boost::system::error_code error; 
     string result = ""; 
     //Read the answer to the end 
     while (boost::asio::read(socket_, response_, boost::asio::transfer_at_least(1), error)) 
     { 
      std::ostringstream ss; 
      ss << &response_; 
      std::string output = ss.str(); 
      result = result + output; 
     } 

     //If the answer has already arrived and there is nothing left to read 
     if (error == boost::asio::error::eof) 
     { 
      stringstream is (result); 
      boost::property_tree::ptree pt2; 
      boost::property_tree::read_json (is, pt2); 
     } 
     boost::asio::async_read(socket_, response_, boost::asio::transfer_at_least(1), boost::bind(&Restclient::handle_read_content, this, boost::asio::placeholders::error)); 
    } 
    else if (err != boost::asio::error::eof) 
    { 
     std::cout << "Error: " << err << "\n"; 
    } 
} 

JSON是完整的,正確生成

+0

一個簡單的方法來調試這樣的事情將是嘗試一個庫提供了簡單的API來處理OAuth2,例如:python。如果你得到了這個工作,那麼使用任何跟蹤工具就可以很容易地找出該庫在標題中發送的內容 – Arunmu

回答

0

ptree中你有一些HTTP格式問題。

您的任何請求都沒有發送消息正文的大小(在您的情況下爲零),並且由於您發送HTTP 1.0請求,因此無需發送Connection: close,服務器在發送響應後應關閉連接。如果您不想要這種行爲,請將HTTP/1.0更改爲HTTP/1.1

嘗試更換嘗試2的最後一行:

request_stream << "Connection: close\r\n\r\n"; 

有:

request_stream << "Content-Length: 0\r\n\r\n"; 

您會收到一條200(OK)或401(未授權)響應。

僅供參考在HTTP規範RFC7230中定義了語法,具體來說是RFC7235進行身份驗證。