4

我正在使用Rails + Garb Gem(Sija分支)+ omniauth-google-oauth2 Gem和我可以使用Google Analytics API成功进行身份验证,并提取我们的应用在使用时生成的数据用户登录,例如:无法获取谷歌分析API的oAuth2访问令牌

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

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

但是,我想使用oAuth2来与Analytics进行身份验证,这就是为什么我必须从Github安装Garb Gem的Sija分支(它支持oAuth2)并且我还安装了omniauth-google-oauth2 Gem。现在,在理论上我应该可以使用下面的代码进行验证:

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

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

1)我在谷歌API控制台创建项目和服务

2)下开启Analytics(分析)API这为我提供了一个客户端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应用程序可以正常工作。所有网络应用程序正在执行分析验证,拉下一些数据并绘制图表。但我坚持把它转换为oAuth2作为我只是不知道如何获得Garb Gem正在寻找的访问令牌。我还应该注意到,这不是一个有多个用户认证的公共网站,这是一个连接到我们自己的Google Analytics数据的CMS网站。

我已经看到了这方面的一些部分片段,但没有一个完整解释或工作的例子。我真的很感谢任何指导和帮助解决这个问题。

很多感谢,

JR

回答

5

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

要使用的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' 

':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)创建一个动作控制器动作应检索响应对象的相关字段这里响应对象(详见:https://github.com/zquestz/omniauth-google-oauth2) - 特别是,您需要获取'refresh_token'并将其保存到项目或认证对象中 - 如果您尚未向所需对象添加'access_token'属性,请立即执行迁移,然后开始将刷新标记保存到该属性中

6)现在,当您准备好调用特定身份验证并获取API da TA吧,你可以加载该对象在保存该访问令牌,并使用与谷歌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访问令牌(响应)通过指定客户端,然后一个refresh_token,然后调用'刷新!'获取刷新的访问令牌...然后使用该访问令牌建立Garb会话,然后使用Gard :: Management :: Profile调用给定帐户的所有配置文件。

希望这有助于 - 让我知道你是否有问题!

+0

非常感谢您的详细解答。实际上,我使用相同的Rails,但使用cURL来获取访问/刷新令牌。我直到现在才被允许回答我自己的问题,所以我会在下面给出答案,并将其标记为正确。再次欢呼! – 2013-05-13 08:24:43

+0

我做了同样的,我得到这个错误*** OAuth2 ::错误异常:<?xml version =“1.0”encoding =“UTF-8”?> GDatainsufficientPermissions Permission Permission RailsEnthusiast 2013-05-29 10:44:50

3

对我什么工作刚一说明:

对于步骤3,4 & 5我用卷曲,而不是检索访问/刷新标记。第6步对我来说是一样的(使用Garb Gem的Sija分支)。使用curl:

使用与您的谷歌应用程序POST相关的下列使用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 

响应采取以下形式:

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

,你可以插入装束宝石根据第6部分。

1

@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发送回去。 The refresh_token is only provided on the first authorization from the user