Почему рельсы возвращают статус 401 Unauthorized и почему он говорит, что пользователь существует? - PullRequest
0 голосов
/ 28 января 2020

Я нахожусь в процессе написания одностраничного приложения с рельсами, реагированием и редукцией; и вот как выглядит полное сообщение об ошибке:

Started POST "/api/users" for ::1 at 2020-01-27 21:48:27 -0800
Processing by Api::UsersController#create as JSON
  Parameters: {"user"=>{"username"=>"racookin", "password"=>"[FILTERED]", "nickname"=>"racookin", "gender"=>"female", "birthday"=>"1990-07-07"}}
   (0.2ms)  BEGIN
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE "users"."username" = $1 LIMIT $2  [["username", "racookin"], ["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT $1  [["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."session_token" = $1 LIMIT $2  [["session_token", "9B3Uo1FGMnJDeASGGucj_Q"], ["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
   (0.2ms)  ROLLBACK
  ↳ app/controllers/api/users_controller.rb:6
Completed 401 Unauthorized in 274ms (Views: 0.2ms | ActiveRecord: 10.6ms)

Я пытаюсь понять, о чем идет речь, чтобы понять, с чего начать поиск ошибки; кажется, что он возвращает 401 несанкционированную ошибку, и он говорит, что пользователь существует (даже когда я пытаюсь зарегистрироваться с новым пользователем). Что именно здесь происходит? Кроме того, оно попадает в базу данных 3 раза?

Обновление: я думаю, что понимаю, что это сбой, потому что пользователь не сохраняется, что означает, что он, вероятно, не проходит одну из проверок.

Вот что я имею в моей модели User:

class User < ApplicationRecord
  attr_reader :password 

  validates :username, :email, :nickname, :gender, :birthday, :password_digest, :session_token, presence: true
  validates :username, :email, :session_token, uniqueness: true 
  validates :password, length: {minimum: 6}, allow_nil: true

  after_initialize :ensure_session_token
...

А вот более подробный взгляд на мою схему для таблицы пользователей:

# Table name: users
#
#  id              :bigint           not null, primary key
#  username        :string           not null
#  email           :string           not null
#  nickname        :string           not null
#  gender          :string           not null
#  birthday        :date             not null
#  password_digest :string           not null
#  session_token   :string           not null
#  created_at      :datetime         not null
#  updated_at      :datetime         not null

Может ли одна из этих проверок завершиться неудачно? Я предположил, что, поскольку значения для этих столбцов задаются в форме, мой пользователь пройдет проверку; но я ошибаюсь?

ОБНОВЛЕНИЕ: я исправил проблему с параметром электронной почты, но все еще, кажется, получаю ошибку состояния 401:

Started POST "/api/users" for ::1 at 2020-01-28 08:54:20 -0800
Processing by Api::UsersController#create as JSON
  Parameters: {"user"=>{"username"=>"", "password"=>"[FILTERED]", "nickname"=>"pooh", "gender"=>"male", "birthday"=>"2002-02-02", "email"=>"pooh10"}}
   (0.2ms)  BEGIN
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (1.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."username" = $1 LIMIT $2  [["username", ""], ["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "pooh10"], ["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
  User Exists (0.3ms)  SELECT  1 AS one FROM "users" WHERE "users"."session_token" = $1 LIMIT $2  [["session_token", "232kGIICEzCUSSesxgeYfg"], ["LIMIT", 1]]
  ↳ app/controllers/api/users_controller.rb:6
   (0.2ms)  ROLLBACK
  ↳ app/controllers/api/users_controller.rb:6
Completed 401 Unauthorized in 284ms (Views: 0.3ms | ActiveRecord: 12.3ms)

1 Ответ

0 голосов
/ 28 января 2020

В соответствии с параметрами вашего запроса для api/users.

Parameters: {"user"=>{"username"=>"racookin", "password"=>"[FILTERED]", "nickname"=>"racookin", "gender"=>"female", "birthday"=>"1990-07-07"}}

Вы не передаете электронную почту в своих параметрах. И в соответствии с вашими моделями вы добавили uniqueness подтверждение для электронной почты.

validates :username, :email, :session_token, uniqueness: true 

Теперь, когда активная запись пытается проверить вашу запись с существующими записями, она обнаружила запись с null email, поэтому она вернула проверку не удалось сообщение для вас.

Если вы хотите сохранить запись с нулевыми значениями, вам нужно добавить :allow_nil => true в ваших моделях для поля электронной почты.

Редактировать

, чтобы установить случайное имя пользователя в вашей users модели.

class User < ApplicationRecord
 .....
 .....
 .....
 before_save :assign_username


def assign_username
  return unless self.username.blank?
  self.username = SecureRandom.alphanumeric(8)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...