2010-03-08 23 views
19

Tôi đang xây dựng một API cơ bản nơi thông tin người dùng có thể được truy xuất sau khi đăng nhập và mật khẩu của người dùng được gửi chính xác.Đường ray: Truy cập tên người dùng/mật khẩu được sử dụng cho Xác thực cơ bản HTTP?

Ngay bây giờ tôi đang sử dụng một cái gì đó như thế này:

http://foo:[email protected]/api/user.xml

Vì vậy, những gì tôi cần làm là truy cập người dùng/mật khẩu được gửi trong yêu cầu (các foobar) nhưng không chắc chắn cách truy cập thông tin đó trong bộ điều khiển Rails.

Sau đó, tôi sẽ kiểm tra các biến đó qua một nhanh User.find và sau đó đặt các biến đó làm biến tên người dùng và mật khẩu cho authenticate_or_request_with_http_basic.

Có thể tôi đang xem xét điều này theo cách hoàn toàn sai, nhưng đó là nơi tôi đang ở ngay bây giờ. :)

Trả lời

47

Câu trả lời cho câu hỏi của bạn như thế nào để có được những thông tin quan trọng từ yêu cầu là:

user, pass = ActionController::HttpAuthentication::Basic::user_name_and_password(request) 

Tuy nhiên authenticate_or_request_with_http_basic là tất cả những gì bạn cần làm auth cơ bản:

class BlahController < ApplicationController 
    before_filter :authenticate 

    protected 

    def authenticate 
    authenticate_or_request_with_http_basic do |username, password| 
     # you probably want to guard against a wrong username, and encrypt the 
     # password but this is the idea. 
     User.find_by_name(username).password == password 
    end 
    end 
end 

authenticate_or_request_with_http_basic sẽ trả về một Trạng thái 401 nếu thông tin đăng nhập không được cung cấp, sẽ xuất hiện hộp thoại tên người dùng/mật khẩu trong trình duyệt. Nếu các chi tiết được đưa ra thì các chi tiết đó được chuyển tới khối được cung cấp. Nếu khối trả về true thì yêu cầu sẽ được thực hiện. Nếu không, xử lý yêu cầu sẽ bị hủy bỏ và trạng thái 403 sẽ được trả lại cho máy khách.

Bạn cũng có thể kiểm tra railscast 82 (thats là những mã trên là từ): http://railscasts.com/episodes/82-http-basic-authentication

+0

Đây là một câu trả lời thực sự hữu ích - một cái gì đó mà dường như đọc đơn giản về nó nhưng tôi đã tự hỏi làm thế nào để làm điều này. Cảm ơn vì đăng. –

1

Plugin đường ray Authlogic hỗ trợ chức năng này (cũng như nhiều hơn nữa) ngoài hộp. Bạn có thể root trong nguồn cho nó, hoặc đơn giản là tích hợp nó vào ứng dụng hiện có của bạn.

Edit:
Sau khi đào bới xung quanh mã nguồn cho Authlogic, tôi thấy this file trong đó sử dụng đoạn mã sau đây để lấy tên người dùng và mật khẩu:

def authenticate_with_http_basic(&block) 
    @auth = Rack::Auth::Basic::Request.new(controller.request.env) 
    if @auth.provided? and @auth.basic? 
     block.call(*@auth.credentials) 
    else 
     false 
    end 
    end 

tôi muốn nhìn một chút nữa vào tất cả mọi thứ, nhưng tôi phải đi ngủ. Hy vọng tôi đã được giúp đỡ một số.

Các vấn đề liên quan