現在、C++ のデスクトップ アプリケーションに Youtube API を使用しています。認証が必要な直接アップロードを実装しようとしています。私は当然 OAuth 2.0 を選択し、Google の例に従ったところ、明らかにすべてがうまく機能し、アクセス トークンと更新トークンを取得しましたが、エラーは返されませんでした。
ただし、アクセス トークンを使用して動画をアップロードしようとすると (Authorization : Bearer
ヘッダーに入れました)、401 : Unauthorized
description でエラーが発生しますToken Invalid
。
次に、アップロードをリクエストする直前にアクセス トークンを更新しようとしました (つまり、アプリケーションのフローでは 2 つの操作が連続しているため、アクセス トークンを取得した直後に更新しようとしました)。アクセス トークンは変更されませんでした:更新要求と交換要求から同じアクセス トークンを受け取りました。
最初は、アクセス トークンは有効期限が切れたときにのみ更新する必要があると考えていましたが、明らかにそうではありません。OAuth 2.0 Playgroundを使用すると、まだ有効期限が切れていないトークンを更新しても問題なく機能し、別のアクセス トークンが得られることは明らかです。
問題が何であるかについて何か考えはありますか?401 エラーは、トークンを更新できないという事実に関連していますか?
編集:Fiddlerに示されているリクエストとレスポンスは次のとおりです
リクエスト :
POST http://uploads.gdata.youtube.com/feeds/api/users/default/uploads HTTP/1.1
Accept: */*
Accept-Language: xx
Authorization: Bearer MY_ACCESS_TOKEN
GData-Version: 2
X-GData-Key: key=MY_DEV_KEY
Slug: test.avi
Content-Type: multipart/related; boundary="f93dcbA3"
Pragma: no-cache
User-Agent: SOME_STUFF
Host: uploads.gdata.youtube.com
Content-Length: 23686
Connection: Keep-Alive
--f93dcbA3
Content-Type: application/atom+xml; charset=UTF-8
<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007"><media:group><media:title type="plain">Bad Wedding Toast</media:title><media:description type="plain">I gave a bad toast at my friend's wedding.</media:description><media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category><media:keywords>toast, wedding</media:keywords></media:group></entry>
--f93dcbA3
Content-Type: video/avi
Content-Transfer-Encoding: binary
<My file binary data>
--f93dcbA3--
応答
HTTP/1.1 401 Unauthorized
X-GData-User-Country: FR
WWW-Authenticate: Bearer realm="https://accounts.google.com/o/oauth2/auth",service="youtube"
Content-Type: text/html; charset=UTF-8
Content-Length: 13
X-GUploader-UploadID: AEnB2UrVDA94Fk5VFn1ng-2q9VFOo2KifLvIEHFOxQ4m66IUSC8sRf3mo5S8UH94mLyupbfANeLQvxMPhPLo6L0wlcaguQW9CQ
Date: Wed, 17 Jul 2013 09:51:23 GMT
Server: HTTP Upload Server Built on Jul 8 2013 15:32:26 (1373322746)
Token invalid
編集 2: Youtube API v3 を使用したリクエストとレスポンス
リクエスト :
POST /upload/youtube/v3/videos?part="snippet" HTTP/1.1
Host: www.googleapis.com
X-gdata-key: DEV_KEY
Content-length: 42190
Content-type: multipart/related; boundary="===============1679429526=="
Authorization: ACCESS_TOKEN
--===============1679429526==
Content-type: application/json
{
"snippet":
{
"title": "test"
}
}
--===============1679429526==
Content-type: video/avi
<BINARY DATA - 41984B>
--===============1679429526==--
応答 :
HTTP/1.1 400 Bad Request
Content-length: 229
Via: HTTP/1.1 GWA
X-google-cache-control: remote-fetch
Server: HTTP Upload Server Built on Jul 8 2013 15:32:26 (1373322746)
Date: Wed, 17 Jul 2013 22:14:03 GMT
Content-type: application/json
{
"error": {
"errors": [
{
"domain": "global",
"reason": "badContent",
"message": "Unsupported content with type: video/avi"
}
],
"code": 400,
"message": "Unsupported content with type: video/avi"
}
}