不能得到的OAuth2访问令牌谷歌Analytics(分析)API(Cannot get oAuth

2019-08-19 07:46发布

我使用Rails +装束宝石(传送特性Sija分公司)+ omniauth - 谷歌 - 的oauth2宝石,我可以成功地使用用户登录,例如,当我们的应用程序正在生成谷歌Analytics(分析)API和提取数据进行验证:

Garb::Session.login('USERNAME', '<PASSWORD>')

然后我可以使用装束连接到分析简介欲,并从中提取数据,并在网页上显示一些图表。 这一切工作正常。

不过,我想使用的OAuth2与分析来验证这就是为什么我必须安装从GitHub外衣宝石(它支持的oauth2)的传送特性Sija分支,我也安装了omniauth - 谷歌 - 的oauth2宝石。 现在,在理论上我应该可以使用下面的代码进行验证:

Garb::Session.access_token = access_token # an instance of OAuth2::Client

这是在这一点上,它变得有点朦胧了我,我将不胜感激一些指导。 这里有多远,我已经得到了:

1)我在谷歌API控制台创建项目和服务下开启Analytics(分析)API

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, 我只是不知道如何获取外衣宝石正在寻找的访问令牌。 我还要指出的是,这不是一个公共网站与多个用户进行身份验证,这是一个CMS网站是连接到我们自己的分析数据。

我已经看到了这方面的一些部分片段,但不是一个充分的解释或工作的例子。 我会很感激的任何指导,并与这个问题有所帮助。

提前谢谢了,

JR

Answer 1:

我已经通过这个在过去的几个星期当过兵,所以让我分担什么工作:

要使用的OAuth2你需要得到一个“刷新令牌”您使用在每次调用API时“重新认证”与谷歌。 对于此的步骤如下:

1)设置你的API控制台中的帐户- https://code.google.com/apis/console/b/0/ (好像你已经做了很好)2)在您的API帐户,请确保您有一个重定向URI指向回到您的应用程序:

http://some-url.com/auth/google_oauth2/callback
http://localhost:3000/auth/google_oauth2/callback

这里注意,谷歌不会让你为0.0.0.0:3000回调到本地机器...所以你需要使用localhost明确

3)在你的路由文件,配合重定向URL到一个动作在你要创建项目或认证控制器

match '/auth/:provider/callback' => 'authentications#create'

该“:提供”简单地让您在多种类型的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)控制器操作应检索响应对象的相关字段响应对象这里的(详见: https://github.com/zquestz/omniauth-google-oauth2 ) -特别是,你需要得到“refresh_token”和即保存到您的项目或认证对象 - 如果你还没有加入“ACCESS_TOKEN”属性所需的对象,去请以迁移,然后开始保存刷新令牌给该属性

6)现在,当你准备调用特定的认证,并获得API数据,你可以加载该对象在保存该访问令牌,并使用如下得到与谷歌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

这段代码所做的是通过指定的客户端,然后一个refresh_token,然后调用建立OAuth2访问令牌(响应)'刷新! 得到刷新访问令牌......然后使用该访问令牌来建立你的装束会话,然后调用了所有的配置文件使用加尔::管理:: Profile.all指定帐户

希望这有助于 - 让我知道,如果你有任何问题!



Answer 2:

对我什么工作刚一说明:

对于步骤3,4 5 I用于卷曲代替检索访问/刷新令牌。 步骤6是那么对于我的相同(使用装束宝石的传送特性Sija分支)。 使用curl:

使用与您的谷歌应用程序POST以下使用卷曲相关的详细信息:

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

响应采用以下形式:

{
  "access_token" : "<ACCESS_TOKEN>",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "<REFRESH_TOKEN>"
}

你可以插入装束宝石按照第6部分。



Answer 3:

通过@CamNorgate答案是有效的。

如果你没有一个“refresh_token”从Omniauth回到了回调确保您正确初始化:google_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

确保包括:approval_prompt =>“力”,ACCESS_TYPE =“离线”为了要发送的refresh_token回来。 所述refresh_token只提供对来自用户的第一授权 。



文章来源: Cannot get oAuth2 Access Token for Google Analytics API