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 ...
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.development và config/.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_USER và AUTH_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.