Ruby on rails 无法在Rails应用程序中刷新Google API令牌
我正试图在我的Rails5.2.1应用程序中使用Google日历API,但我对刷新标记的理解存在实际问题,即使在阅读了相当多的文档之后,我对刷新标记的理解也很模糊 这是我的密码:Ruby on rails 无法在Rails应用程序中刷新Google API令牌,ruby-on-rails,google-calendar-api,Ruby On Rails,Google Calendar Api,我正试图在我的Rails5.2.1应用程序中使用Google日历API,但我对刷新标记的理解存在实际问题,即使在阅读了相当多的文档之后,我对刷新标记的理解也很模糊 这是我的密码: class CalendarsController < ApplicationController def authorize client = Signet::OAuth2::Client.new(client_options)
class CalendarsController < ApplicationController
def authorize
client = Signet::OAuth2::Client.new(client_options)
redirect_to client.authorization_uri.to_s
end
def callback
client = Signet::OAuth2::Client.new(client_options)
client.code = params[:code]
response = client.fetch_access_token!
session[:authorization] = response
redirect_to root_url
end
def get_calendars
client = Signet::OAuth2::Client.new(client_options)
client.update!(session[:authorization])
client.update!(
additional_parameters: {
access_type: 'offline',
prompt: 'consent'
}
)
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = client
# here is my attempt to refresh
begin
service.list_calendar_lists
rescue Google::Apis::AuthorizationError
response = client.refresh!
session[:authorization] = session[:authorization].merge(response)
retry
end
end
def new
all_calendars = get_calendars.items
@calendar_list = all_calendars.select {|calendar| calendar.access_role=="owner"}
end
def client_options
{
client_id: Rails.application.credentials.web[:client_id],
client_secret: Rails.application.credentials.web[:client_secret],
authorization_uri: 'https://accounts.google.com/o/oauth2/auth?access_type=offline&prompt=consent',
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
scope: Google::Apis::CalendarV3::AUTH_CALENDAR,
redirect_uri: callback_url
}
end
end
如果我转到导致授权的URL,我将被引导到OAuth屏幕并请求访问我的日历的权限。一旦授权,应用程序将按预期工作。一小时后,令牌过期,我无法刷新它。您可以在上面看到我的尝试:如果没有尝试,我会得到一个Google::API::AuthorizationError。有了它,我就得到了丢失的授权码。我完全迷路了,在阅读文档时遇到了困难。文档非常具有挑战性,错误消息也没有多大帮助 您没有显示正在传递的客户机选项,而且由于其他一切看起来都是正确的-我猜这就是问题所在。您是否为脱机访问设置了access_type参数,以便用户无需重新验证即可刷新令牌 从: 如果应用程序需要刷新access,请将该值设置为offline 当用户不在浏览器中时标记。这就是方法 刷新本文档后面介绍的访问令牌的方法。这 值指示Google授权服务器返回刷新 应用程序首次运行时的令牌和访问令牌 交换令牌的授权代码 您可以在授权uri中执行此操作。例如:
client = Signet::OAuth2::Client.new({
client_id: ...,
client_secret: ...,
authorization_uri: "https://accounts.google.com/o/oauth2/auth?access_type=offline&prompt=consent",
scope: Google::Apis::CalendarV3::AUTH_CALENDAR,
redirect_uri: callback_url
})
或者在调用更新时!:
文档非常具有挑战性,错误消息也没有多大帮助 您没有显示正在传递的客户机选项,而且由于其他一切看起来都是正确的-我猜这就是问题所在。您是否为脱机访问设置了access_type参数,以便用户无需重新验证即可刷新令牌 从: 如果应用程序需要刷新access,请将该值设置为offline 当用户不在浏览器中时标记。这就是方法 刷新本文档后面介绍的访问令牌的方法。这 值指示Google授权服务器返回刷新 应用程序首次运行时的令牌和访问令牌 交换令牌的授权代码 您可以在授权uri中执行此操作。例如:
client = Signet::OAuth2::Client.new({
client_id: ...,
client_secret: ...,
authorization_uri: "https://accounts.google.com/o/oauth2/auth?access_type=offline&prompt=consent",
scope: Google::Apis::CalendarV3::AUTH_CALENDAR,
redirect_uri: callback_url
})
或者在调用更新时!:
您能否将零件标记为脱机代码,因为它也在您引用的文档中。它还有助于区分状态和实际值。因为它只有两个字符的差异,我不能自己添加它。@gwcodes我做了您建议的改进,但仍然得到相同的错误。我不太理解“刷新”部分,如果令牌自动刷新,它过期有什么意义?。我很高兴当导航到我的主页时,如果我在上面的代码中尝试了一个错误,应用程序只是重定向到授权,但我只是得到了缺少的授权令牌错误。你可以将该部分标记为脱机代码,因为它也在你引用的文档中。它还有助于区分状态和实际值。因为它只有两个字符的差异,我不能自己添加它。@gwcodes我做了您建议的改进,但仍然得到相同的错误。我不太理解“刷新”部分,如果令牌自动刷新,它过期有什么意义?。如果导航到我的主页时,应用程序只是重定向到授权,我会很高兴,如果我在上面的代码中尝试了一个错误,但我只是得到了缺少授权令牌的错误