11/08/2018, 21:25

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.

0