La situation: p>
Utilisation des rails 3 et Omniauth, j'ai une application qui authentifie à l'aide de la stratégie Facebook. Cette application a été conçue pour fonctionner de manière égale aux interfaces Web et mobiles (ALA JQuery-Mobile). P>
Le défi consiste à obtenir Omniauth pour fournir la version mobile de l'écran de connexion de Facebook sur les périphériques mobiles et la version Web aux périphériques de bureau. P>
J'ai piraté une solution que je vais mettre comme réponse. P>
5 Réponses :
Ma solution est assez impliquée et nécessite à la fois la modification de la stratégie sur Facebook Omniauth et l'ajout de middleware de rack.
Premier, j'ai ajouté un attribut de classe et modifié une méthode à Omniauth :: Stratégies: Facebook (je l'ai mis à la fin de mon fichier de configuration omniauth.rb, mais il appartient dans le répertoire lib liberté): p> second, j'ai ajouté un morceau de middleware de rack pour déterminer si la demande était d'un mobile périphérique, puis réglez l'affichage en conséquence: p> et enfin, j'ai ajouté le middleware rack à mon config.ru: p>
Fantastique :) Ce que je cherchais.
En fait, depuis omniauth :: Les stratégies sont déjà middleware de rack, c'est encore plus simple. Il suffit de remplacer la méthode request_phase et de vérifier la variable d'instance @env présente dans la stratégie d'un utilisateur mobile_agent:
Très bel evan - merci de me montrer comment rendre cela encore meilleur!
J'ai essayé la première solution mais je ne pouvais pas le faire fonctionner. Après de nombreuses recherches, j'ai découvert que Omniauth a une option ": setup => true" qui permet de définir dynamique d'arguments, tels que l'option: l'affichage nécessaire pour Facebook OAuth.
Pour d'abord, activez l'option: Configuration. p> ajoutez un deuxième itinéraire (itinéraire de configuration): p> Ajouter ce contrôleur. Vous pourriez déjà l'avoir si vous avez suivi le manuel du développement. P> def mobile_device?
if session[:mobile_param]
session[:mobile_param] == "1"
else
request.user_agent =~ /Mobile|webOS/
end
end
La réponse approuvée fonctionne, sauf que je devais changer une ligne. Pour la version actuelle de Omniauth-Facebook, j'ai dû définir l'option d'affichage, comme celle-ci: Vous pouvez utiliser "popup", "toucher" ou "page" de ce que je ' J'ai trouvé. p> p>
Pour le développement moderne / Omniauth (> = 1.0) Utilisez-le dans votre configuration / Initializers / Devise.RB:
FACEBOOK_SETUP_PROC = lambda do |env| request = Rack::Request.new(env) mobile_device = request.user_agent =~ /Mobile|webOS/i request.env['omniauth.strategy'].options[:display] = mobile_device ? "touch" : "page" end config.omniauth :facebook, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET, :scope => 'email,offline_access', :setup => FACEBOOK_SETUP_PROC, :client_options => { :ssl => { :ca_file => Rails.root.join("config/ca-bundle.crt").to_s }}
Existe-t-il un bug orthiauteur / problème pour cela?