Rails-Facebook avec Omniauth et Koala: Comment renouveler un token expiré

j'ai une application où les utilisateurs peuvent lier leurs comptes Facebook. Ils peuvent se connecter en utilisant leur email, mais ils peuvent lier leur compte Facebook.

Dans la vue où je montre liés réseaux sociaux (Facebook et autres), j'ai quelque chose comme ceci:

<%= image_tag @facebook.get_facebook_picture %>

ceci appellera une méthode d'instance comme ceci:

def get_facebook_picture
    unless self.token.nil?
      facebook_graph = Koala::Facebook::GraphAPI.new(self.token)
      fb_picture = facebook_graph.get_picture("me", { :type => "small" })
    end
end

cela fonctionnera bien à moins que le token Facebook que j'ai stocké dans ma base de données ne soit expiré. J'ai donc ajouté cette exception gestionnaire de contrôleur:

def facebook_exception_handler exception
    if exception.fb_error_type.eql? 'OAuthException'
      # Let's get a new auth token... How?
    else
      logger.debug "Damn it. We don't know what error is coming from FB"
      raise exception
    end
end

j'attrape l'exception correctement, mais je ne vois pas comment aurais-je renouveler le jeton d'accès que j'ai dans ma base de données. Notez que le jeton d'accès que j'ai été inséré en utilisant OmniAuth. Donc ma question est:

étant donné que j'ai un OAuthException, Comment puis-je renouveler le token d'accès d'un utilisateur particulier (UID) en utilisant Omniauth?

8
demandé sur Nobita 2012-04-17 04:35:24

2 réponses

le cas simple est que vous réauthorisez l'utilisateur avec FB, exactement comme vous les avez autorisés en premier lieu. Pour obtenir le token en premier lieu, je suppose que vous utilisez omniauth (et onmiauth-facebook) pour vous authentifier contre FB. Cela signifie que vous avez une route et une action de controller pour gérer le rappel auth, et une fonction qui insère le jeton dans le db.

le jeton d'accès que vous avez obtenu à l'origine avec omniauth peut devenir invalide pour diverses raisons-expiration, ou parce que l'Utilisateur a changé son mot de passe FB, et peut-être d'autres. Dans ces cas, un autre appel de OAuth retournera un token valide. Il suffit de rappeler (comme vous l'avez fait lorsque vous avez autorisé l'utilisateur pour la première fois) et de remplacer le token invalide par le nouveau, dans votre base de données, et vous êtes bon.

Ce gist (ma propre réponse une question que j'ai posée ici) a un code couvrant, mais il semble que vous avez déjà eu ce couvert. Enregistrer assez d'État pour ensuite ré-essayer ce qui a déclenché l'exception et tu es bon.

il est aussi possible que le token soit maintenant invalide parce que l'Utilisateur a changé les paramètres de son application FB pour dé-autoriser votre application. Dans ce cas, l'utilisateur verra le dialogue de permissions FB Comme s'il s'agissait d'un nouvel utilisateur s'authentifiant contre FB pour la première fois. ( FB)

cela Fait-il sens?

9
répondu Steve Bourne 2017-05-23 11:45:39

Vous pouvez changer la connexion du tutoriel koala RailsCasts avec ceci:

def facebook
  if self.facebook_expires_at < Time.now
    oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"])
    new_access_info = oauth.exchange_access_token_info self.facebook_token

    new_access_token = new_access_info["access_token"]
    new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds

    self.update_attributes!(:facebook_token => new_access_token,
                            :facebook_expires_at => new_access_expires_at )
  end
  @facebook ||= Koala::Facebook::API.new(self.facebook_token)
  block_given? ? yield(@facebook) : @facebook

  rescue Koala::Facebook::APIError => e
    logger.info e.to_s
    nil
end
2
répondu utiq 2014-01-24 04:56:40