2017-06-13 1 views
0

J'ai parcouru ces pages pendant des semaines à la recherche d'une réponse. Je suis un novice à Ruby, j'ai suivi un tutoriel et a été en mesure de le compléter avec succès avec peu d'histoires. Mon problème est quand j'ai décidé d'ajouter plus de fonctionnalités à mon application en authentifiant les utilisateurs avec Facebook en utilisant la gemme Omniauth en plus de la gemme de conception qui fonctionne parfaitement. Je sais presque que la solution sera simple pour l'œil exercé, mais je suis à court d'idées puisque j'ai essayé de nombreuses suggestions sur ce site et d'autres avec plus ou moins de succès.Issue with Facebook Omniauth, concevoir avec Ruby on Rails

Mon problème actuel est lorsqu'un utilisateur essaie de se connecter en utilisant Facebook, l'utilisateur est authentifié mais est redirigé vers la page d'inscription. J'ai joué un peu la semaine dernière et j'ai réussi à me connecter mais juste une fois et j'ai continué à être redirigé vers la page d'inscription par la suite.

Mon scénario requis est donc:

Si un utilisateur clique sur le signe avec lien Facebook, ils devraient être redirigé vers Facebook pour l'authentification, puis renvoyé à mon application Ruby et les valeurs pour le courrier électronique, prenom, last_name doit être ajouté à la table User pour cet utilisateur.

Pour un utilisateur qui revient, Toutes les valeurs de la base de données doivent être vérifiées et l'utilisateur est connecté automatiquement sans trop de bruit.

Je voudrais également une contrainte unique d'email pour s'assurer que nous n'avons pas plusieurs personnes avec le même email. J'apprécierais vraiment une certaine direction quant à où je me trompe .. Comme je l'ai mentionné ci-dessus, je suis un greenhorn total dans cet espace car je travaille principalement avec l'infrastructure informatique.

S'il vous plaît voir mon code ci-dessous:

callbacks_controller.rb

class CallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    # You need to implement the method below in your model (e.g. 
    app/models/user.rb) 
@user = User.from_omniauth(request.env["omniauth.auth"]) 

if @user.persisted? 
    sign_in_and_redirect @user, :event => :authentication #this will throw if 
@user is not activated 
    set_flash_message(:notice, :success, :kind => "Facebook") if 
is_navigational_format? 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_user_registration_url 
    end 
end 

def failure 
    redirect_to root_path 
end 

échec def redirect_to de root_path fin fin

user.rb

class User < ApplicationRecord 
# Include default devise modules. Others available are: 
# :confirmable, :lockable, :timeoutable and :omniauthable 
devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable 
has_many :reviews, dependent: :destroy 

#validates :first_name, :last_name, presence: true 
devise :omniauthable, :omniauth_providers => [:facebook] 


def self.from_omniauth(auth) 
    where(email: auth.info.email).first_or_initialize.tap do |user| 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[6,20] 
    user.first_name = auth.info.first_name 
    user.last_name = auth.info.last_name 
    user.save 
    end 


    end 

    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
    if data = session["devise.facebook_data"] && session["devise.facebook_data"] 
    ["extra"]["raw_info"] 
    user.email = data["email"] if user.email.blank? 
    user.first_name = data["first_name"] if user.first_name.blank? 
    user.last_name = data["last_name"] if user.last_name.blank? 
    end 
    end 
    end 

routes.r b

Rails.application.routes.draw do 

    devise_for :users, :controllers => { :omniauth_callbacks => "callbacks"} 
    resources :hospitals do 
    collection do 
    get 'search' 
    end 
    resources :reviews, except: [:show, :index] 
    end 



    get 'pages/Hospitals' 

    get 'pages/Labs' 

    get 'pages/Doctors' 

    get 'pages/about' 

    get 'pages/contact' 

    root'hospitals#index' 



    # For details on the DSL available within this file, see 
    http://guides.rubyonrails.org/routing.html 
    end 

