0

libcurl バージョンの使用: 7.19.7

【長文で申し訳ありません】

libcurl で動作する単純な基本認証に問題があります。パスワードで保護されたデータを提供するサーバーのセットアップがあります。url はコード内にあります。

私は simple.c libcurl の例を取り上げ、CURLOPT_USERPWD を設定するように変更しました (以下のコード)。実行すると、[html スタイルが省略されています] の下にカールの詳細な出力が表示されます。

ノート:

  1. URL をブラウザに貼り付けると、ユーザーとパスワードの入力を求められ、指定された場合はデータが正しく返されます。これは、サーバーが無許可であるという主張が偽物であることを意味していると思います (正しいですか?)。
  2. 「username:passwd@」を URL に入れると、同じ結果が得られるようです。

誰もが問題を見ますか?

=デニス・ハイムビグナー ユニデータ

Curl 詳細出力

* About to connect() to utmea.enea.it port 8080 (#0)
*   Trying 192.107.77.41... * connected
* Connected to utmea.enea.it (192.107.77.41) port 8080 (#0)
> > GET /thredds/dodsC/UNIDATA_passwd/head_out.nc.dds HTTP/1.1
Host: utmea.enea.it:8080
Accept: */*

< HTTP/1.1 307 Temporary Redirect
< Server: Apache-Coyote/1.1
< Last-Modified: 
< Set-Cookie: JSESSIONID=BEC21BBB6DD954B7BD60F1BED1414A8E; Path=/thredds/; HttpOnly
< Location: http://utmea.enea.it:8080/thredds/restrictedAccess/accediUNIDATA
< Content-Length: 0
< Date: Tue, 12 Nov 2013 18:49:00 GMT
< 
* Connection #0 to host utmea.enea.it left intact
* Issue another request to this URL: 'http://utmea.enea.it:8080/thredds/restrictedAccess/accediUNIDATA'
* Re-using existing connection! (#0) with host utmea.enea.it
* Connected to utmea.enea.it (192.107.77.41) port 8080 (#0)
> > GET /thredds/restrictedAccess/accediUNIDATA HTTP/1.1
Host: utmea.enea.it:8080
Accept: */*

< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 01:00:00 CET
< WWW-Authenticate: Basic realm="THREDDS Data Server"
< Content-Type: text/html;charset=utf-8
< Content-Length: 951
< Date: Tue, 12 Nov 2013 18:49:00 GMT
< 
* Ignoring the response-body
* Connection #0 to host utmea.enea.it left intact
* Issue another request to this URL: 'http://utmea.enea.it:8080/thredds/restrictedAccess/accediUNIDATA'
* Re-using existing connection! (#0) with host utmea.enea.it
* Connected to utmea.enea.it (192.107.77.41) port 8080 (#0)
* Server auth using Basic with user 'ticket'
> > GET /thredds/restrictedAccess/accediUNIDATA HTTP/1.1
Authorization: Basic dGlja2V0OnRpY2tldDE=
Host: utmea.enea.it:8080
Accept: */*

< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 01:00:00 CET
< Set-Cookie: JSESSIONID=E0E3AC390A39C786C3CFD139F601D8B8; Path=/thredds/; HttpOnly
< Content-Type: text/html;charset=utf-8
< Content-Length: 1027
< Date: Tue, 12 Nov 2013 18:49:00 GMT
< 
<html><head><title>Apache Tomcat/7.0.35 - Error report</title>
<style>...</style>
</head><body><h1>HTTP Status 401 - Not authorized to access this dataset.</h1>
... not authorized to access this dataset.</u></p><p><b>description</b> <u>This request requires HTTP authentication.</u></p>...<h3>Apache Tomcat/7.0.35</h3></body></ht* Connection #0 to host utmea.enea.it left intact
* Closing connection #0

変更された simple.c

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://utmea.enea.it:8080/thredds/dodsC/UNIDATA_passwd/head_out.nc.dds");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_easy_setopt(curl, CURLOPT_USERPWD, "ticket:ticket1");

    /* Perform the request, res will get the return code */
    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);
  }
  return 0;
}
4

2 に答える 2

1

URLをブラウザに貼り付けると[...]データが正しく返されます。これは、サーバーが無許可であるという主張が偽物であることを意味していると思います (正しいですか?)。

いいえ: これは、ブラウザーが Cookie をサポートしているためです (これは、この Web サービスが期待するものです)。

セッションの Cookie を有効にするようにlibcurlに指示します。

...
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");
...
res = curl_easy_perform(curl);
于 2013-11-12T19:55:36.387 に答える
0

あなたのペーストでは、カールがどのように送信するかがわかります

承認: 基本 dGlja2V0OnRpY2tldDE=

... base64 デコードできるサーバーに送信すると、基本認証を使用してユーザーとパスワードとして "ticket:ticket1" を送信したことがわかります。サーバーはそれを 401 で拒否します。

これがカールのせいなのかわかりません...

于 2013-11-12T22:17:15.483 に答える