3

与常规设计 gem 的这个问题类似,使用devise_token_auth gem 显示相同的结果 - 验证错误在 json 响应中出现两次!?

从日志:

Processing by DeviseTokenAuth::RegistrationsController#create as JSON
  Parameters: {"name"=>"Mickey Mouse", "email"=>"mickeymouse@gmail.com", "password"=>"[FILTERED]", "confirmPassword"=>"[FILTERED]", "confirm_success_url"=>"http://localhost:4200/register", "registration"=>{"name"=>"Mickey Mouse", "email"=>"mickeymouse@gmail.com", "password"=>"[FILTERED]", "confirmPassword"=>"[FILTERED]", "confirm_success_url"=>"http://localhost:4200/register"}}
Unpermitted parameters: :confirmPassword, :confirm_success_url, :registration
Unpermitted parameters: :confirmPassword, :confirm_success_url, :registration
   (0.2ms)  BEGIN
  User Exists (0.9ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "mickeymouse@gmail.com"], ["LIMIT", 1]]
   (0.8ms)  SELECT COUNT(*) FROM "users" WHERE "users"."provider" = $1 AND "users"."email" = $2  [["provider", "email"], ["email", "mickeymouse@gmail.com"]]
   (0.3ms)  ROLLBACK
Completed 422 Unprocessable Entity in 247ms (Views: 0.7ms | ActiveRecord: 6.9ms)

请注意, unpermitted_pa​​rameters 行显示了两次 - 这似乎表明有些奇怪(这些行不通过 Postman 显示)。

我的用户模型在标准指南中没有任何额外内容,因此我的模型绝对没有 2 个唯一性或存在性验证,并且检查 gem 的源代码似乎也没有。

这是模型:

class User < ActiveRecord::Base

  # Include default devise modules.
  devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable,
          :confirmable, :omniauthable
  include DeviseTokenAuth::Concerns::User
end

如果我从 Postman 调用此端点,我会得到相同的结果,这是返回的 json:

{
    "status": "error",
    "data": {
        "id": null,
        "account_id": null,
        "provider": "email",
        "uid": "",
        "name": null,
        "nickname": null,
        "image": null,
        "email": "mickeymouse@gmail.com",
        "created_at": null,
        "updated_at": null
    },
    "errors": {
        "email": [
            "has already been taken",
            "has already been taken"
        ],
        "full_messages": [
            "Email has already been taken",
            "Email has already been taken"
        ]
    }
}

Rails API 是使用angular2-token库从 Angular2 调用的,但这显然不是问题(给出 Postman 的结果)。

我如何才能找到导致此问题的原因,或者如何对 gem 进行猴子修补以消除第二个错误?

更新

如果我:validatable从模型中删除并进行自己的验证:

  validates_uniqueness_of :email

我得到相同的结果,这很奇怪。

4

1 回答 1

2

编辑:此问题已修复,只需升级您的宝石!> v0.1.43.beta1


我发现这个问题是在 github 上报告的。

解决方法是删除 :validatable (电子邮件唯一性仍会触发),然后如该问题所示滚动您自己的密码确认验证(请参阅 stephanebruckert 的回复)并在此处复制:

引用:“validatable 验证电子邮件和密码,这就是为什么我们不应该在模型中做任何这些,否则它将被验证两次。在我的情况下,只有电子邮件被验证了两次,而我没有添加我的模型中的任何额外验证。所以我最终删除了可验证的,并对密码和密码确认进行了自己的验证:“

  validates_presence_of :password, on: :create
  validates :password,
    length: { minimum: 8 },
    allow_blank: true
  validate  :password_complexity
  validates_confirmation_of :password
  validates_presence_of :password_confirmation, if: lambda {| u| u.password.present? }

  private

    def password_complexity
      return unless password
      if password.include?(username) || !password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)./)
        errors.add(:password, "Must include at least one lowercase letter, one uppercase letter and one digit")
      end
    end

虽然这确实解决了重复的电子邮件错误,但我现在得到一个“密码确认不能为空白错误”......这导致了一个兔子洞来发现这个问题。您将需要阅读所有内容,但基本上,api 不应强制密码确认值的存在(仅在表单本身中需要):)

于 2017-09-21T18:34:39.633 回答