我正在尝试使用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特权列表中的离线访问权限(我在下面添加了一个屏幕)。
这是我拨打@auth_client.authorization_uri.to_s
我错过了什么吗?
答案 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}})