Ruby on rails 无法获取Google Analytics API的oAuth2访问令牌

Ruby on rails 无法获取Google Analytics API的oAuth2访问令牌,ruby-on-rails,oauth-2.0,access-token,google-analytics-api,garb-gem,Ruby On Rails,Oauth 2.0,Access Token,Google Analytics Api,Garb Gem,我使用的是Rails+Garb Gem(Sija Branch)+omniauth-google-oauth2 Gem,我可以成功通过google Analytics API进行身份验证,并提取我们的应用程序在使用用户登录时生成的数据,例如: Garb::Session.login('USERNAME', '<PASSWORD>') 在这一点上,对我来说有点模糊,我将非常感谢一些指导。以下是我取得的成绩: 1) 我在GoogleAPI控制台中创建了一个项目,并在Services下打

我使用的是Rails+Garb Gem(Sija Branch)+omniauth-google-oauth2 Gem,我可以成功通过google Analytics API进行身份验证,并提取我们的应用程序在使用用户登录时生成的数据,例如:

Garb::Session.login('USERNAME', '<PASSWORD>')
在这一点上,对我来说有点模糊,我将非常感谢一些指导。以下是我取得的成绩:

1) 我在GoogleAPI控制台中创建了一个项目,并在Services下打开了AnalyticsAPI

2) 这为我提供了客户ID和客户机密

3) 我遇到了这个代码,我可以用上面的ID和密码填充它:

client = OAuth2::Client.new(
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
{
    :site          => 'https://accounts.google.com',
    :authorize_url => '/o/oauth2/auth',
    :token_url     => '/o/oauth2/token'
})
4) 然后是下一位代码:

response = OAuth2::AccessToken.new(
    client,
    STORED_TOKEN, {
    refresh_token: STORED_REFRESH_TOKEN,
    expires_at: STORED_EXPIRES_AT
})
5) 然后在理论上联系:

Garb::Session.access_token = response
我的问题是我没有上面第(4)点中的令牌信息。在我看来,使用oAuth2,我需要进行一次“握手”并打印出返回令牌值?也许通过Rails代码打印返回的值,然后将令牌值粘贴到Rails应用程序中的常量中,以便我可以在上述代码中使用它们?我真的很困惑。正如我前面提到的,web应用程序使用用户登录身份验证可以正常工作。该web应用程序所做的一切就是通过分析进行验证,提取一些数据并绘制图表。但我一直无法将其转换为oAuth2,因为我不知道如何获取Garb Gem正在寻找的访问令牌。我还应该注意,这不是一个多用户验证的公共网站,这是一个连接到我们自己的分析数据的CMS网站

我已经看到了这方面的一些片段,但不是一个完整的解释或工作示例。我真的非常感谢任何关于这个问题的指导和帮助

多谢各位


JR

我在过去几周里一直在努力解决这个问题,所以让我来分享一下成功的经验:

要使用Oauth2,您需要获得一个“刷新令牌”,每次进行API调用时,您都可以使用该令牌对google进行“重新验证”。具体步骤如下:

  @authentication = Authentications.find(params[:id])

  client = OAuth2::Client.new GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET,
                                  {
                                    :site => 'https://accounts.google.com',
                                    :authorize_url => "/o/oauth2/auth",
                                    :token_url => "/o/oauth2/token",
                                  }
  response = OAuth2::AccessToken.from_hash(client, :refresh_token => @authentication.access_token).refresh!
  Garb::Session.access_token = response
  @profiles = Garb::Management::Profile.all
1) 在API控制台中设置您的帐户-(看起来您做得很好) 2) 在API帐户中,确保有一个重定向URI指向应用程序:

http://some-url.com/auth/google_oauth2/callback
http://localhost:3000/auth/google_oauth2/callback
请注意,google不允许您以0.0.0.0:3000的身份回拨本地计算机。。。因此,您需要显式地使用localhost

3) 在路由文件中,将重定向url绑定到要在其中创建项目或身份验证的控制器中的操作

match '/auth/:provider/callback' => 'authentications#create'
“:provider”只允许您匹配多种类型的oauth,但您也可以将“google_oauth2”放在那里

4) 现在在控制器中创建该操作

def create
  auth = request.env["omniauth.auth"] 
  params = request.env["omniauth.params"]
  project = Project.find(params['project_id'])

  Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token'])
  flash[:notice] = "Authentication successful."
  redirect_to owner_view_project_path(project)
end
5) 控制器操作应该从响应对象中检索相关字段(此处为响应对象的详细信息:)-特别是,您需要获取“刷新\u令牌”并将其保存到您的项目或身份验证对象中-如果您尚未将“访问\u令牌”属性添加到所需对象,请立即通过迁移执行该操作,然后开始将刷新令牌保存到该属性

6) 现在,当您准备好调用该特定身份验证并获取其API数据时,您可以加载保存访问令牌的对象,并使用该对象获取与google API的新会话,如下所示:

  @authentication = Authentications.find(params[:id])

  client = OAuth2::Client.new GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET,
                                  {
                                    :site => 'https://accounts.google.com',
                                    :authorize_url => "/o/oauth2/auth",
                                    :token_url => "/o/oauth2/token",
                                  }
  response = OAuth2::AccessToken.from_hash(client, :refresh_token => @authentication.access_token).refresh!
  Garb::Session.access_token = response
  @profiles = Garb::Management::Profile.all
这段代码所做的是创建一个OAuth2访问令牌(响应),方法是指定客户机,然后指定一个刷新令牌,然后调用“刷新!”要获取刷新的访问令牌。。。然后使用该访问令牌建立Garb会话,然后使用Gard::Management::Profile.all调用给定帐户的所有配置文件


希望这有帮助-如果你有问题,请告诉我

请注意我在以下方面的工作:

对于步骤3、4和5,我使用cURL来检索访问/刷新令牌。步骤6对我来说也是一样的(使用Garb Gem的Sija分支)。所以使用cURL:

curl --data "code=<APP_CODE>&redirect_uri=http://localhost:3000/oauth2callback&client_id=<CLIENT_ID>.apps.googleusercontent.com&scope=&client_secret=<CLIENT_SECRET>&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
使用与谷歌应用程序关联的详细信息,使用cURL发布以下内容:

curl --data "code=<APP_CODE>&redirect_uri=http://localhost:3000/oauth2callback&client_id=<CLIENT_ID>.apps.googleusercontent.com&scope=&client_secret=<CLIENT_SECRET>&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
curl--data“code=&redirect\u uri=http://localhost:3000/oauth2callback&client_id=.apps.googleusercontent.com&scope=&client_secret=&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
答复的形式如下:

{
  "access_token" : "<ACCESS_TOKEN>",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "<REFRESH_TOKEN>"
}
{
“访问令牌”:“,
“令牌类型”:“承载者”,
“expires_in”:3600,
“刷新\u令牌”:”
}

您可以根据第6部分将其插入服装宝石。

由@CamNorgate提供的答案是有效的

如果在回调中没有从Omniauth返回“刷新\u令牌”,请确保正确初始化:google\u oauth2

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"],
    { :scope=>"https://www.google.com/m8/feeds, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile",
      :approval_prompt=>"force", access_type="offline"
    }

end

确保包括:批准\u提示=>“强制”,访问\u type=“offline”,以便发送回刷新令牌

非常感谢你详细的回答。实际上,我使用相同的Rails实现了这一点,但使用cURL获取访问/刷新令牌。我刚才才被允许回答我自己的问题,所以我会把它放在下面的答案中,并将你的答案标记为正确。再次干杯!我也这样做了,我得到了这个错误***OAuth2::错误异常:GData
权限不足
权限不足