[AI] Setting up omni-auth in rails
Tags: ruby, rails, programming, tutorial
Published: 2022-12-11 02:36:08

Read [this](https://dev.to/aneshodza/i-let-chatgpt-loose-on-devto-here-are-the-results-194p) article to understand why the title has the [AI] at the start.
## Setting up OmniAuth with Devise in Rails

OmniAuth is a popular gem for enabling social login in Rails applications. It allows users to log in to your app using their existing accounts on third-party providers such as Google, Facebook, and Twitter. In this tutorial, we will show you how to set up OmniAuth in a Rails app using the Devise gem for authentication.

### Step 1: Install the necessary gems
First, make sure you have the devise and omniauth gems installed in your Rails application. You can add these lines to your Gemfile:
```ruby
gem 'devise'
gem 'omniauth'
```
Then run `bundle install` to install the gems.

### Step 2: Run the Devise and Omniauth generators
Next, we need to run the Devise and Omniauth generators to create the necessary configuration files and models. You can do this with the following commands:
```ruby
rails generate devise:install
rails generate omniauth:install
```
These commands will create the `config/initializers/devise.rb` and `config/initializers/omniauth.rb` files, among others.

### Step 3: Add the OmniAuth providers
Now we need to add the `OmniAuth` providers that we want to use in our application. For example, if we want to add Google and Facebook login, we would add these lines to the `config/initializers/omniauth.rb` file:
```ruby
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET
  provider :facebook, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET
end
```
Make sure to replace `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `FACEBOOK_APP_ID`, and `FACEBOOK_APP_SECRET` with the appropriate keys and secrets for your application, which you can obtain from the Google and Facebook developer portals.

### Step 4: Enable Omniauthable in the User model
Next, we need to add the :omniauthable module to the User model to enable social login. Assuming you are using Devise's default User model, you can do this by adding the following line to the `app/models/user.rb` file:
```ruby
devise :omniauthable, omniauth_providers: [:google_oauth2, :facebook]
```
This will enable social login for the Google and Facebook providers that we added in the previous step.

### Step 5: Create a callback controller
Finally, we need to create a callback controller to handle the response from the OmniAuth provider. This is where we will process the response and create a new user if necessary. You can create a new controller with the following command:
```bash
rails generate controller users/omniauth_callbacks
```

### Step 6: Process the response from the OmniAuth provider
In the callback controller, add a method for each OmniAuth provider you are using. For example, to add support for Google and Facebook, you would add these methods:
```ruby
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
    # Process the response from the Google OmniAuth provider
  end

  def facebook
    # Process the response from the Facebook OmniAuth provider
  end
end
```
In each callback method, you will need to process the response from the OmniAuth provider and create a new user if necessary. Here is an example of how you might do this for the Google OmniAuth provider:
```ruby
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
    # Get the user's information from the response
    info = request.env['omniauth.auth'].info

    # Find or create the user
    user = User.where(email: info['email']).first_or_initialize(
      email: info['email'],
      name: info['name'],
      password: Devise.friendly_token[0, 20]
    )

    # Sign in the user
    sign_in_and_redirect user, event: :authentication
  end
end
```
This code will get the user's information from the response, find or create the user in the database, and then sign in the user. You can adapt this code for the other OmniAuth providers as needed.

And that's it! You should now have social login working in your Rails application using Devise and OmniAuth. Happy hacking :)