确实没有办法(我发现)完全绕过访问外部页面来授权 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 是您在未来请求中使用的新令牌。