создание бэкэнда API входа в систему с помощью рельсов - PullRequest
0 голосов
/ 18 июня 2019

Я реагирую, приложение звонит Рубину по рельсам.Я создаю страницу входа в систему, я застрял в части аутентификации пароля.получение ошибки

 "#<ArgumentError: wrong number of arguments (given 0, expected 1)>"

ошибка происходит в этой строке

  if user && user.authenticate(password)

здесь от коммандной строки enter image description here

этоusers_controller.rb

class Api::V1::UsersController < ApplicationController
before_action :authenticate_with_token!, only: [:logout]

def facebook
 enter code hereif params[:facebook_access_token]
  graph = Koala::Facebook::API.new(params[:facebook_access_token])
  user_data = graph.get_object("me?fields=name,email,id,picture")

  user = User.find_by(email: user_data['email'])
  if user
    user.generate_authentication_token
    user.save
    render json: user, status: :ok
  else
    user = User.new(
                fullname: user_data['fullname'],
                email: user_data['email'],
                uid: user_data['id'],
                provider: 'Facebook',
                image: user_data['picture']['data']['url']
            )
    user.generate_authentication_token

    if user.save
      render json: user, status: :ok
    else
      render json: { error: user.errors, is_success: false}, status: 422
    end
  end
  else
  render json: { error: "Invalid Facebook Token", is_success: false}, status: :unprocessable_entity
  end
end

def logout
 user = User.find_by(access_token: params[:access_token])
 user.generate_authentication_token
 user.save
 render json: { is_success: true}, status: :ok
end

def login
 email = user_params[:email]
 password = user_params[:password]
 user = User.find_by(email: email)
 if user && user.authenticate(password)
    session[:user_id] = user.id
    render json: user, status: :ok
 else
 render json: { error: user.errors, is_success: false}, status: 422
 end
end

def add_card
user = User.find(current_user.id)
if user.stripe_id.blank?
  customer = Stripe::Customer.create(
    email: user.email
  )
  user.stripe_id = customer.id
  user.save
else
  customer = Stripe::Customer.retrieve(user.stripe_id)
end

customer.sources.create(source: params[:stripe_token])
render json: { is_success: true}, status: :ok
rescue Stripe::CardError => e
render json: { error: e.message, is_success: false}, status: :not_found
end

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

end

вот маршруты. rb

Rails.application.routes.draw do
namespace :api, defautls: {format: :json} do
namespace :v1 do
  get '/logout' => 'users#logout'
  get '/login' => 'users#login'
  post '/login' => 'users#login'
  post '/signup' => 'users#signup'
  end
 end
end

вот user.rb модель

class User < ApplicationRecord
 has_secure_password
 before_create :generate_authentication_token
 devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, 
 :validatable,
     :confirmable, :omniauthable
 validates :fullname, presence: true, length: {maximum: 
 50}
end
def generate_authentication_token
 begin
  self.access_token = Devise.friendly_token
 end while self.class.exists?(access_token: access_token)
end

это вызов API, который я делаю enter image description here

это JSON, который я посылаю

{"email": "bearatamer+testfour@gmail.com", "password": "amer1234"}

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Если вы видите скриншот консоли, к которой вы прикрепили , вы заметите, что параметры: email, password, defaults и user, если вы присмотритесь, вы увидите, что это user имеет хеш, который содержит только электронную почту и не содержит пароля. Это дает нам подсказку.

Теперь в вашем методе user_params:

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

Здесь params.require(:user) потребует наличия ключа с именем user, который присутствует , в противном случае будет выдана ошибка. Далее у вас есть: .permit(:email, :password), который разрешает эти два параметра в хэш-ключе родительского user ключа.

Теперь, похоже, что какая-то проблема в отправляемом JSON, либо вы не опубликовали полный JSON, либо что-то преобразует ваш JSON перед отправкой, или перед обработкой его в контроллере (что очень маловероятно, если кто-то делает такой вид). Кастомизация, но кто знает).

Решение: Если бы я был вами, я дважды проверил бы мой json, или на самом деле я вышлю только этот json: {"user": {"email": "bearatamer+testfour@gmail.com", "password": "amer1234"}} или, если вы не хотите вкладывать под ключом user, вы должны удалить require от сильных параметров на ключе user.

0 голосов
/ 19 июня 2019

проблема была с этой строкой

 if user && user.authenticate(password)

как только я перехожу на эту, она работает

 if user && user.valid_password?(params[:password])
...