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
endidentity.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
endmaking 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
endand 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