Thêm vào authentication cho Lotus app

Chú thích: Đây là bản dịch tiếng Việt của bài viết gốc của tôi. Nếu bạn muốn xem bản tiếng Anh, xin hãy trỏ tới URL http://ruby-journal.com/lotusrb/how-to-add-basic-authentication-into-lotus-app/

Lời mở

Lotus Framework là một Ruby Web Framework mới với chú trọng vào cấu trúc tách rời với thiết kế đơn giản và dễ hiểu. Nhưng có nhiều chức năng vẫn còn thiếu sót tài liệu, một trong đó là cách thêm vào basic HTTP authentication (tương đương với Rails http_basic_authenticate_with).

Trong bài viết ngắn sau, tôi sẽ hướng dẫn các bạn cách thêm vào chức năng đơn giản này cho app của bạn.

Yêu cầu

  • Lotus 0.3.0 hoặc mới hơn
  • Hiểu về Rack

Khái niệm

Lotus Framework được xây dựng trên nền tảng Rack, có lẽ bạn nào đã sự dụng qua Sinatra hay Rails đều đã biết đến Rack.

Rack là gì? Rack là một web protocol spec và cũng là một tổ hợp thư viện các chức năng giúp thống nhất giao diện kết nối giữa web server. Rack giới thiệu khái niệm middleware stacking, nôm na là xâu chuỗi nhiều middleware với nhau, và các middleware này hợp thành một framework để lọc các request đầu vào. Có đủ loại middleware sẵn có cho bạn, từ request santization cho đến caching, và không có gì ngạc nhiện nếu basic authentication middleware cũng nằm trong số đó.

Xin được giới thiệu Rack::Auth::Basic. Middleware này được thiết kế để cung cấp chức năng basic HTTP authentication.

Trước khi tôi nói thêm về cách viết, tôi muốn các bạn lưu ý là không nên sử dụng basic HTTP authentication cho production. Bởi vì mật mã được hardcode và cũng chỉ có một password duy nhất được dùng.

Cài đặt

Việc đầu tiên là cài rồi tạo một app mới với Lotus Framework

gem install lotusrb
bundle exec lotus new demo

Lệnh trên tạo một ứng dụng Lotus Framework mới trong thư mục demo.

Cấu hình

Mặc định thì Lotus Framework sẽ tạo ra một app có tên là Web, và được tạo ra trong thư mục apps/web. Và chúng ta sẽ thêm vào chức năng authentication vào app này của chúng ta. Xin thay đổi file apps/web/application.rb với nội dung sau:

module Web
  class Application < Lotus::Application
    configure do

      #..tất cả những gì có trước đó

      middleware.use Rack::Auth::Basic, "Protected Area" do |username, password|
        username == 'admin' && password == 'password'
      end

    end
  end
end

Như các bạn đã thấy ở ví dụ trên, tôi nói Lotus thêm vào Rack::Auth::Basic middleware thông qua hàm middleware.use. Hàm này tương tự với hàm config.middleware.use của Rails, nó sẽ thêm vào middleware vào cuối chuỗi middleware đã cấu hình sẵn.

Sau đó chúng ta hãy kiểm tra xem middleware trên có hoạt động hay không bằng cách khởi động server với lệnh: bundle exec lotus server

Rồi dùng trình duyệt mở trang http://0.0.0.0:2300, nếu mọi thứ đúng thì bạn sẽ thấy một dialog yêu cầu đăng nhập username và password.

Nếu bạn chỉ muốn áp dụng cho môi trường development thì chỉ cần di chuyển đoạn code ở trên vào block :development:

module Web
  class Application < Lotus::Application
    configure :development do
      #..whatever there

      middleware.use Rack::Auth::Basic, "Protected Area" do |username, password|
        username == 'admin' && password == 'password'
      end
    end
  end
end

Đơn gian nhỉ? Thế nếu chúng ta muốn áp dụng cho môi trường production thì sao? Dễ thôi, chẳng phải di chuyển code đi đâu vì toàn bộ code nếu không khai báo môi trường sẽ là code cho môi trường production. Đây là cái mà tôi thích ở Lotus Framework vì code của bạn trên môi trường development nên hoàn toàn giống code trên môi trường production.

Tôi không thích cách chúng ta lưu mật khẩu thẳng vào application config, có một cách khác giúp tăng tính bảo mật đó là dùng biến UNIX environment để lưu mật khẩu. Cảm ơn Lotus đã đi kèm gem dotenv nên việc thêm vào 1 biến UNIX environment trở nên rất dễ dàng thông qua việc thay đổi nội dung của các file config/.env, config/.env.developmentconfig/.env.test.

Việc đầu tiên là thay đổi app config code để gọi biến UNIX env:

middleware.use Rack::Auth::Basic, "Protected Area" do |username, password|
  username == ENV["AUTH_USER"] && password == ENV["AUTH_PASSWORD"]
end

và cài biến AUTH_USERAUTH_PASSWORD trong config/.env hoặc config/.env.development:

AUTH_USER="admin"
AUTH_PASSWORD="password"

Còn đối với môi trường prodution, bạn không nên dùng dotenv mà phải cài đặt thủ công khi deploy.

Kết luận

Lotus Framework được thiết kế trên nền tảng Rack với nhiều middleware lợi hại sẵn sàng để sử dụng. Bằng cách thêm Rack::Auth::Basic vào chuỗi middleware, chúng ta có thể viết basic HTTP authentication với chỉ vài dòng code.

Các bạn lưu ý là phương pháp này không an toàn cho các ứng dụng production nên mong các bạn tránh.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Lơi Rệ

43 bài viết.
206 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
65 12
Sự sống còn của các công ty kỹ thuật phụ thuộc vào nguồn nhân lực chất xám của họ. Thế nên rất thiết yếu cho việc đầu tư xây dựng team có khả năng ...
Lơi Rệ viết gần 2 năm trước
65 12
White
38 7
Trời se se lạnh, Melbourne chuyển mùa, ngồi trong quán cafe bắt đầu một ngày làm việc mới với suy nghĩ tại sao các bạn Việt Nam không muốn tham gia...
Lơi Rệ viết gần 3 năm trước
38 7
White
36 15
Thế nào là làm việc từ xa? Internet, một trong những phát minh vĩ đại nhất của con người thế kỷ 20. Công nghệ này xoả bỏ rào cản vật lý giữa các n...
Lơi Rệ viết 2 năm trước
36 15
Bài viết liên quan
White
8 1
Tiếp tục bài viết lần trước về (Link) & (Link) bây giờ chúng ta sẽ tìm hiểu thêm cách tạo API từ Lotus Framework. Tại sao lại sử dụng Lotus để tạ...
My Mai viết hơn 2 năm trước
8 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
43 bài viết.
206 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!