Michael Lazuardy
Joined
60 Experience
0 Lessons Completed
0 Questions Solved
Activity
no sir, i use Relationship between User and Identity, and the Identity will handle the user provider and uid,
already set up my devise.rb and env too
already set up my devise.rb and env too
Im Trying to make Oauth using multi model, User and Identity.
i setup the one to many Relationship between User and Identity and write some code for each model like this
user.rb
i setup the one to many Relationship between User and Identity and write some code for each model like this
user.rb
class User < ApplicationRecord has_many :articles has_many :identities # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable validates_presence_of :name def facebook identities.where( :provider => "facebook").first end def facebook_client @facebook_client ||= Facebook.client(access_token: facebook.accesstoken) end end
identity.rb
class User < ApplicationRecord has_many :articles has_many :identities # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable validates_presence_of :name def facebook identities.where( :provider => "facebook").first end def facebook_client @facebook_client ||= Facebook.client(access_token: facebook.accesstoken) end end
making omniauth_callback in controllers/users/omniauth_callbacks_controller
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController def facebook generic_callback('facebook') end def generic_callback(provider) @identity = Identity.find_for_oauth env["omniauth.auth"] @user = @identity.user || User.find_by(email: @identity.email) || current_user if @user.nil? @user = User.create(email: @identity.email || "") @identity.update_attribute(:user_id, @user.id) end if @user.email.blank? && @identity.email @user.update_attribute(:email, @identity.email) end if @user.persisted? @identity.update_attribute(:user_id , @user.id) @user = User.find @user.id sign_in_and_redirect @user,event: :authentication else session["devise.#{provider}_data"] = env["omniauth.auth"] redirect_to new_user_registration_url end end def upgrade scope = nil if params[:provider] == "google_oauth2" scope = "email,profile,offline,https://www.googleapis.com/auth/admin.directory.user" end redirect_to user_omniauth_authorize_path( params[:provider] ), flash: { scope: scope } end def setup request.env['omniauth.strategy'].options['scope'] = flash[:scope] || request.env['omniauth.strategy'].options['scope'] render :text => "Setup complete.", :status => 404 end end
and everything i set up correctly, until i hit the button for login with facebook, it return to my login page again but not save the session and also not save the data too like uid and provider. what's wrong with my code ? im new in ruby on rails. please help me and sorry my bad english