5

YouTube に動画を特定の YouTube チャンネル (つまり、個々のユーザーのチャンネルではなく、ユーザー名とパスワードを持っている単一のチャンネル) にアップロードするアプリがあります。

ClientLogin では、サーバー側のプロセスが YouTube に U/P を提供し、すべてが先に進みました。ただし、それは廃止されており、OAuth 2.0 へのアップグレードを検討しています (彼らの推奨に従って)。しかし、ドキュメントでは、ユーザーがログインしたときのためにリダイレクト URI があると主張しています。方法を説明していないようです。ユーザーのログインをバイパスします (ユーザーにはログインするものが何もないか、ログインするための資格情報がないため、*... アプリはビデオを取得して私たちのチャンネルにアップロードするように設計されています)。したがって、私が必要としているのは、ユーザーが何かを尋ねられるのを回避し、YouTube が単に私のチャンネル資格情報を取得し、アップロードを行うためのトークンを返すことです。

これは完全に標準的で議論の余地のない手順であることを認識しているので、何か明らかなことが抜けているに違いありませんが、それが何であるかを推測することはできません.

それで、私の質問は、どのようにユーザーダイアログをスキップしてリダイレクトし、YouTube に資格情報を提供して受け入れ、OAuth 2.0 でビデオをアップロードするにはどうすればよいですか?

私が本当に求めているのは、ここで DirectUpload アプローチに従うことです: https://developers.google.com/youtube/2.0/developers_guide_protocol#AuthSub_Authentication_Flow そして、ユーザートークンを舞台裏で静かに取得します。

ティア

4

1 に答える 1

6

OAuth2.0アクセスを承認するために外部ページにアクセスすることを完全にバイパスする方法は(私が見つけた)本当にありません。最も近いのは、code.google.com/apis/console で「Installed Application」プロジェクトを作成し、デバイスの方法論を使用することです。クライアント ID とクライアント シークレットを受け取ります。これらは後で使用します。code.google.com/apis/youtube/dashboard/ を通じて、開発者キーを生成するのが理想的ですが、現時点ではこれが必要になるとは思いません。

ヘッダーと応答に JSON 表記を使用します。選択した言語に簡単に適応できるはずです。

まず、ヘッダーを使用して accounts.google.com/o/oauth2/device/code に POST リクエストを送信します。

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

および以下を含むデータ:

{
client_id: 'YOUR_CLIENT_ID',
scope: 'https://gdata.youtube.com'
}

YOUR_CLIENT_ID は、前に設定した Google API プロジェクト用に取得したクライアント ID です。

次のような応答が返されます。

{
  "device_code" : "4/Pj8m71w5XuEMTT0ZwOJVgvlTfF4Q",
  "user_code" : "5wtw67wm",
  "verification_url" : "http://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

www.google.com/device (「verification_url」フィールドで定義) に 30 分 (「expires_in」応答フィールドごとに 1800 秒) 以内にアクセスしない場合、この最初のリクエストを再度実行する必要があります。www.google.com/device ページで、まだログインしていない場合はログインし、確認コード (「user_code」応答フィールドで定義) を入力するよう求められます。アプリケーションを承認するためのリクエストと、アプリがリクエストしている権限のリストが表示されます。「device_code」フィールドの値を (少なくとも一時的に) 保存したいとします。これは、アクセス トークンとリフレッシュ トークンを要求するときに使用されます。

アクセス許可が付与されたので、アクセス/リフレッシュ トークンのペアを要求できます。これは、リフレッシュ トークンを保存する場合にのみ行う必要があります。アクセス トークンとリフレッシュ トークンのペアをリクエストするには、accounts.google.com/o/oauth2/token にヘッダーを付けて POST リクエストを行う必要があります。

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

そしてデータ

{
    client_id: 'YOUR_CLIENT_ID',
    client_secret: 'YOUR_CLIENT_SECRET',
    code: 'YOUR_DEVICE_CODE',
    grant_type: 'http://oauth.net/grant_type/device/1.0'
}

応答は次のようになります

{
  "access_token" : "YOUR_ACCESS_TOKEN",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "YOUR_REFRESH_TOKEN"
}

これは、アクセス トークンが 3600 秒 (60 分) で期限切れになること、および現在のアクセス トークンと更新トークンが何であるかを指定します。現在のセッションで使用するためにアクセス トークンを保存し、今後のセッションのために更新トークンを保存します。

API リクエストを作成するときは、Authorization ヘッダー フィールドにアクセス トークンを含め、これまでどおり開発者キーを含める必要があります。ビデオをアップロードするために、次のヘッダーを使用しました。

{
    'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY',
    'Slug': 'video.mp4',
    'Content-Type': 'multipart/related; boundary="f897a6d"',
    'Content-Length': post_length,
    'Connection': 'close'
}

古いトークンの有効期限が切れたときだけでなく、いつでもアクセス トークンを更新できます。アクセス トークンを更新するには、ヘッダーを使用して accounts.google.com/o/oauth2/token に POST リクエストを送信します。

{
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': post_data.length,
    'X-GData-Key': 'key=YOUR_DEVELOPER_KEY'
}

そしてデータ

{
    client_id: 'YOUR_CLIENT_ID',
    client_secret: 'YOUR_CLIENT_SECRET',
    refresh_token: 'YOUR_REFRESH_TOKEN',
    grant_type: 'refresh_token'
}

このような応答が得られます

{
  "access_token" : "YOUR_NEW_ACCESS_TOKEN",
  "token_type" : "Bearer",
  "expires_in" : 3600
}

YOUR_NEW_ACCESS_TOKEN は、今後のリクエストで使用する新しいトークンです。

于 2012-05-08T17:53:19.833 に答える