当前位置: 首页 > 知识库问答 >
问题:

如何使用Google API进行离线访问

谷弘致
2023-03-14

我正在尝试使用Google API获得<code>离线访问</code>。我必须从谷歌日历中提取数据,而无需用户每次登录。

我已将以下内容添加到我的 Gem 文件中:

gem“谷歌api客户端”~

...并将其添加到我的控制器中:

require 'google/api_client/client_secrets'
class Api::V1::CalendarAccountsController < Api::V1::BaseController
...

在我的行动中:

client_secrets = Google::APIClient::ClientSecrets.load(
  File.join(
    Rails.root,
    'config',
    'client_secrets.json')
  )

@auth_client = client_secrets.to_authorization

@auth_client.update!(
    :scope => 'https://www.googleapis.com/auth/calendar.readonly',
    :redirect_uri => '/{callback URL}',

    :additional_parameters => {
      "access_type" => "offline",
      "include_granted_scopes" => "true"
    }
)
redirect_to @auth_client.authorization_uri.to_s

问题是——即使我将“access_type”指定为“offline ”,我仍然没有在Google privileges列表中被要求离线访问权限(我在下面附上一个screenie)。

这是我调用<code>时生成的URL@auth_client.authorization_uri.to_s

https://accounts.google.com/o/oauth2/auth?access_type=offline

我错过什么了吗?

共有2个答案

孙福
2023-03-14

尝试添加此代码。如果您的应用程序需要离线访问Google API,请将API客户端的访问类型设置为离线:

auth_client.update!(
  :additional_parameters => {"access_type" => "offline"}
)

在用户授权对所请求的范围进行离线访问之后,当用户离线时,您可以继续使用API客户端代表用户访问Google APIs。客户端对象将根据需要刷新访问令牌。

还可以使用Google客户端库,这将帮助您刷新访问令牌(离线访问)。

希望这有帮助。

权黎昕
2023-03-14

您可以尝试使用以下内容:

client = Signet::OAuth2::Client.new({
  client_id: your_client_id,
  client_secret: your_secret_id,
  authorization_uri: 'https://accounts.google.com/o/oauth2/auth',
  scope: Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY,
  redirect_uri: your_callback_url
})

client.update!(
  additional_parameters: {
    access_type: 'offline',
    prompt: 'consent'
  }
)

redirect_to client.authorization_uri.to_s

请注意,我使用的是谷歌-api-客户端 Gem 的较新版本,按以下方式配置:

gem 'google-api-client', '~> 0.11', require: 'google/apis/calendar_v3'

这样,Google将请求您允许与Calendar API交互,并正确设置access_type参数,以授予您对相同API的离线访问权限。

方法将在每次调用代码时提示用户进行授权。如果你想防止这种情况,你必须这样改变它:

client.update!(
  additional_parameters: {
    access_type: 'offline'
  }
)

如果您已经在没有< code > access _ type:' offline ' 参数的情况下授权了您的应用程序,Google将在没有离线许可的情况下授予您一个身份验证令牌。要重置这种情况,只需进入您的Google个人资料权限并撤销您的应用程序先前的授权即可。然后再试一次。

(注意:< code>signet gem是< code>googleauth的一个依赖项,而googleauth又是< code>google-api-client的一个依赖项,因此您可以免费获得这些代码,而无需向< code>Gemfile添加更多gem)

 类似资料:
  • 问题内容: Maven是否需要在某个时候连接到互联网才能使用它?意味着专门获取用于编译,清洁,包装等的内部Maven插件? 问题答案: 你可以在脱机模式下运行。当然,本地存储库中不可用的任何工件都将失败。Maven并非基于分布式存储库,但是它们肯定会使事情变得更加无缝。因此,许多商店使用内部镜像,这些镜像与中央存储库逐渐同步。 另外,在开始脱机工作之前,可以使用来确保已在本地安装所有依赖项。

  • 问题内容: 我有一个直接依赖RestTemplate的类。我希望我可以离线进行JUnit测试。 如何在单元测试中模拟RestTemplate? 问题答案: 我建议重构您的客户端代码,以 消除 对的直接依赖,并用对的引用替换它,该引用是由实现的。和您应该编码的那个。 然后,您可以在代码中插入存根或模拟对象以进行单元测试,并在将其用于实际时注入。

  • 问题内容: 我想知道我需要做什么才能访问数据库线程安全。 这是我的Entity类: 这是DbService类: 这是与DbService一起使用的类: 使 add() , delete() , update() 和 getAll() 方法同步是否足够? 是否可以像在源代码中那样创建DbService的多个实例?还是只需要创建一个实例? 也许我应该使用单例设计模式?还是使DbService静态所有方

  • 我想用gradle编译一个vertx项目。我想把它编译成一个独立的jar,我读到这可以通过gradle的shadow插件实现。 现在,我需要能够在离线环境中做到这一点。我下载了插件的源代码并将其编译成一个jar。现在,我想在我的项目中应用该jar中的插件build.gradle.我不知道如何做到这一点。 我知道这些答案,但似乎都不起作用。 目前,我有: 当我运行“gradle build”时,我得

  • 问题内容: 我正在尝试使用Java中的Selenium来获取用户的地理坐标,但是使用IP地址不够准确,因此我想使用该网站http://www.whataremycoordinates.com/,但是它无法正常工作,我猜这是因为您必须允许位置使用,所以无论如何我都可以在Selenium中使用位置使用,或者也许可以通过其他方法来获取确切的地理坐标 问题答案: 通常,当站点想要获取此类数据时,浏览器会询

  • 问题内容: 我尝试了redis的DUMP命令,重定向到文件(或管道),但是RESTORE报告此错误: 我知道MIGRATE可以在线执行此操作,但是MIGRATE也会从原始服务器中删除该密钥,并且我不希望我的Redis暴露于公共互联网中。 有一些第三方选件,Redis的-RDB的工具,例如,但毕竟,究竟如何做和工作? 问题答案: 实际上,转储/还原命令不是为从命令行使用而设计的,因为序列化格式是二进