Réponse Console

Started GET "https://stackoverflow.com/users/auth/facebook" for ::1 at 2017-06-13 14:02:29 +0100 
I, [2017-06-13T14:02:29.142018 #8385] INFO -- omniauth: (facebook) Request 
phase initiated. 
Started GET "https://stackoverflow.com/users/auth/facebook" for ::1 at 2017-06-13 14:02:29 +0100 
I, [2017-06-13T14:02:29.488425 #8385] INFO -- omniauth: (facebook) Request 
phase initiated. 
Started GET "https://stackoverflow.com/users/auth/facebook/callback 
code=AQAJ33qxsDJhSh2fKc8YH9YANZwK2BagO3fotR22iw3 
cOeTN5G2HSvXbOioiwaQmwrZB3EEZKZBWlBAK4c 
RVyddoG8oaeLQfEXjA0FPOvZtpw0XiuBGwOJIh7YaDSjt7O33Dn2mB7Vlu2YUaT- 
DxlY3ioOVhNx8ymCE6TMGJx0slL-NvMB8b52IHSheMvPYTcMAoj2WXPgrLK8aH0eox_ 
7VbD8zaV0QFeJxqask3gaU4GTkGI50liO2SdF 
T9fyFVWTgfORNP0yhwoH3HNlMGIznqSqbRGB43d 
2qULNHglH6exDMCzgpyhD3Bmi2lxzcLc10" 
    for ::1 at 2017-06-13 14:02:29 +0100 
I, [2017-06-13T14:02:29.731093 #8385] INFO -- omniauth: (facebook) Callback 
phase initiated. 
Processing by CallbacksController#facebook as HTML 
Parameters: 
{"code"=>"AQAJ33qxsDJhSh2fKc8YH9YANZwK2BagO3 
fotR22iw3cOeTN5G2HSvXbOioiwaQmwrZB3EEZK 
ZBWlBAK4cRVyddoG8oaeLQfEXjA0FPOvZtpw0XiuBGwOJIh7YaDSjt7O33Dn2mB7Vlu2YUaT- 
DxlY3ioOVhNx8ymCE6TMGJx0slL- 
NvMB8b52IHSheMvPYTcMAoj2WXPgrLK8aH0eox_ 
7VbD8zaV0QFeJxqask3gaU4GTkGI50liO2SdFT9fy 
FVWTgfORNP0yhwoH3HNlMGIznqSqbRGB43d2qULNHglH6exDMCzgpyhD3Bmi2lxzcLc10"} 
    User Load (0.3ms) SELECT "users".* 
    FROM "users" WHERE "users"."email" IS NULL 
    ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]] 
    (0.2ms) begin transaction 
    (0.1ms) rollback transaction 
    Redirected to http://localhost:3000/users/sign_up 
    Completed 302 Found in 265ms (ActiveRecord: 0.6ms) 

nouvelle réponse Console

User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."provider" = ? 
    AND 
    "users"."uid" = ? ORDER BY "users"."id" ASC LIMIT ? [["provider", 
    "facebook"], ["uid", "104903843446146"], ["LIMIT", 1]] (0.1ms) begin 
    transaction (0.1ms) rollback transaction Redirected to 
    localhost:3000/users/sign_up 

Répondre

0

Essayez ci-dessous le code:

def facebook 
    @user = User.from_omniauth(request.env["omniauth.auth"]) 
     if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
     else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
     end 
    end 
    end 

modèle

def self.from_omniauth(auth) 
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.email = auth.info.email 
     user.password = Devise.friendly_token[0,20] 
     end 
    end 
+0

J'ai juste essayé le code ci-dessus et ai eu la même réponse. –

+0

êtes-vous connecté après vous être connecté avec Facebook? – puneet18

+1

Non je ne suis pas. Il redirige simplement vers la page d'inscription. –