# Refreshes the current Access Token
#
# @return [AccessToken] a new AccessToken
# @note options should be carried over to the new AccessToken
def refresh!(params = {})
fail('A refresh_token is not available') unless refresh_token
params.merge!(:client_id => @client.id,
:client_secret => @client.secret,
:grant_type => 'refresh_token',
:refresh_token => refresh_token)
new_token = @client.get_token(params)
new_token.options = options
new_token.refresh_token = refresh_token unless new_token.refresh_token
new_token
end
# first argument is something called app, but not sure what but nil seems to be fine.
Strategies::MyStrategy.new(nil, *Devise.omniauth_configs[:mystrategy].args)
6条答案
按热度按时间ctehm74n1#
Omniauth不提供这种现成的功能,因此我使用了前面的答案和另一个SO答案在我的模型
User.rb
中编写代码在使用访问令牌进行API调用之前,您可以像下面这样调用方法,其中current_user是登录用户。
确保安装rest-client gem并在模型文件中添加require指令
require 'rest-client'
。ENV['DOMAIN']
、ENV['APP_ID']
和ENV['APP_SECRET']
是可以在config/environments/production.rb
(或开发)中设置的环境变量。vwhgwdsa2#
事实上,omniauth-oauth2 gem及其依赖项oauth2都内置了一些刷新逻辑。
请参阅https://github.com/intridea/oauth2/blob/master/lib/oauth2/access_token.rb#L80
而在www.example.com中https://github.com/intridea/omniauth-oauth2/blob/master/lib/omniauth/strategies/oauth2.rb#L74:
因此,您可能无法直接使用omniauth-oauth2执行此操作,但您肯定可以使用oauth2执行类似的操作:
vnjpjtjt3#
Eero的回答为我打开了一条解决这个问题的途径。我有一个关于我的类的助手,它为我提供了一个GmailService。作为这个过程的一部分,用户对象(包含google auth信息)会被检查是否过期。如果过期,它会在返回服务之前刷新。
nwo49xxi4#
这里有一些信息,太多了,无法一一列出here。这可能取决于您使用的提供程序,以及它们允许使用的
refresh-token
ndh0cuux5#
与其他答案类似,我采用了这种方法,其中使用了存储auth和刷新令牌的模型,从该逻辑中抽象出API交互。
请参阅https://stackoverflow.com/a/51041855/1392282
yc0p9oo06#
如果你使用devise,你可以创建一个新的策略,我猜如下,这样你就不需要到处重复客户端id和secret: