7
votes

Changement entre Web et toucher les interfaces sur Facebook Connectez-vous en utilisant Omniauth et Rails 3

La situation:

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).

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.

J'ai piraté une solution que je vais mettre comme réponse.


1 commentaires

Existe-t-il un bug orthiauteur / problème pour cela?


5 Réponses :


0
votes

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é): xxx

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: xxx

et enfin, j'ai ajouté le middleware rack à mon config.ru: xxx / p>


1 commentaires

Fantastique :) Ce que je cherchais.



5
votes

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: xxx


1 commentaires

Très bel evan - merci de me montrer comment rendre cela encore meilleur!



1
votes

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> xxx pré>

ajoutez un deuxième itinéraire (itinéraire de configuration): p> xxx pré>

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


0 commentaires

1
votes

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: xxx

Vous pouvez utiliser "popup", "toucher" ou "page" de ce que je ' J'ai trouvé.


0 commentaires

4
votes

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 }}


0 commentaires