Omniauth bietet diese Funktionalität nicht von Haus aus an, daher habe ich die vorherige Antwort und eine weitere SO-Antwort verwendet, um den Code in meinem Modell User.rb
zu schreiben.
def refresh_token_if_expired
if token_expired?
response = RestClient.post "#{ENV['DOMAIN']}oauth2/token", :grant_type => 'refresh_token', :refresh_token => self.refresh_token, :client_id => ENV['APP_ID'], :client_secret => ENV['APP_SECRET']
refreshhash = JSON.parse(response.body)
token_will_change!
expiresat_will_change!
self.token = refreshhash['access_token']
self.expiresat = DateTime.now + refreshhash["expires_in"].to_i.seconds
self.save
puts 'Gespeichert'
end
end
def token_expired?
expiry = Time.at(self.expiresat)
return true if expiry < Time.now # abgelaufener Token, daher sollten wir schnell zurückgeben
token_expires_at = expiry
save if changed?
false # Token nicht abgelaufen. :D
end
Und bevor Sie den API-Aufruf mit dem Zugriffstoken machen, können Sie die Methode so aufrufen, wobei current_user der angemeldete Benutzer ist.
current_user.refresh_token_if_expired
Stellen Sie sicher, dass Sie das rest-client Gem installieren und die require-Anweisung require 'rest-client'
in der Modelldatei hinzufügen. Die ENV['DOMAIN']
, ENV['APP_ID']
und ENV['APP_SECRET']
sind Umgebungsvariablen, die in config/environments/production.rb
(oder development) festgelegt werden können.