2012-10-01 27 views
5

Tôi đang cố tạo một API để đăng nhập vào ứng dụng đường ray bằng Devise và authenticatable_token. Tôi tạo ra một SessionsController trong mô-đun API của tôi và viết đoạn mã sau để sign_in:Đăng nhập bằng ứng dụng đường ray với Devise và token_authenticatable: "401 trái phép"

module Api 
    module V1 
    class SessionsController < Devise::SessionsController 

     def create 
     resource = warden.authenticate!(scope: resource_name, recall: "#{controller_path}#new") 
     sign_in(resource_name, resource) 
     if current_user 
      if !current_user.authentication_token 
      current_user.reset_authentication_token! 
      end 
      render json: {success: true, auth_token: resource.authentication_token, email: resource.email} 
     else 
      invalid_login_attempt 
     end 
     end 

     protected 

     def invalid_login_attempt 
     warden.custom_failure! 
     render json: {success: false, message: "Error with your login or password"}, status: 401 
     end 
    end 
    end 
end 

Vấn đề là ứng dụng đặt ra một 401 khi tôi sử dụng tên đăng nhập mà không cần bất kỳ dấu hiệu.

RestClient.post "http://localhost:3000/api/v1/users/sign_in", {user: {email: "[email protected]", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json 

Nhưng nếu tôi đặt token được cung cấp bởi đăng ký phương pháp hoạt động:

response_json = RestClient.post "http://localhost:3000/api/v1/users/sign_in?auth_token=#{@token}", {user: {email: "[email protected]", password: "FILTERED"}}.to_json, :content_type => :json, :accept => :json 

Vậy tại sao điều này? Có thể tắt quy trình xác thực mã thông báo khi thực hiện đăng nhập không?

Trả lời

3

lập mưu điều khiển không hoạt động ra khỏi hộp khi bạn sử dụng định dạng json, bạn sẽ phải làm một trong những điều sau đây:

  • loại bỏ nội dung của bạn type => json và chấp nhận => chỉ thị json
  • thêm config.navigational_formats = [: html,: json] để tập tin cấu hình devise bạn
  • quá tải bộ điều khiển để chạy định dạng đó trong bạn cần phản hồi cụ thể, mà là khá phổ biến

Bạn có thể lấy ví dụ làm việc tại đó http://jessehowarth.com/devise

+0

Cảm ơn câu trả lời của bạn. Tôi đã làm theo hướng dẫn trên trang web của bạn nhưng tôi vẫn nhận được 401. Hơn nữa, tôi nhận được lỗi 500 với phương thức 'undefined' split 'cho: failure: Symbol'' từ 'resource = warden.authenticate! (: Scope => resource_name, : recall =>: failure) '. Tôi cũng đã xóa loại nội dung và chấp nhận các chỉ thị từ yêu cầu của tôi và thêm navigational_formats. – obo

+0

Thực ra nó là 'warden.authenticate! ', Nó tăng 401. – obo

+0

Cuối cùng tôi đã thành công. Lỗi của tôi đã được gây ra bởi một tuyến đường sai. Tôi đã phải sử dụng localhost: 3000/api/v1/sign_in thay vì api/v1/users/sign_in. Bằng cách liên kết của bạn và lời khuyên của bạn trong cấu hình đã giúp tôi để có được những điều làm việc một cách chính xác. – obo

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