将用户凭据发送到 rails API 的正确方法

Proper way to send user credentials to rails API

我已经在我的 Rails API 上设置了设计令牌身份验证并且它工作正常,但是我不确定在登录时发送用户凭据的最正确的安全方式 in/registering...为了给您一些背景信息,API 将在完成后用作移动应用程序的后端。

这是我在 users_controller.rb 中创建方法的方法:

def create
    user = User.new(user_params)
    if user.save
      render json: user, status: 201
    else
      render json: { errors: user.errors}, status: 422
    end
end

截至目前,我通过 URL(电子邮件、密码、密码确认)将它们作为参数发送。

我的user_params方法:

def user_params
  # Seems to expect a user object as the param, unsure of how to replicate this on the app side
  # params.require(:user).permit(:email, :password, :password_confirmation)

  # Expects to see params[:user] as a string representation of JSON containing fields
  # email, password, and password_confirmation.
  ActionController::Parameters.new(JSON.parse(params.require(:user))).permit(:email, :password, :password_confirmation)
end

正如您从我的评论中看到的那样,我不太确定如何继续,我想使用我的设置创建尽可能安全的流程。

这些是关于从移动应用程序向我的 API 发送用户凭据的一些问题:

使用 HTTPS 并通过参数发送用户凭据是否足够?

如何使用 user_params 中定义的第一个方法来执行此操作?似乎发送一个 JSON 对象并用我的第二个 user_param 定义(未注释掉的那个)解析它是完成此操作的唯一方法。我本来是发送邮件,密码,password_confirmation作为他们自己的参数,但后来我发现params.require一次只能接受一个参数,然后我的错误只会显示一个丢失的字段当可能有多个时,这就是我将其作为一个对象发送的原因。

我是不是做错了?还是朝着正确的方向前进?

提前感谢大家的帮助!

是的,你拥有的是一个好的开始。

Is it adequate to use HTTPS and send user credentials through parameters?

通过 HTTPS 发送它们不仅足够,而且对您负有社会责任。在控制器的顶部,您可以强制控制器只响应 ssl 请求,如下所示:

force_ssl unless Rails.env.test?

How can I do this using the first method defined inside of my user_params? It seems that sending a JSON object and parsing it with my second user_param definition (the one not commented out) is the only way to accomplish this. I was originally sending email, password, password_confirmation as their own params, but then I found out that params.require can only take one argument at a time, and then my errors would only show one field that is missing when there could be multiple, hence the reason why I'm sending it as one object.

您可以将这一切简化为:

def user_params
  params.permit(:email, :password, :password_confirmation)
end

Rails,默认情况下,将为您将 JSON 解析为参数哈希。使用上面的代码,您还可以避免将电子邮件和密码放在 json 对象的 "user" 键中。

{ email: '...', password: '...' } VS. { user: { email: '...', password: '...' } }

Am i going about this all wrong? or headed in the right direction?

你走在正确的轨道上。另一个完全是开发人员偏好的小建议是对响应类型使用关键字而不是整数本身。我只是觉得这样读起来很好。这是它的样子:

def create
    user = User.new(user_params)
    if user.save
      render json: user, status: :created
    else
      render json: { errors: user.errors }, status: :unprocessable_entity
    end
end