omniauth_callbacks_controller.rb 1.29 KB
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def github
    github_login = request.env["omniauth.auth"].extra.raw_info.login
    github_token = request.env["omniauth.auth"].credentials.token
    github_user  = User.where(:github_login => github_login).first

    # If user is already signed in, link github details to their account
    if current_user
      # ... unless a user is already registered with same github login
      if github_user && github_user != current_user
        flash[:error] = "User already registered with Github login '#{github_login}'"
        redirect_to user_path(current_user)
      else
        # Add github details to current user
        current_user.update_attributes(
          :github_login       => github_login,
          :github_oauth_token => github_token
        )
        flash[:success] = "Successfully linked Github account!"
        redirect_to user_path(current_user)
      end

    elsif github_user
      # Store OAuth token
      @user.update_attribute :github_oauth_token, request.env["omniauth.auth"].credentials.token

      flash[:success] = I18n.t "devise.omniauth_callbacks.success", :kind => "Github"
      sign_in_and_redirect @user, :event => :authentication
    else
      redirect_to new_user_session_path
    end
  end
end