对Google的OAuth请求在本地成功,但在" invalid_grant"在Heroku上

时间:2014-07-10 22:15:02

标签: ruby heroku oauth google-analytics google-api-client

我使用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上的时区设置为美国/芝加哥(与我的本地机器相同),但没有骰子。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

咦。我使用dotenv和heroku-config将我的设置推送到Heroku。事实证明,将我的GOOGLE_USER和GOOGLE_PRIVATE_KEY_BASE64放在我的.env文件中的引号内是由heroku-config完全取而代之的,它正在将带有引号的设置推送到我的Heroku配置中。因此,用户名/密钥无效 - 因此invalid_grant

并且认为我已经在这个问题上工作了好几天......