skipping email confirmation for omniauth users using devise
Asked Answered
C

2

16

I have a bit of code here where users can login via their twitter account. the problem here is, how can i skip email confirmation for user the sign up from external services like twitter. i am using devise and i do not know how to skip the email confirmation for this type of users. my code sample is as follows

class AuthenticationsController < ApplicationController
  # GET /authentications
  # GET /authentications.json
  def index
    @authentications = current_user.authentications if current_user
  end

  # POST /authentications
  # POST /authentications.json
  def create
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      flash[:notice] = "Signed in successfully"
     sign_in_and_redirect(:user, authentication.user)
    elsif current_user
    current_user.authentications.create!(:provider => omniauth['provider'], :uid => ['uid'])
    flash[:notice] = "Authentication successful"
    redirect_to authentication_url
    else
      user = User.new
      user.apply_omniauth(omniauth)
     if user.save
      flash[:notice] = "Signed in successfully"
      sign_in_and_redirect(:user, user)
     else
      session[:omniauth] = omniauth.except('extra')
      redirect_to new_user_registration_url
     end
    end
  rescue Exception => e
    # Just spit out the error message and a backtrace.
    render :text => "<html><body><pre>" + e.to_s + "</pre><hr /><pre>" + e.backtrace.join("\n") + "</pre></body></html>"

  end


  # DELETE /authentications/1
  # DELETE /authentications/1.json
  def destroy
    @authentication = current_user.authentications.find(params[:id])
    @authentication.destroy

    respond_to do |format|
      format.html { redirect_to authentications_url }
      format.json { head :ok }
    end
  end
end

my registration controller is as follows

class RegistrationsController < Devise::RegistrationsController

  def create
    super
    session[:omniauth] = nil unless @user.new_record?
  end

  private
  def build_resource(*args)
    super
    if session[:omniauth]
      @user.apply_omniauth(session[:omniauth])
      @user.valid?
    end
  end
end

and my user model is below

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable,  :lockable, :timeoutable and
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable


  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :about, :facebook_username, :twitter_username, :icon, :admin

  validates_uniqueness_of :username

  has_attached_file :icon, :styles => {:thumb => "64x64#"}, :default_url => 'icon_:style.png'
  validates_attachment_content_type :icon, :content_type => ['image/jpeg', 'image/png', 'image/gif']
  validates_attachment_size :icon, :less_than => 1.megabyte
  ajaxful_rater
  has_many :authentications
  validates_presence_of :username

  def apply_omniauth(omniauth)
    self.email = omniauth['user_info']['email'] if email.blank?
    self.name = omniauth['user_info']['name'] if name.blank?
    self.image = omniauth['user_info']['image'] if image.blank?
    authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid'])
  end

  def password_required?
    (authentications.empty? || !password.blank?) && super
  end

end

my like to the auth url is below

<a href="/auth/twitter" class="auth_provider">
  <%= image_tag "twitter_64.png", :size => "64x64", :alt => "Twitter" %>
</a>

my routh is like this

 match 'auth/:provider/callback' => "authentications#create"
Chatter answered 20/9, 2011 at 18:24 Comment(0)
P
38

Whenever you want to skip confirmation for Devise period, just use the following before the user.save...

user.skip_confirmation! 

So basically, in your create controller action, if it detects omniauth logic, then call that.

Pratincole answered 20/9, 2011 at 18:53 Comment(2)
thank for this tip. i dont know if you can help every time i sign up from the external service it does not save the email and instead an error message saying email cannot be blank. is the external service email not ment to to be saved with the new userChatter
Twitter does not provide you with a user's email adress so you will need to ask them to supply that separately.Ithnan
R
1

This could be achieved by setting the confirmed_at attribute, which Devise sets internally to mark an account as confirmed:

  user.update(
    confirmed_at: Time.now.utc,
    confirmation_token: nil
  )
Rexanne answered 27/6, 2016 at 22:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.