2016-11-16 6 views
0

私はC++アプリケーションからレストサーバーに接続する必要があります。私の問題はサーバーが提供するトークンアクセスを送信するときです。HTTP GET request with boost 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は正しく設定するためにはよく知っている必要があります。

私はこのバンドルに関するより高度な知識が必要とされていると言えば、それは私がやった他のアプリケーション、例えばアンドロイドアプリケーションから私がうまく機能するからです。しかし、C++アプリケーションからは私に問題があります。

私はこの情報は私がsymfony3とfirebase-JWTで試してみました

編集11月21日

誰かのために有用であると思いますし、それは私と同じエラーを与え続けています。

私は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はあなたには、いくつかのHTTP書式設定の問題を持って完了し、ptreeでは

+0

このようなことを簡単にデバッグするには、OAuth2で動作する簡単なAPIを提供するライブラリ(例:python)で試してみてください。それがうまくいくならば、トレースツールを使ってヘッダーでそのライブラリが何を送信しているか把握するのが非常に簡単です – Arunmu

答えて

0

正しく生成されます。ご要望の

なし(お使いの場合はゼロに)メッセージ本体のサイズを送信されていないとあなたがHTTP 1.0リクエストを送信しているので、Connection: closeを送信する必要はありません、それはそれはレスポンスの送信した後に、サーバが接続を閉じる必要があります。そのような動作を望まない場合は、HTTP/1.0HTTP/1.1に変更してください。あなたは200(OK)または401(不正な)応答を受け取るべき

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

:で

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

が試み2の最後の行を交換してみてください。

FYI構文は、HTTP仕様のRFC7230、特にRFC7235の認証用に定義されています。