5

我有一个应用程序可以将视频上传到 YouTube 到特定的 YouTube 频道(意思是,不是到任何个人用户的频道,而是到一个频道,我有用户名和密码)。

在 ClientLogin 中,我的服务器端进程为 YouTube 提供了 U/P,一切都在进行。但是,这已被弃用,我希望升级到 OAuth 2.0(根据他们的建议),但是,文档坚持存在重定向 URI,用于用户登录时。它似乎没有解释如何绕过用户登录(因为用户没有任何东西可以登录,也没有任何凭据可以登录*with...该应用程序旨在获取他们的视频并将其上传到我们的频道)。因此,我需要绕过用户被询问任何内容,让 YouTube 简单地获取我的频道凭据并将令牌归还给我以供我上传。

我意识到这是一个完全标准且没有争议的程序,所以我*必须遗漏一些明显的东西,但我无法弄清楚那是什么。

所以,我的问题是,我如何跳过用户对话框-> 重定向,只为 youtube 提供凭据以使其接受,然后在 OAuth 2.0 中上传我的视频?

我真正想要的是在此处遵循 DirectUpload 方法: https ://developers.google.com/youtube/2.0/developers_guide_protocol#AuthSub_Authentication_Flow 并在幕后默默地检索用户令牌。

TIA

4

1 回答 1

6

确实没有办法(我发现)完全绕过访问外部页面来授权 OAuth2.0 访问。我最接近的是在 code.google.com/apis/console 上创建一个“已安装的应用程序”项目并使用设备方法。您将收到一个客户 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 apis 项目获得的客户端 ID。

你会得到这样的回应:

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

如果您在 30 分钟(每个“expires_in”响应字段 1800 秒)内没有访问 www.google.com/device(由“verification_url”字段定义),您将不得不再次执行第一个请求。在 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 回答