我使用omniauth创建了一个rails应用程序,允许用户使用google登录并跟踪他们的YouTube视频分析。我使用以下宝石:omniauth-google-oauth2,google-api-client并遵循一些provided examples。用户授权应用程序获取分析(一次),之后每天收集它们。
这是omniauth.rb范围,client_id和client_secret。我成功获得了access_token和refresh_token。
provider :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET'], {
:scope => "yt-analytics.readonly,userinfo.email,userinfo.profile"
}
使用私钥在后台成功获取客户端访问令牌:
key = Google::APIClient::KeyUtils.load_from_pkcs12('xxx-privatekey.p12', 'notasecret')
client.authorization = Signet::OAuth2::Client.new(
:token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
:audience => 'https://accounts.google.com/o/oauth2/token',
:scope => 'https://www.googleapis.com/auth/yt-analytics.readonly',
:issuer => 'xxx-yyy@developer.gserviceaccount.com',
:signing_key => key)
client.authorization.fetch_access_token!
我正在使用以下行执行报告查询:
# [Query 1]
client.execute!(:api_method => youtube_analytics.reports.query, :parameters => {
:ids => 'channel==own_channel_id',
'end-date' => '2014-02-15',
'start-date' => '2014-02-01',
:metrics => 'views'
})
即使对于这个一般查询,我收到以下错误消息:
Google::APIClient::ClientError: Invalid query. Query did not conform to the expectations.
如果我执行[查询1]的url版本甚至更复杂的查询,我确实成功获取了正确的json:
https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DUown_channel_id&start-date=2013-10-01&end-date=2014-10-31&metrics=views%2Ccomments%2CfavoritesAdded%2Clikes%2Cdislikes%2CestimatedMinutesWatched%2CaverageViewDuration&key={YOUR_API_KEY}
你能告诉我吗?
谢谢。
更新1:经过进一步调查后,我认为问题可能与令牌的生成有关,因为这是请求中的唯一区别(我和谷歌api资源管理器生成的请求) 。
可能不是主要问题,但仍然是:client.authorization.fetch_access_token!
生成的持有人令牌长度为78个字符,而google api资源管理器的令牌长度为85个字符。要在client.execute!
我添加client.authorization.access_token = [token-obtained-by-api-explorer]
并返回正确结果之前验证这一点。
我正在添加两个完整的示例(都返回“...查询不符合预期......”错误):https://gist.github.com/rebelact/9135573和https://gist.github.com/rebelact/9135594。我从https://www.youtube.com/account_advanced
获得了我的频道ID 更新2:经过多次挖掘后,我得知用刷新后的刷新令牌。我发现了这条评论 - https://github.com/zquestz/omniauth-google-oauth2/issues/37#issuecomment-15734250,它最初刷新了令牌。但经过一段时间后,它开始抛出错误"{'error' : 'invalid_grant'}"
。我读了它,我相信我传递了正确的凭据,我的时钟根据NTP同步(我在heroku上得到了同样的错误)。您能否提一些建议? (如果你想打开另一个问题,请告诉我)