Từ các hình thức xác thực tùy chỉnh đến hình thức xác thực plug-and-play, các nhà phát triển Ruby ngày nay có rất nhiều lựa chọn. Tuy nhiên, như bạn có thể biết, việc xây dựng giải pháp của riêng mình có thể tốn kém và nguy hiểm. Nếu Devise là tiêu chuẩn thực tế cho hầu hết các nhóm thì một giải pháp thay thế có thể đơn giản hóa cuộc sống của hầu hết mọi người.
Bài viết này sẽ đề cập đến việc thiết lập và sử dụng Auth0 trong ứng dụng Ruby on Rails, bao gồm mọi thứ bạn cần để hoạt động bình thường, từ việc xử lý các vai trò đến việc dựa vào nhiều nhà cung cấp để xác thực người dùng.
Bắt đầu
Đây là những gì chúng ta cần để bắt đầu:
- Tài khoản Auth0
- Ứng dụng Ruby on Rails (phiên bản 7.x trở đi)
Auth0 là dịch vụ xác thực của bên thứ ba với cấp độ miễn phí cho phép bạn xử lý tới 7.000 người dùng. Chừng đó là đủ để bạn bắt đầu và mức giá của nó là hợp lý nếu bạn cần các tính năng nâng cao hơn.
Định cấu hình ứng dụng Ruby của chúng tôi trong Auth0
Vì ứng dụng của bạn sẽ dựa vào Auth0 để xác thực người dùng thông qua chuyển hướng và lệnh gọi nên chúng tôi phải đảm bảo ứng dụng luôn được bảo mật.
Trong tài khoản Auth0 của chúng ta, hãy tạo một ứng dụng trong một đối tượng thuê. Bạn có thể tạo nhiều đối tượng thuê trong một tài khoản để tách biệt:
- Tên miền.
- Các môi trường khác nhau (phát triển, sản xuất, v.v.).
- Quốc gia hoặc khu vực nơi dữ liệu sẽ được lưu trữ.
Khi bạn đã tạo đối tượng thuê đầu tiên của mình, bạn có thể xây dựng một ứng dụng. Đó là nơi chúng ta sẽ bắt đầu.
Đi tới tab "Cài đặt" trong bảng ứng dụng. Bạn cần sao chép và dán nội dung sau và lưu vào nơi an toàn:
- Tên miền:
app-name.[eu,us,..].auth0.com - ID của khách hàng
- Bí mật của khách hàng
Chúng ta cũng phải điền vào các URI ứng dụng sau. Chúng tôi sẽ sử dụng các giá trị này để thiết lập phát triển cục bộ của mình:
- URL gọi lại được phép:
http://localhost:3000/auth/auth0/callback(URL Auth0 sẽ chuyển hướng đến sau khi xác thực). - URL đăng xuất được phép:
http://localhost:3000(URL Auth0 sẽ chuyển hướng đến sau khi ai đó đăng xuất).
Hãy tiếp tục và định cấu hình ứng dụng của chúng tôi.
Chuẩn bị ứng dụng Ruby on Rails của chúng tôi
Bạn có thể bắt đầu với ứng dụng Ruby on Rails thông thường bằng cách sử dụng rails new lệnh.
Hãy tạo một cái dựa trên SQLite3 cho cơ sở dữ liệu và Tailwind cho thư viện CSS. Bỏ qua việc cài đặt mini-test và đặt tên ứng dụng là "Auth0 Article":
Tạo mô hình Người dùng chỉ với một vài thuộc tính:
Điều này xây dựng một cơ sở đơn giản nhưng hiệu quả cho ứng dụng của chúng tôi.
Thêm đá quý Auth0 vào ứng dụng
Bạn sẽ cần omniauth-auth0 và omniauth-rails_csrf_protection để sử dụng Auth0 trong ứng dụng Ruby on Rails của bạn.
Định cấu hình Auth0
Chúng ta cần tạo một tệp cấu hình nhỏ (config/auth0.yml ) để lưu trữ thông tin đăng nhập trong môi trường phát triển của chúng tôi.
Chúng ta cũng có thể dựa vào các biến môi trường ở đây bằng cách sử dụng một số erb:
Tất nhiên, việc dựa vào thông tin đăng nhập Ruby on Rails sẽ đảm bảo rằng mọi thứ luôn được cập nhật hơn.
Tệp này sẽ được sử dụng trong trình khởi tạo Auth0 (config/initializers/auth0.rb ), bây giờ chúng ta sẽ tạo:
Như bạn có thể thấy ở đây, chúng tôi đang sử dụng Rails.application.config_for để tải lên nội dung của tệp YAML dưới dạng hàm băm thuận tiện. Chúng tôi có thể thay thế thư viện này bằng bất kỳ thư viện xử lý bí mật nào, bao gồm cả bộ lưu trữ thông tin xác thực được mã hóa Rails.
Lưu ý những điều sau:
- Tên nhà cung cấp (
:auth0) - Ba mục từ tệp YAML, được đọc và sử dụng thông qua
AUTH0_CONFIGhàm băm. - Số
callback_pathkhóa và giá trị, khớp với khóa và giá trị chúng tôi đã định cấu hình trong giao diện Auth0. - Số
authorize_paramsvàscopechìa khóa bên trong nó; chúng ta sẽ quay lại vấn đề đó sau.
Chúng ta cần tạo các thành phần giao diện và định tuyến để cho phép xác thực.
Thiết lập tuyến đường và giao diện người dùng bằng Tailwind
Trong ví dụ này, chúng ta sẽ làm việc với ứng dụng Ruby on Rails sử dụng phiên bản 7.1 của framework với TailwindCSS.
Sử dụng lệnh sau:
Sau đó, chúng tôi có thể thêm hai bộ điều khiển bằng hành động lập chỉ mục, chuẩn bị kiểm tra quy trình xác thực:
Với hai lệnh đó, các lệnh sau sẽ được tạo:
- Cả hai
public_controller.rbvàprivate_controller.rbbộ điều khiển, với hành động chỉ mục sẵn sàng để sử dụng - Cả hai tuyến đường liên quan
- Các quan điểm liên quan
Hãy thêm bộ điều khiển Auth0 để xử lý các lệnh gọi lại và lỗi. Tạo tệp điều khiển (bin/rails g controller auth0 ) và thêm vào như sau:
Sau đó cập nhật các tuyến đường để sử dụng ba hành động đó:
Và sau đó chúng ta có thể thêm Login và Logout các nút ở chế độ xem công khai và riêng tư tương ứng:
Bây giờ bạn có thể truy cập 'http://localhost:3000'. Sử dụng Login và bạn sẽ được chuyển hướng đến riêng tư trang. Ở đó, bạn sẽ tìm thấy Logout nút.
Tuy nhiên vẫn còn thiếu một số thứ:
- Dữ liệu từ hồ sơ của người dùng
- Xác định người dùng và xử lý ủy quyền
Làm việc với Phạm vi và Dữ liệu
Hãy lùi lại vài bước và đưa trình khởi tạo trở lại (config/initializers/auth0.rb ):
Phần quan trọng ở đây là phạm vi:openid profile . Điều này cho Auth0 biết rằng chúng tôi quan tâm đến một số thông tin, cụ thể là:
- Tên nhà cung cấp (Auth0)
- Một
uid:Mã định danh duy nhất để khớp với người dùng - Một
infohàm băm:Chứa tên, URL tới ảnh hồ sơ và khóa 'email' trống - Một
extra_infohash:Một lần nữa, có tên và ảnh hồ sơ, nhưng cũng có một cặp tên và họ
Đọc thêm về chủ đề phạm vi trong tài liệu của Auth0.
Thông tin trên rất có giá trị và bạn nên đảm bảo rằng, ít nhất trong lần đăng nhập đầu tiên, bạn sao chép dữ liệu đó vào một bảng trong ứng dụng của mình.
Để làm như vậy, chúng ta cần sử dụng nội dung của yêu cầu-phản hồi trong auth0_controller và cụ thể là trong callback hành động:
Sử dụng điểm dừng trước chuyển hướng để tìm hiểu sâu hơn về hàm băm và thử nghiệm.
Chúng tôi cũng thường muốn có địa chỉ email. Để có được nó, bạn có thể cập nhật phạm vi:
Sau khi tải lại máy chủ ứng dụng và thực hiện các bước đăng nhập, bạn sẽ cần cấp cho ứng dụng quyền truy cập vào thông tin bổ sung.
Bây giờ chúng ta có thể làm điều gì đó như thế này trong callback hành động:
Điều này sẽ đảm bảo chúng tôi có hồ sơ cục bộ, cập nhật cho người dùng.
Lời nói trong phiên
Phiên là một hàm băm đặc biệt trong ứng dụng Ruby on Rails. Nó có bộ nhớ hạn chế có thể truy cập được từ bộ điều khiển và chế độ xem và dành riêng cho mỗi khách truy cập.
Chúng ta có thể "mở" và "đóng" phiên. Nếu chúng tôi cần một tập dữ liệu cụ thể, chúng tôi có thể quyết định rằng một phiên sẽ mở. Nếu không có dữ liệu thì nó bị đóng.
Hãy nhớ các dòng sau trong bộ điều khiển Auth0 của chúng tôi:
Cái đầu tiên ghi giá trị vào raw_info khóa của hàm băm thành hàm băm phiên, trong khi khóa thứ hai chỉ xóa hàm băm phiên.
Sau đó, chúng ta có thể xác định phương thức trợ giúp sau trong ApplicationHelper :
Mối lo ngại về bảo mật
Bây giờ hãy sử dụng điều này như một mối quan tâm cho bộ điều khiển của chúng tôi. Ý tưởng là xác định một bộ điều khiển yêu cầu người dùng phải đăng nhập để truy cập nó, chẳng hạn như private_controller của chúng tôi .
Chúng ta có thể viết tệp quan tâm sau:
Sau đó chúng ta có thể sử dụng nó trong bộ điều khiển của mình như sau:
Nếu khách truy cập chưa đăng nhập nhưng sau đó cố gắng mở /private/index trang, chúng sẽ tự động được chuyển hướng đến thư mục gốc của trang web.
Tích hợp với các nhà cung cấp khác
Bạn có thể tin cậy vào nhiều nhà cung cấp thông qua Auth0. Tuy nhiên, Google được xác định là mặc định. Đối với nhiều công ty, thế là đủ.
Nếu bạn cần thêm nhà cung cấp, hãy truy cập Xác thực menu dành cho đối tượng thuê có liên quan trong Auth0 và sau đó là Xã hội menu con, nơi bạn có thể thiết lập các nhà cung cấp bổ sung.
Cũng cần lưu ý rằng bạn cũng có thể định cấu hình xác thực đa yếu tố (MFA) bằng Auth0.
Quá trình sẽ vẫn giữ nguyên ngoại trừ các bước cấu hình đó. Ứng dụng của chúng tôi sẽ chỉ trả về dữ liệu khách truy cập để chứng minh rằng khách truy cập đã được xác thực.
Mở cửa theo hướng ủy quyền
Bây giờ chúng tôi có thể xác thực người dùng và gửi thông tin của họ đến ứng dụng của chúng tôi thông qua lệnh gọi lại. Chúng tôi đã thấy cách lấy địa chỉ email của người dùng ra khỏi hàm băm và tìm người dùng có liên quan trong cơ sở dữ liệu của chúng tôi.
Từ đó, chúng ta có thể xác định chính sách ủy quyền.
Pundit là một lựa chọn tuyệt vời để xác định và sử dụng các chính sách ủy quyền nhưng vẫn dựa vào việc kiểm tra vai trò của người dùng.
Sử dụng role attribute trên thực tế là phương pháp dễ nhất. Bạn có thể điền thông tin này khi tạo người dùng trong bảng điều khiển Rails hoặc giao diện phụ trợ của ứng dụng của bạn, trước lần đăng nhập đầu tiên của người dùng.
Hoặc bạn có thể lấy danh sách email của quản trị viên và đối chiếu email của người dùng với danh sách khi tạo người dùng.
Và thế là xong!
Những gì chúng tôi đã đề cập
Trong bài viết này chúng tôi thiết lập:
- Đối tượng thuê và ứng dụng trong Auth0
- Đá quý liên quan đến Auth0 trong ứng dụng Ruby on Rails
- Tuyến đường và chế độ xem trong ứng dụng
Sau đó chúng tôi:
- Đã xem lại khái niệm về phiên và biết cách sử dụng nó
- Tạo công cụ cơ bản để kiểm tra xem người dùng đã đăng nhập hay chưa
- Đã thêm mối lo ngại về bộ điều khiển để bảo mật bộ điều khiển đằng sau yêu cầu đăng nhập
- Biết cách kết hợp người dùng với vai trò của họ
Auth0 và các nhà cung cấp xác thực khác có thể giúp bạn tích hợp xác thực tiên tiến vào ứng dụng Ruby on Rails mà không cần viết nhiều mã. Đây thường là một lựa chọn tốt hơn nhiều so với việc dựa vào việc triển khai lớp xác thực của riêng bạn hoặc thậm chí sử dụng các loại đá quý như Devise.
Chúc bạn viết mã vui vẻ!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!
Thomas Riboulet
Tác giả khách mời của chúng tôi, Thomas là Kỹ sư tư vấn cơ sở hạ tầng đám mây và phụ trợ có trụ sở tại Pháp. Trong hơn 13 năm, anh đã làm việc với các công ty khởi nghiệp và công ty để mở rộng quy mô đội ngũ, sản phẩm và cơ sở hạ tầng của họ. Ông cũng đã được xuất bản nhiều lần trên tạp chí GNU/Linux của Pháp và trên blog của mình.
Tất cả bài viết của Thomas Riboulet