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
J'ai juste essayé le code ci-dessus et ai eu la même réponse. –
êtes-vous connecté après vous être connecté avec Facebook? – puneet18
Non je ne suis pas. Il redirige simplement vers la page d'inscription. –