class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!, :except => [:index]
  before_action :authenticate, :except => [:index]

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      basic_auth=User.find_by_email(username)
      if basic_auth.valid_password?(password)
        sign_in :user, basic_auth
        render :json => {:email => current_user.email, :id => current_user.id, :message => "hai ruby"}
      else
        render plain: "Unauthorized access"
      end
    end
  end
end

Saya mencoba menerapkan otorisasi dasar dalam aplikasi sampel saya. Ketika saya memberikan nilai kredensial yang benar seperti dalam database pengguna. Ini memberikan respons json. Ketika nama pengguna dan kata sandi salah, itu melempar kesalahan sebagai "metode tidak terdefinisi `valid_password?' untuk nil:NilClass"

0
rthi 14 November 2017, 10:32

1 menjawab

Jawaban Terbaik

Ubah saja kondisi if menjadi ini:

if basic_auth && basic_auth.valid_password?(password)

Ini akan berfungsi karena sebelum memeriksa kata sandi yang valid, Anda harus memeriksa apakah pengguna bahkan ada dengan id email yang diberikan atau tidak. Jika tidak, objek basic_auth akan menjadi nil dan metode valid_password pada objek nil akan menghasilkan kesalahan.

0
Aakash Gupta 14 November 2017, 07:51