首页 > 解决方案 > 在 React on Rails 应用程序中呈现无效凭据消息

问题描述

关于身份验证的初学者问题,请耐心等待:

在我的 React on Rails 应用程序中,所有身份验证方法都可以正常工作,但如果用户输入无效凭据,控制台会显示 500 uncaught in promise 错误。我希望能够在屏幕上显示“无效凭据”方法,但是从概念上讲,我不知道从哪里开始。

在 Ruby 控制器中,我指出登录方法应该返回未经授权的:

def login
   @user = User.find_by(username: login_params[:username])
   if @user.authenticate(login_params[:password])
      token = encode({id: @user.id})
      render json: {
        user: @user.attributes.except("password_digest"),
        token: token
      }, status: :ok
   else
      render json: { errors: 'unauthorized' }, status: :unauthorized
   end
end

但是在控制台中我只看到一个 500 错误。

任何关于我应该从哪里开始的指导将不胜感激。我只是不知道这是我需要在前端还是后端更改的东西。也许我需要在某个地方尝试捕捉?我只是有点迷路了。

标签: ruby-on-railsreactjsauthenticationhttp-status-code-401http-status-code-500

解决方案


如果有人输入了有效的用户名但密码无效,您的代码似乎可以工作,但500如果有人输入了无效的用户名,您会收到错误消息。

原因是如果不存在匹配记录则#find_by返回。nil所以在这一行之后:

@user = User.find_by(username: login_params[:username])

@usernil如果不存在这样的用户名,将是。但是在下一行中,您调用@user.authenticate- 并且由于nil没有这样的方法,您会得到您所看到的崩溃。

修复很简单——我们可以使用 Ruby 的“安全导航”运算符&.authenticate@user不为 nil 时调用:

if @user&.authenticate(login_params[:password])

如果@user为 nil,则不会调用身份验证方法,代码将跳转到该else块。


推荐阅读