从YouTube ClientLogin迁移到OAuth 2.0

时间:2012-05-08 00:22:47

标签: oauth youtube oauth-2.0

我有一个应用程序可以将视频上传到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 并在幕后默默地检索用户令牌。

TIA

1 个答案:

答案 0 :(得分: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分钟内访问www.google.com/device(由" verification_url"字段定义)(每个" 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是您在将来的请求中使用的新令牌。