【ebay API】Token type in the Authorization header is invalidのエラー解決
世界的ECサイトebayでは、developerに登録すると検索APIや出品API、出品削除APIなどさまざまな機能をプログラム上から使用することができます。
今回は、ebay APIを使用した際に出たエラー「Token type in the Authorization header is invalid」を解決する方法を紹介していきます。
※本稿では、PHPを使っています。他の言語でも似たような構文になるはずですので、参考にしてみてください。
【注意点】
ebay APIを使用するためには、developerプログラムに参加したり、下記記事のようにアラート&通知を設定したりする必要があります。
【eBayデベロッパーAPI】設定方法 exemption/Marketplace Account Deletion/Closure notifications
本稿では、それらの各種設定はすでに登録済みであり、実際にアプリケーションキーが発行され使用できる状態であることを想定しています。
そのため、developerへの登録方法やアラート&通知の設定方法などは他の記事をお読みくださいm(__)m
エラー内容
'{
"errors" : [ {
"errorId" : 1003,
"domain" : "OAuth",
"category" : "REQUEST",
"message" : "Token type in the Authorization header is invalid:AgAAAA**AQAAA...",
"longMessage" : "Token type in the Authorization header is invalid:AgAAAA**AQAAA..."
} ]
}'
エラー番号1002が出た場合は、HTTPリクエストのheader内に認証キーがないことが原因です。本件と同じ方法で対処可能なので、解決方法の参考にしてみてください。
{
"errors" : [ {
"errorId" : 1002,
"domain" : "OAuth",
"category" : "REQUEST",
"message" : "Missing access token",
"longMessage" : "Access token is missing in the Authorization HTTP request header."
} ]
}
やったこと/サンプルプログラム
今回私がやりたかったことは、ebay APIを使って、キーワード検索をすることです。
そのため、公式ドキュメント「Search」を読みながら、下記のように組みました。
//検索API URL
private const URL_SEARCH = 'https://api.ebay.com/buy/browse/v1/item_summary/search?q=254/s-p';
function searchAPI(){
$headers=[
'Authorization:AgAAAA**..........',
];
$ch = curl_init(self::URL_SEARCH);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curlres = curl_exec($ch);
curl_close($ch);
var_dump($curlres);
}
すると結果は「エラー内容」で示した通りになりました。
つまり、APIキーが違うといわれています。
解決策
ヘッダーには bearer を設定する
Auth’n Authではなく、OAuthキーを使用する
ebayは海外発のサイトですのでやっぱり日本語サイトより英語圏サイトの方がQ&Aも充実してますね。
下記図をご覧ください。
developerサイトにログインして表示したUserTokensページです。
私は最初、「Auth’n Auth」を選択して表示されるキー(A始まり)を認証キーに設定していました。
しかし、「参考欄」に挙げた海外サイトでは、
となっています。
つまり、そもそも使用するキーも違っていたのです。
「Bearerを付与」+「v始まりのキー(OAuth)」を使用することで、うまくいきました。
※OAuthは上記画像にある画面で、「Get OAuth Application Token」をクリックすることで表示されます。
解決後のプログラム
//検索API URL
private const URL_SEARCH = 'https://api.ebay.com/buy/browse/v1/item_summary/search?q=254/s-p';
function 解決後(){
$headers = [
'Authorization: Bearer ' . 'v^1.1#........................,
];
$ch = curl_init(self::URL_SEARCH);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curlres = curl_exec($ch);
curl_close($ch);
var_dump($curlres);
}
結果は以下の通りです。
{
"href":"https://api.ebay.com/buy/browse/v1/item_summary/search?q=254%2Fs-p&limit=50&offset=0",
"total":17,
"next":"https://api.ebay.com/buy/browse/v1/item_summary/search?q=254%2Fs-p&limit=50&offset=50",
"limit":50,
"offset":0,
"itemSummaries":[{"itemId":"v1|294431348446|0",
"title":"Pokemon Crad Promo celebration fanfare CHAMPION SHIP SERIES 2021 254/S-P TCG ",
"image":{"imageUrl":"https://i.ebayimg.com/thumbs/images/g/CEYAAOSwFXphVug-/s-l225.jpg"},
"price":{"value":"234.41",
"currency":"USD"},
"itemHref":"https://
... (中略)
}
ちゃんとデータが取れていることが分かりますね!
お疲れ様でした。
結び
ebayAPIは、もともとXML形式でリクエストすることができました。(XMLかSOAP形式)
ですが最近アップデートされて、XMLでのリクエストが非推奨になり、新しくREST API形式でのリクエスト手法に切り替わっていました。
確かにセキュリティ面や保守面、現在のWEB環境を踏まえるとこの移行は妥当なのかもしれませんね。
今後はどのAPIもRESTful形式での問い合わせが一般的になってくると思うので、headerに持たせる認証コードの書き方は覚えておくと、アドバンテージがあるかもしれません。
何はともあれ、私がしたかった実装ができたので、めでたしです!