Google OAuth 访问令牌

2024-03-26

我对 OAuth 和 Google 感到很困惑。我花了很长时间才获得刷新令牌来创建新的访问令牌。然后发现refresh_token也过期了??这有什么意义啊!!!?

我需要做的就是保留一个有效的 access_token 以供使用legato https://github.com/tpitale/legato.

以下是我手动输入终端以检索 OAUTH 代码的内容:

client = OAuth2::Client.new('GA_CLIENT_ID', 'GA_SECRET_KEY', {
        :authorize_url => 'https://accounts.google.com/o/oauth2/auth',
        :token_url => 'https://accounts.google.com/o/oauth2/token'
})
client.auth_code.authorize_url({
       :scope => 'https://www.googleapis.com/auth/analytics.readonly',
       :redirect_uri => 'http://localhost',
       :access_type => 'offline',
       :approval_prompt=> 'force'
}) 

然后我在浏览器中手动输入输出的网址。我将返回的 OAUTH 代码导出为环境变量并获取访问令牌:

access_token = client.auth_code.get_token(ENV['GA_OAUTH_CODE'], :redirect_uri => 'http://localhost')

然后我可以访问access_token和refresh_token:

   begin
      api_client_obj = OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {:site => 'https://www.googleapis.com'})
      api_access_token_obj = OAuth2::AccessToken.new(api_client_obj, ENV['GA_OAUTH_ACCESS_TOKEN'])
      self.user = Legato::User.new(api_access_token_obj)
      self.user.web_properties.first # this tests the access code and throws an exception if invalid
    rescue Exception => e
      refresh_token
    end

  end

  def refresh_token
    refresh_client_obj =  OAuth2::Client.new(ENV['GA_CLIENT_ID'], ENV['GA_SECRET_KEY'], {
            :authorize_url => 'https://accounts.google.com/o/oauth2/auth',
            :token_url => 'https://accounts.google.com/o/oauth2/token'
        })
    refresh_access_token_obj = OAuth2::AccessToken.new(refresh_client_obj, ENV['GA_OAUTH_ACCESS_TOKEN'], {refresh_token: ENV['GA_OAUTH_REFRESH_TOKEN']})
    refresh_access_token_obj.refresh!
    self.user = Legato::User.new(refresh_access_token_obj)
  end

一小时后,我的令牌过期,我必须从浏览器手动重新启动该过程!我如何在代码中复制这个?


给你,为你做了一些小东西:)

这是一个简单的实现,专门用于减轻更新令牌的痛苦。

请务必:

  1. 放入你自己的APP_ID and APP_SECRET.
  2. 要么只保存你的refresh_token并打电话refresh_token()每次使用之前,或使用refresh_token_if_needed()每次都重新保存token and expires_at(显然是首选,因为您只会在需要时刷新)。
  3. 让我知道结果如何。

.

require 'gmail'
require 'gmail_xoauth'
require 'httparty'

