Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 无法在Rails应用程序中刷新Google API令牌_Ruby On Rails_Google Calendar Api - Fatal编程技术网

Ruby on rails 无法在Rails应用程序中刷新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)

我正试图在我的Rails5.2.1应用程序中使用Google日历API,但我对刷新标记的理解存在实际问题,即使在阅读了相当多的文档之后,我对刷新标记的理解也很模糊

这是我的密码:

          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我做了您建议的改进,但仍然得到相同的错误。我不太理解“刷新”部分,如果令牌自动刷新,它过期有什么意义?。如果导航到我的主页时,应用程序只是重定向到授权,我会很高兴,如果我在上面的代码中尝试了一个错误,但我只是得到了缺少授权令牌的错误