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