class GmailManager
  APP_ID      = "DDDDDDDDDDDD-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.apps.googleusercontent.com"
  APP_SECRET  = "SSSSSS-SSSSSSSSSSSSSSSSS"

  def refresh_token(refresh_token)
    Rails.logger.info "[GmailManager:refresh_token] refreshing using this refresh_token: #{refresh_token}"
    # Refresh auth token from google_oauth2 and then requeue the job.
    options = {
      body: {
        client_id:     APP_ID,
        client_secret: APP_SECRET,
        refresh_token: refresh_token,
        grant_type:    'refresh_token'
      },
      headers: {
        'Content-Type' => 'application/x-www-form-urlencoded'
      }
    }
    response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options)
    if response.code == 200
      token = response.parsed_response['access_token']
      expires_in = DateTime.now + response.parsed_response['expires_in'].seconds
      Rails.logger.info "Success! token: #{token}, expires_in #{expires_in}"
      return token, expires_in
    else
      Rails.logger.error "Unable to refresh google_oauth2 authentication token."
      Rails.logger.error "Refresh token response body: #{response.body}"
    end
    return nil, nil
  end

  def refresh_token_if_needed(token, expires_on, refresh_token)
    if token.nil? or expires_on.nil? or Time.now >= expires_on
      Rails.logger.info "[GmailManager:refresh_token_if_needed] refreshing using this refresh_token: #{refresh_token}"
      new_token, new_expires_on = self.refresh_token(refresh_token)
      if !new_token.nil? and !new_expires_on.nil?
        return new_token, new_expires_on
      end
    else
      Rails.logger.info "[GmailManager:refresh_token_if_needed] not refreshing. using this token: #{token}"
    end
    return token, expires_on
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google OAuth 访问令牌 的相关文章

  • 用户在 Rails 中选择 CSS 样式表

    我正在 Rails 中开发一个网站 我希望用户能够将 CSS 样式表更改为浅色或深色主题 我认为这样我就可以为样式表使用变量 我尝试通过在我的视图中添加一个链接来更改该变量 如下所示 在我的控制器中调用此函数 class ProjectsC
  • Jekyll 服务错误:找不到 gem jekyll (>= 0.a) (Gem::GemNotFoundException

    做的时候sudo jekyll serve我收到以下错误 Users myusername rvm rubies ruby 2 4 2 lib ruby site ruby 2 4 0 rubygems rb 271 in find spe
  • 在设计电子邮件主题中添加动态价值

    好吧 我看过很多关于自定义设计电子邮件主题的讨论 但似乎没有一个能解决我想要的问题 目前我的确认电子邮件主题为 确认您的 Qitch com 帐户 我想自定义此电子邮件主题并在其中添加用户名的动态值 这样如果用户ALEX注册一个帐户 他应该
  • 使用 %w[] 创建包含空字符串的数组

    创建包含空字符串的数组 a b c 不是一个空格字符串 使用 W我可以用 W a b c 我也可以连接数组 但是是否可以使用空字符串创建数组 w 几个选项 W a b c z W a b c lt lt 我知道这没有使用 w 语法 但为了更
  • 这个角色是什么? ➡️0080➡0099

    这个字符是什么 u0080 u0099 这应该是撇号或单引号 我如何将它 使用 Ruby 转换为简单的单引号 或者在网页中将其作为单引号正确显示 Thanks 这是一个印刷正确的撇号 更准确地说是右单引号 U 2019 经过一些错误的字符代
  • CORS 与 Amazon S3 和 Cloudfront

    我有一个托管在 Heroku 上的 Rails 应用程序 它使用 CloudFront 以及托管在 S3 上的资产 它完美地显示了资产 尽管需要一些努力 我的 Cloudfront 设置 Forward Headers Whitelist
  • “PG DuplicateTable:错误关系“产品”已存在”- Heroku db:迁移尝试

    Rails 菜鸟尝试将 DB 迁移到 Heroku 请原谅这个错误消息的多汁性 但我认为将其全部包含在内可能很重要 我不知道为什么会发生这种情况 也不知道这意味着什么 我的架构中只有一张产品表和一张创建产品迁移表 Migrating to
  • 在 Ruby 中创建 Microsoft Word (.docx) 文档

    有没有一种简单的方法可以在 Ruby 应用程序中创建 Word 文档 docx 实际上 就我而言 它是一个由 Linux 服务器提供服务的 Rails 应用程序 类似的宝石Prawn http prawn majesticseacreatu
  • ASP.NET 5 OAuth 不记名令牌身份验证

    我正在尝试在 ASP NET 5 中实现 OAuth 不记名令牌身份验证 并且很难找到如何执行此操作的示例 因为 OWIN 内容在 ASP NET 5 中已发生变化 例如IApplicationBuilder UseOAuthAuthori
  • 如何强制send_data在浏览器中下载文件?

    好吧 我的问题是我正在使用send data on my Rails 3应用程序向用户发送文件AWS S3类似的服务 Base establish connection access key id gt my key secret acce
  • Bundler 似乎无法通过 Rbenv 找到正确的 Ruby

    多年来我一直使用 RVM 作为 Ruby 版本管理器 但由于其简单性 我想改用 rbenv 但是我在部署时发现了一些奇怪的问题 这似乎是错误的地方 env RBENV ROOT home deploy rbenv PATH home dep
  • 如何在 Ruby on Rails 中向 select_tag 添加类

    难以为此添加类标签 div class field div 这是我尝试过的 除其他外 div class field div
  • 从 BitBucket 请求 OAuth 令牌

    在过去的 4 个小时里 我一直在尝试将 BitBucket 集成到我的应用程序中 但没有成功 在阅读的过程中BitBucket 的 RESTful API 文档 https confluence atlassian com display
  • 客户端凭据授予的访问令牌是否可以映射到用户?

    我想使用 oauth2 中的客户端凭据授予来保护 API 但是 我希望访问令牌映射到单个用户 由我在带外信任 设置阶段选择 在该阶段我共享密钥 秘密 这是一个问题吗 我知道使用客户端凭据授予的访问令牌不应该在用户的上下文中 以这种方式绑定它
  • Facebook 注册后重定向至页面

    我正在尝试在成功 Facebook 注册 未登录 后重定向用户 我想重定向到 getstarted welcome用户注册后首次 我的omniauth回调是 def facebook You need to implement the me
  • 单表继承发现问题

    我有以下3个rails类 它们都存储在一张表中 使用rails的单表继承 class Template lt ActiveRecord Base class ThingTemplate lt Template class StockThin
  • .js.erb VS .js

    将 Rails 应用程序的 javascript 放入 js erb 文件而不只是将其放入 application js 文件有什么好处 我有一个企业创建按钮 因此我应该将代码放入 create js erb 文件中 还是使用以下方法将其放
  • 如何让我的导航栏出现在 Rails 应用程序的每个页面上?

    目前 我的导航栏位于我的index htm erb 文件中 目前仅在主页上显示 我想知道为了让导航栏出现在我的应用程序的每一页上 必须采取哪些必要步骤 我的导航栏的代码如下所示
  • Ruby 元编程,RSpec 的“应该”如何工作?

    我正在阅读 RSpec 并试图弄清楚 RSpec 的 应该 是如何实现的 有人可以帮忙解释一下这个函数的元性质是如何工作的吗 代码位于此处 http github com dchelimsky rspec blob master lib s
  • ruby 调试和黄瓜

    我在 Cucumber 中遇到了失败的情况 我想使用 ruby debug 来调试我的 Rails 控制器 但是 如果我将 调试器 添加到我想要中断的位置 它就不会停止 我尝试将 ruby debug 和 ruby gems 的 requi

随机推荐

  • C# 通用继承解决方法

    Example 我想要几个从 TextBox 或 RichTextBox 派生的专用文本框 它们都从 TextBoxBase 派生 class CommonFeatures
  • 删除标签并仅在条形图的工具提示中显示值

    我在用ChartJS http www chartjs org docs 用于创建图表的库 在工具提示中 我显示了我创建的数据集中的数据值 它适用于图表类型为doughnut 否则它不起作用 以防万一或bar or 水平条 charts 无
  • 从 CGImage 获取 RGB 像素数据

    我正在尝试从 CGImage 访问像素数据 我希望能够以整数形式访问 RGB 值 我想我已经接近这个代码了 UIImage theImage UIImage imageNamed rgb png CGImageRef cgImageRef
  • 多维缩放后如何获取特征值?

    我有兴趣查看执行多维缩放后的特征值 什么函数可以做到这一点 我看了看文档 http scikit learn org stable modules generated sklearn manifold MDS html sklearn ma
  • Qt Webengine 渲染到打印

    有没有办法使用 QtWebEngine 将 HTML SVG 渲染到打印机 PDF 和光栅图像 我们想从WebKit切换到WebEngine 因此使用WebKit的QWebView不再是一个选择 宣布 Qt Web Engine 将支持打印
  • 如何解决具有 3 个变量的背包问题?

    解决与背包问题相关的问题的最佳方法是什么 该问题有 3 个变量 例如 价值 重量和体积 尽可能的最大值 有最大重量和体积限制 我尝试过根据其值 重量 体积 使用定义的索引 但我相信这不会给我最好的解决方案 所以我进行了搜索 有些人建议使用动
  • Haskell 类似实例?

    我是 Haskell 的新手 所以我的问题可能很愚蠢 我想要一个功能 show2 Show a gt a gt String 这会返回show a对于任何a but a如果 a 是它本身String 我该如何实施 附 如果这个函数已经在某个
  • 用汇编语言更改 CS:IP

    怎么可以强行改变CS and IP都是汇编语言 ORG指令可用于更改的数量IP 但是你如何改变CS 基本上我想使用汇编来实现多线程 许多论坛 包括堆栈溢出中的一个问题都说这是不可能的 但是即使 C 是由汇编代码制成的 它如何具有多线程选项呢
  • Spring中列表到页面的转换

    我正在尝试在春季将列表转换为页面 我已经使用它进行了转换 new PageImpl 用户 可分页 users size 但现在我在排序和分页本身方面遇到了问题 当我尝试传递大小和页面时 分页不起作用 这是我正在使用的代码 我的控制器 pub
  • CSS:将父级更改为子级的焦点

    假设你有类似的东西 div class parent div
  • 确定任务是否在外部 build.gradle 文件中定义

    我有一个在运行时创建的 gradle 任务 用于调用另一个任务 myOtherTask 该任务位于单独的 gradle 文件中 问题是如果其他任务不存在 则会抛出异常 在尝试调用任务之前 是否可以检查外部 gradle 文件中是否存在该任务
  • Youtube API:评论插入403禁止权限不足

    我正在使用底部的 API 资源管理器https developers google com youtube v3 docs commentThreads insert https developers google com youtube
  • React-native视图按内部文本自动调整宽度

    据我所知 react native 样式表不支持 min width max width 属性 我里面有一个视图和文本 自动宽度的视图不会通过继承文本元素调整大小 如何解决该问题并使用文本宽度自动设置视图宽度 我的代码是
  • 如何将多个 SHA1 指纹添加到我的 Android 应用程序中进行测试?

    我的 Android 应用程序已经在 Google 开发者控制台上有另一个开发者不久前生成的 SHA1 指纹 现在 我正在应用程序中调试 Google 登录错误 结果发现 Google 登录使用在中找到的默认 SHA 1 android d
  • iTunesConnect - 自动下载应用程序的使用情况分析

    iTunes 连接 https itunesconnect apple com的应用程序分析页面有两个部分 销售和使用情况 对于第一部分 他们有自动摄取工具 https www apple com itunesnews docs AppSt
  • 在 Swift 3 中使用 -observeValueForKeyPath:ofObject:change:context:

    我正在尝试将 Swift 2 2 项目转换为 Swift 3 但收到以下错误 Method observeValue forKeyPath ofObject change context with Objective C selector
  • 将人类友好的日期转换为毫秒[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何将人类友好的日期转换为自 UNI
  • 如何在 Linux 中获取“文件创建时间”

    我需要找出在 Linux 中使用 C 创建文件的时间和日期 如何获取文件的最后修改日期 http www jb man ac uk slowe cpp lastmod html struct stat attrib 1 create a f
  • 在特定时间过后自动更改 WooCommerce 订单状态?

    有没有办法让 WooCommerce 在经过这么长时间后自动将自定义订单状态更改为不同的自定义订单状态 基本上 我希望所有订单状态更改为 退款已提交 的订单在 30 天后自动更改为 退款已过期 我意识到这些不是正常的 WooCommerce
  • Google OAuth 访问令牌

    我对 OAuth 和 Google 感到很困惑 我花了很长时间才获得刷新令牌来创建新的访问令牌 然后发现refresh token也过期了 这有什么意义啊 我需要做的就是保留一个有效的 access token 以供使用legato htt