gpt4 book ai didi

ruby-on-rails - 无法获取 Google Analytics API 的 oAuth2 访问 token

转载 作者:行者123 更新时间:2023-12-04 06:11:56 25 4
gpt4 key购买 nike

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

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

然后我可以使用 Garb 连接到我想要的分析配置文件并从中提取数据并在网页上显示一些图表。这一切都很好。

但是,我想使用 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 控制台中创建了一个项目,并在Services 下打开了Analytics API

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

3) 我遇到了这段代码,我可以用上面的 ID 和 Secret 填充它:
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) 点中的 token 信息。在我看来,使用 oAuth2 我需要进行一次“握手”并打印出返回 token 值?也许通过 Rails 代码打印返回的值,然后将标记值粘贴到 Rails 应用程序中的常量中,以便我可以在上面的代码中使用它们?我真的很困惑。正如我之前提到的,Web 应用程序使用用户登录身份验证可以正常工作。 Web 应用程序所做的只是通过分析进行身份验证、提取一些数据并绘制图表。但我坚持将其转换为 oAuth2 为 我只是不知道如何获得 Garb Gem 正在寻找的访问 token 。 我还应该注意,这不是一个有多个用户身份验证的公共(public)网站,这是一个连接到我们自己的分析数据的 CMS 网站。

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

提前谢谢了,

JR

最佳答案

在过去的几周里,我一直在努力解决这个问题,所以让我分享一下有效的方法:

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

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) 在您的路由文件中,将该重定向 url 绑定(bind)到 Controller 中您将在其中创建项目或身份验证的操作
match '/auth/:provider/callback' => 'authentications#create'

':provider' 只是让您匹配多种类型的 oauth,但您也可以将 'google_oauth2' 放在那里。

4)现在在您的 Controller 中创建该操作
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) Controller 操作应该从响应对象中检索相关字段(此处响应对象的详细信息: https://github.com/zquestz/omniauth-google-oauth2)-特别是,您需要获取“刷新 token ”并将其保存到您的项目或身份验证对象中-如果您没有'未向所需对象添加 'access_token' 属性,现在进行迁移,然后开始将刷新 token 保存到该属性

6) 现在,当您准备好调用该特定身份验证并为其获取 API 数据时,您可以加载保存访问 token 的对象,并使用该对象获取与 google API 的新 session ,如下所示:
  @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 访问 token (响应),然后调用“刷新!”获取刷新的访问 token ...然后使用该访问 token 建立您的 Garb session ,然后使用 Gard::Management::Profile.all 调用给定帐户的所有配置文件

希望这会有所帮助 - 如果您有任何问题,请告诉我!

关于ruby-on-rails - 无法获取 Google Analytics API 的 oAuth2 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com