我使用Google服务帐户为我的Dashing信息中心调用API进行API调用。我使用Legato gem获取Google Analytics数据,并使用gem wiki的instructions for service accounts进行身份验证。
我已将我的Google用户名和私钥放入ENV(在对其进行64位编码之后),并使用dotenv在本地和Heroku之间同步这些设置(heroku config
确认所有内容都已正确设置)。所以,我的身份验证代码如下所示:
class GoogleAnalyticsAccount
attr_accessor :user, :profile
# Thanks to the "Service Accounts" section at
# https://github.com/tpitale/legato/wiki/OAuth2-and-Google
def initialize scope="https://www.googleapis.com/auth/analytics.readonly"
client = Google::APIClient.new application_name: '[App name]',
application_version: '1.0'
key = Google::APIClient::PKCS12.load_key(Base64.decode64(ENV['GOOGLE_PRIVATE_KEY_BASE64']), "notasecret")
service_account = Google::APIClient::JWTAsserter.new(ENV['GOOGLE_USER'], scope, key)
client.authorization = service_account.authorize
oauth_client = OAuth2::Client.new("", "", {
:authorize_url => 'https://accounts.google.com/o/oauth2/auth',
:token_url => 'https://accounts.google.com/o/oauth2/token'
})
token = OAuth2::AccessToken.new(oauth_client, client.authorization.access_token)
@user = Legato::User.new(token)
end
def profile
@user.profiles.first
end
end
在本地,这段代码运行得很好。在Heroku上,我收到了Google的以下回复:
{
"error": "invalid_grant"
}
没有更多细节。基于广泛的谷歌搜索,我发现两个最可能的原因是A)我达到了我的请求限制(但它不可能,因为相同的凭据在本地工作), B)服务器时钟未与NTP同步。我已经将Heroku上的时区设置为美国/芝加哥(与我的本地机器相同),但没有骰子。
有什么想法吗?谢谢!
答案 0 :(得分:1)
咦。我使用dotenv和heroku-config将我的设置推送到Heroku。事实证明,将我的GOOGLE_USER和GOOGLE_PRIVATE_KEY_BASE64放在我的.env
文件中的引号内是由heroku-config完全取而代之的,它正在将带有引号的设置推送到我的Heroku配置中。因此,用户名/密钥无效 - 因此invalid_grant
。
并且认为我已经在这个问题上工作了好几天......