这是我的用户:
class User < ActiveRecord::Base
has_secure_password
end
这是有人可以通过API进行身份验证的方式:
module Api
class SessionsController < ApiController
def create
user = User.find_by_email(params[:user][:email])
if user && user.authenticate(params[:user][:password])
# some login logic
else
render json: {messages: user.errors.full_messages}, status: :unauthorized
end
end
end
end
如果我传递了错误的密码,我会按预期获得401 Unauthorized。但是,user.errors
为空。如何访问has_secure_password
身份验证错误?
答案 0 :(得分:2)
仅在活动记录错误中填充验证错误。密码不正确不是验证错误。为什么不能明确设置消息,因为唯一可能的错误是电子邮件/密码无效
module Api
class SessionsController < ApiController
def create
user = User.find_by_email(params[:user][:email])
if user && user.authenticate(params[:user][:password])
# some login logic
else
render json: {messages: ["Invalid Email or Password"]}, status: :unauthorized
end
end
end
end
答案 1 :(得分:1)
这很容易做到。简而言之,在User模型上放置一个方法(在此示例中称为password_verified
),如果authenticate
失败,则会添加错误。
# app/models/user.rb
def password_verified(password)
verified = authenticate(password)
errors.add(:password, 'is invalid') unless verified
verified
end
现在,而不是致电authenticate
来电password_verified
。你的例子看起来像这样:
module Api
class SessionsController < ApiController
def create
user = User.find_by_email(params[:user][:email])
# Here is where we call our wrapper method instead of authenticate
if user && user.password_verified(params[:user][:password])
# some login logic
else
render json: {messages: user.errors.full_messages}, status: :unauthorized
end
end
end
end
这就像使用自定义验证器一样使用ActiveModel :: Errors,因此它有很好的文档记录(即Rails指南,ActiveRecord验证,errors.add)。虽然我在这里将password_verified
放在用户模型上,但它可以像服务或关注点一样。