我正在使用Rails + Garb Gem(Sija Branch)+ omniauth-google-oauth2 Gem,我可以使用Google AnalyticsAPI成功验证并提取我们的应用在使用用户登录时生成的数据,例如:
Garb::Session.login('USERNAME', '<PASSWORD>')
然后我可以使用Garb连接到我想要的Analytics Profile并从中提取数据并在网页上显示一些图表。一切正常。
但是,我想使用oAuth2对Analytics进行身份验证,这就是为什么我必须从Github安装Garb Gem的Sija分支(它支持oAuth2),我还安装了omniauth-google-oauth2 Gem。现在理论上我应该能够使用以下代码进行身份验证:
Garb::Session.access_token = access_token # an instance of OAuth2::Client
在这一点上,它对我来说有点模糊,我非常感谢一些指导。这是我走了多远:
1)我在Google API控制台中创建了一个项目,并启用了服务
下的Analytics API2)这为我提供了客户端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
我遇到的问题是我在上面的Point(4)中没有令牌信息。在我看来,使用oAuth2我需要进行一次“握手”并打印出返回令牌值?也许通过Rails代码打印返回的值,然后将令牌值粘贴到Rails应用程序中的常量中,以便我可以在上面的代码中使用它们?我真的很困惑。正如我之前提到的,使用用户登录身份验证,Web应用程序正常工作。所有Web应用程序正在进行的是使用分析进行身份验证,下拉一些数据并绘制图表。但我坚持将其转换为oAuth2为 我只是不知道如何获取Garb Gem正在寻找的访问令牌。 我还应该注意这是不是具有多个用户身份验证的公共网站,这是一个连接到我们自己的Google Analytics数据的CMS网站。
我已经看到了一些方面的部分片段,但没有完全解释或工作的例子。我真的很感激这个问题的任何指导和帮助。
非常感谢,
JR
答案 0 :(得分: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
请注意,Google不会让您以0.0.0.0:3000的形式回拨本地计算机...因此您需要明确使用localhost
3)在您的路径文件中,将重定向网址绑定到您要创建项目或身份验证的控制器中的操作
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'并将其保存到项目或身份验证中object - 如果您尚未向所需对象添加'access_token'属性,请立即执行迁移,然后开始将刷新令牌保存到该属性
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
此代码执行的操作是通过指定客户端然后指定refresh_token创建OAuth2访问令牌(响应),然后调用“刷新!”获取刷新的访问令牌...然后使用该访问令牌建立您的Garb会话,然后使用Gard :: Management :: Profile.all
调用给定帐户的所有配置文件希望这会有所帮助 - 如果您有任何疑问请与我联系!
答案 1 :(得分:3)
请注意一下对我有用的内容:
对于步骤3,4和&amp; 5我使用cURL来检索访问/刷新令牌。对我来说,步骤6是相同的(使用Garb Gem的Sija分支)。所以使用cURL:
使用与您的Google应用相关联的详细信息使用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部分插入Garb Gem。
答案 2 :(得分:1)
@CamNorgate的回答是有效的。
如果你没有&#34; refresh_token&#34;在回调中从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 =&gt;&#34;强制&#34;,access_type =&#34;离线&#34; ,以便将refresh_token发回。 The refresh_token is only provided on the first authorization from the user