+1

Tích hợp đăng ký & đăng nhập bằng LINE trong ứng dụng Rails (Devise + OmniAuth)

1. Giới thiệu

Trong thời đại mà người dùng ngại nhập email và mật khẩu mỗi lần đăng ký, việc cho phép đăng nhập bằng mạng xã hội là cực kỳ quan trọng. Ngoài Google hay Facebook, LINE là một nền tảng phổ biến tại Nhật Bản, Đài Loan và Thái Lan.

Trong bài viết này, mình sẽ chia sẻ cách mình tích hợp đăng nhập bằng LINE vào ứng dụng Ruby on Rails 8 bằng cách sử dụng Devise và OmniAuth. Nếu bạn đang phát triển sản phẩm hướng đến thị trường có người dùng LINE, bài này sẽ rất hữu ích với mọi người.

2. Cài đặt gem cần thiết

Trong file Gemfile, mình thêm các gem sau:

gem "devise"
gem "omniauth"
gem "omniauth-line"
gem "dotenv-rails"

Sau đó chạy:

bundle install

Mình dùng thêm dotenv-rails để quản lý biến môi trường như LINE_CLIENT_ID, LINE_CLIENT_SECRET

3. Tạo ứng dụng trên LINE Developers Console

Truy cập https://developers.line.biz/console

Tạo một “Provider” và “Channel” (Loại: LINE Login)

Ghi lại các thông tin sau:

  • Channel ID → dùng cho LINE_CLIENT_ID
  • Channel Secret → dùng cho LINE_CLIENT_SECRET
  • Trong phần Callback URL, thêm đường dẫn:
https://your-domain.com/users/auth/line/callback

Sau khi bạn đăng kí xong thành công xong thì bạn sẽ thấy Channel trong developers line

Screenshot 2025-11-12 at 22.26.03.png

4. Cấu hình Devise và OmniAuth

Phần lưu thông tin và xác thực người dùng, thì mình dùng luôn gem devise, cũng rất quen với ae làm rails

Trong file config/initializers/devise.rb, thêm dòng cấu hình sau:

config.omniauth :line, ENV["LINE_CLIENT_ID"], ENV["LINE_CLIENT_SECRET"], scope: "profile openid"
OmniAuth.config.allowed_request_methods = [:get, :post]

lưu ý: nhớ thêm phần config OmniAuth.config.allowed_request_methods vô nữa nha, vì dòng này cấu hình phương thức yêu cầu HTTP mà OmniAuth sẽ chấp nhận khi giao tiếp với dịch vụ OAuth của LINE. Thông thường, OAuth yêu cầu sử dụng phương thức GET để bắt đầu quy trình xác thực và POST để trao đổi mã truy cập sau khi xác thực.

Tạo file .env

LINE_CLIENT_ID=xxxxxxxxxxxxxxxxx
LINE_CLIENT_SECRET=xxxxxxxxxxxxxxxxx

5. Cập nhật model User

Trong model user.rb:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :omniauthable, omniauth_providers: [:line]

  def self.from_omniauth(auth)
    user = find_by(provider: auth.provider, uid: auth.uid)

    unless user
      email = auth.info.email.presence || "line_user_#{auth.uid}@example.com"
      while exists?(email: email)
        email = "line_user_#{auth.uid}_#{rand(1000)}@example.com"
      end

      user = new(
        provider: auth.provider,
        uid: auth.uid,
        email: email,
        name: auth.info.name || "LineUser#{auth.uid}",
        image: auth.info.image,
        password: Devise.friendly_token[0, 20]
      )

      user.save!
    end

    user
  end
end

Hàm from_omniauth sẽ tự động:

  • Tìm user nếu đã tồn tại
  • Nếu chưa có → tạo mới user bằng thông tin từ LINE
  • Tạo email giả nếu LINE không trả về email

6. Router & Controller

Trong config/routes.rb:

devise_for :users, controllers: {
  omniauth_callbacks: "users/omniauth_callbacks"
}

Sau đó, tạo controller app/controllers/users/omniauth_callbacks_controller.rb:

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def line
    @user = User.from_omniauth(request.env["omniauth.auth"])

    if @user.persisted?
      sign_in_and_redirect @user, event: :authentication
      set_flash_message(:notice, :success, kind: "LINE") if is_navigational_format?
    else
      session["devise.line_data"] = request.env["omniauth.auth"].except(:extra)
      redirect_to new_user_registration_url, alert: "Login with LINE failed."
    end
  end

  def failure
    redirect_to root_path, alert: "Login failed, please try again."
  end
end

7. Giao diện đăng nhập

Trong viewapp/views/devise/sessions/new.html.erb

<%- if devise_mapping.omniauthable? %>
  <%= link_to "Login with LINE",
              user_line_omniauth_authorize_path,
              class: "py-2 px-4 bg-[#00C300] text-white rounded-md hover:bg-[#009900] focus:outline-none focus:ring-2 focus:ring-green-500 text-center w-full sm:w-auto" %>
<% end %>

Mọi người có thể dung bootstrap hay taiwind để css nhé

8. Chạy thử

rails s

Truy cập http://localhost:3000/users/sign_in → click “Login with LINE” → xác nhận quyền → bạn đã đăng nhập thành công bằng LINE!

Cùng xem thành quả nhé: Screenshot 2025-11-12 at 22.49.48.png Screenshot 2025-11-12 at 22.50.19.png Screenshot 2025-11-12 at 22.52.07.png

9. Kết Luận

Bằng vài bước cấu hình đơn giản, bạn đã có thể:

  • Cho phép người dùng đăng ký/đăng nhập bằng tài khoản LINE
  • Tích hợp hệ thống OAuth 2.0 một cách an toàn với Devise

LINE là lựa chọn tuyệt vời nếu bạn đang phát triển app tại Nhật, Đài Loan hoặc Thái Lan — nơi người dùng LINE rất phổ biến. Hi vọng bài viết này có thể giúp mọi người làm việc với line một cách dễ dàng hơn.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí