4

AP通信のフィードへのリクエストを認証するPHPメソッドを実装しようとしています。彼らのドキュメントから:

すべてのフィードおよびコンテンツ要求を認証するために、APWebFeedsシステムはHTTP基本認証を使用します。これは現在シンジケートフィードの標準です。ほとんどのフィードリーダーとリーダーコンポーネントでは、ユーザークレデンシャルを事前に構成し、URLではなくヘッダーで渡すことができます。

重要:現在、URLで直接クレデンシャルを渡すことは広くブロックされています。詳細については、Microsoftのセキュリティ情報(http://www.microsoft.com/technet/security/bulletin/MS04-004.mspx )を参照してください。

次の形式の名前/値で認証ヘッダーを作成するようにリーダーまたはコンポーネントを構成できます。

("Authorization", "Basic " + {Encoded_username_and_password})

ここで{Encoded_username_and_password}、は文字列「username:password」のバイトのBase64エンコーディングに置き換えられます。

フィードをダウンロードするために独自のクライアントコードを記述している場合は、プログラミング言語のライブラリに組み込まれているHTTP基本認証を使用してください。HTTP基本認証は、ほとんどのプラットフォームで使用できます。たとえば、Perl、PHP、C、またはJavaです。

私の試みは:

 /**
 * Begin Transaction
 */

$url = "http://syndication.ap.org/AP.Distro.Feed/GetFeed.aspx?idList=" . implode(',', $idList) . "&idListType=products&maxItems=25";    
$auth = "Authorization=Basic " . base64_encode($user . ":" . $pass);    
$ch = curl_init();  // initialize curl handle   
curl_setopt($ch, CURLOPT_URL, $url); // set url to post to  
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable   
curl_setopt($ch, CURLOPT_POST, 1); // set POST method   
curl_setopt($ch, CURLOPT_POSTFIELDS, $auth); // add POST fields 
$result = curl_exec($ch); // run the whole process  
curl_close($ch);

/**
 * End Transaction
 */

var_dump($result);

それは私に与えます:

string(405) "

    Authentication
    FeedServer
    Authentication Failed on GetFeed

    Authentication denied no auth credentials detected

"

PHPでこのリクエストを認証する正しい方法は何ですか?

提供されているASP.NETおよびJavaの例も参照してください

4

2 に答える 2

1

承認は、POSTパラメータではなくHTTPヘッダーです。CURLOPT_POSTFIELDSリクエストの本文を設定するために使用しました。代わりに、次を使用して設定する必要がありますCURLOPT_HTTPHEADER(そのエントリはリストのかなり下にあります)。

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . base64_encode($user . ":" . $pass)));

また、まだ明らかでない場合は、これをPOSTリクエストとして作成する必要がないため(APIで必要な場合を除く)、以下を削除できます。

curl_setopt($ch, CURLOPT_POST, 1); // set POST method
于 2012-07-18T01:27:43.680 に答える
0

次のコードを使用することもできます。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $pass);

試したところ、問題なく動作します。

それがお役に立てば幸いです。よろしく。

于 2013-05-21T12:21:33.440 に答える