12/08/2018, 14:19

Đăng nhập facebook, google trong rails

Tóm tắt Trong bài viết sẽ cung cấp các bước cơ bản để thực hiện đăng nhập vào trang web của bạn thông qua facebook. 1. Create a New Rails Application Tạo mới ứng dụng để thực hiện đăng nhập vào facebook rails new myapp cd myapp 2. Add the Required Gems to the Gemfile Trong ứng dụng này ...

Tóm tắt

Trong bài viết sẽ cung cấp các bước cơ bản để thực hiện đăng nhập vào trang web của bạn thông qua facebook.

1. Create a New Rails Application

Tạo mới ứng dụng để thực hiện đăng nhập vào facebook

rails new myapp
cd myapp

2. Add the Required Gems to the Gemfile

Trong ứng dụng này sẽ sử dụng các gem : Devise, OmniAuth. Ngoài ra trong ứng dụng này còn sử dụng các gem tách biệt khác để đăng nhập vào facebook, google plus hoặc twitter. Tuy nhiên trong ứng dụng này sẽ demo gem omniauth-facebook

Với việc đăng nhập qua các api khác. Ví dụ như omniauth-digitalocean để đăng nhập qua digitalocean. Tuy nhiên lưu ý hiện này một số trang (google plus) cung cấp api đăng nhập và việc kiểm tra đăng nhập thông qua oauth2 do đó tuy từng api cần sử dụng gem hợp lý để đăng nhập. Sau đây là mốt số ví dụ về các gem tương ứng với các trang khac nhau:

  • Twitter - omniauth-twitter
  • Amazon - omniauth-amazon
  • Google - omniauth-google-oauth2
  • Github - omniauth-github

Chạy bundle để cài đặt các gem vừa được thêm vào

bundle install

3. Add Basic Functionality to the Application

Tại bước này trong ứng dụng sẽ thêm vào model và các action. Có thể thêm vào bằng cách sự dụng câu lệnh "rails g scaffold"để thêm. Với câu lệnh scaffold, rails sẽ sinh ra đẩy đủ các phương thức CRUD (Create Read Update Delete). Có thể hiểu, câu lệnh trên sẽ tạo ra đầy đủ mối quan hệ giữa controller, view từ model vừa được khai báo

rails g scaffold Product name:string price:integer description:text
rake db:migrate

Sửa file routes(~/rails_apps/myapp/config/routes.rb) để khai báo đường dẫn mặc định(root) cho trang web thêm dòng sau : root "products#index" . Sau khi thêm file routes sẽ có định dạng như sau :

Rails.application.routes.draw do
  resources :products
  root "products#index"
end

Chạy thử ứng dụng bằng câu lệnh sau : rails s

Trong browser vào địa chỉ http://localhost:3000/ để kiểm tra ứng dụng đã chạy thành công chưa. Tuy nhiên ứng dụng lúc này cần kiểm tra login để thực hiện các hành động ví dụ như thêm, xóa sửa hàng

4. Set Up Devise

Trong file gem thêm dòng sau :

gem "devise"

Chạy các câu lệnh sau để cài đặt gem devise

bundle install
rails generate devise:install
rails generate devise User
rake db:migrate

Gem devise sẽ hỗ trợ việc thêm các trang sign-in, sign-up cho ứng dụng . Tuy nhiên các chức năng vẫn có thể truy cập một cách dễ dang, bằng cách thêm đoạn sau đê kiểm tra user đã đăng nhập chưa

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!
end

Chạy lại server để kiểm tra ứng dụng của bạn đã kiểm tra đăng nhập trước khi thực hiện các hành động khác. Tiếp tục vào browser, localhost:3000 để kiểm tra.

Để tạo một tài khoản mới trong đường link :http://localhost:3000/users/sign_up

5.Update the User Model to Support OmniAuth

Nếu bạn đang chạy server thì hãy dừng lại bằng cách sử dụng câu lệnh ctrl + c. Thêm trường dữ liệu trong bảng User (Cột mới thêm uid

rails g migration AddColumnsToUsers provider uid
rake db:migrate

6.Get the Client ID and Client Secret from the OAuth Service Provider

Để sử dụng OAuth Authentication với vai trò là Developer. Các khai bao callback url cho ứng dụng của các api . Với mỗi api callback url khác nhau ví dụ :

  • Digital Ocean: http://localhost:3000/users/auth/digitalocean/callback
  • Facebook: http://localhost:3000/users/auth/facebook/callback
  • Amazon: http://localhost:3000/users/auth/amazon/callback
  • Twitter: http://localhost:3000/users/auth/twitter/callback
  • Google: http://localhost:3000/users/auth/google_oauth2/callback

7. Update the Devise Initializer

Config file devise của ứng dụng bằng cách thêm dòng sau:

config.omniauth :digitalocean, facebook_app_id, facebook_app_secret

8. Update the User Model

Trong ứng dụng cần khai báo rõ ràng các service cần thiết để thiết lập để đăng nhập thông qua các api

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
    :recoverable, :rememberable, :trackable, :validatable,
    :omniauthable, :omniauth_providers => [:facebook]
  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
    end
  end
end

Save file để tiếp tục

9.Add a Controller to Handle the Callback URLs

Sửa routes và khai báo controller để xử lý callback trả về

Rails.application.routes.draw do
  devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" }
  resources :products
  root 'products#index'
end

Tạo file mới :~/rails_apps/myapp/app/controllers/callbacks_controller.rb

thêm đoạn code sau:

class CallbacksController < Devise::OmniauthCallbacksController
  def create
    @user = User.from_omniauth(request.env["omniauth.auth"])
    sign_in_and_redirect @user
  end
end

Chạy ứng dụng để xem thành qủa : rails s

Tham khảo

Bài viết có sự tham khảo từ blog : https://www.digitalocean.com/community/tutorials/how-to-configure-devise-and-omniauth-for-your-rails-application

0