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

时间:2017-04-22 18:23:41

标签: ruby-on-rails oauth google-api google-calendar-api

我正在尝试使用Google API获取offline access。我必须在没有用户每次登录的情况下从Google日历中提取数据。

我已将此添加到我的Gemfile中:

gem 'google-api-client', '~> 0.9'

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

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”指定为“离线”,我仍然不会被问到对于Google特权列表中的离线访问权限(我在下面添加了一个屏幕)。

这是Google加载的页面(没有离线访问权限): Google privileges list with no offline-access request

这是我拨打@auth_client.authorization_uri.to_s

时生成的网址

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=[ID]&redirect_uri=[callback]&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly&from_login=1&as=-23788065e9c098d9&pli=1&authuser=0

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

希望这有帮助。

答案 1 :(得分:1)

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

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

请注意,我使用的是google-api-client 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'
  }
)

如果您已经在没有access_type: 'offline'参数的情况下授权了您的应用,Google将授予您一个没有离线许可的身份验证令牌。要重置此情况,只需进入your Google profile permissions并撤消先前的申请授权即可。然后再试一次。

(注意:signet gem是googleauth的依赖项,而google-api-client依赖于Gemfile,因此您可以免费获得此代码,而无需添加更多代码宝石到{{1}})