Цепочка фильтров остановлена ​​как :authenticate_with_token! визуализированный или перенаправленный API Rails

Итак, я работаю над API на основе местоположения с рельсами, где у местоположения есть много пользователей, и пользователь принадлежит местоположению в определенное время. Это означает, что пользовательская таблица будет содержать столбец location_id, который служит внешним ключом. Это, однако, отличается от большинства приложений, над которыми я работал, например, в которых у пользователя будет много «продуктов». Итак, у меня есть это в моем файле location_controller.rb

class Api::V1::LocationsController < ApplicationController
    before_action :authenticate_with_token!, only: [:create]
    respond_to :json

    def show
        respond_with Location.find(params[:id])
    end

    def create
        # @location = current_user.locations.build(location_params)
        @location = Location.new(location_params)
        current_user.location = @location
        current_user.save
        if @location.save
            render json: @location, status: :created, location: [:api, :v1, @location]
        else
            render json: {errors: @location.errors}, status: :unprocessable_entity
        end
    end

    private


    def location_params
        params.require(:location).permit(:latitude, :longitude, :address)
    end
end

Но я получаю ошибку

Started POST "/api/v1/locations" for 127.0.0.1 at 2016-12-20 10:05:50 +0100
Processing by Api::V1::LocationsController#create as JSON
  Parameters: {"location"=>{"latitude"=>"2.23413", "longitude"=>"2.908019", "address"=>"Sims1 streets"}}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."auth_token" IS NULL LIMIT 1
Filter chain halted as :authenticate_with_token! rendered or redirected
Completed 401 Unauthorized in 5ms (Views: 0.2ms | ActiveRecord: 0.5ms)

Мой вопрос: как мне это решить? Я искал везде, но все безрезультатно. Пожалуйста помоги

Мой файл authentication.rb

module Authenticable

  # Devise methods overrides. This finds the user by auth_token and it's sent to the server
  def current_user
    @current_user ||= User.find_by(auth_token: request.headers["Authorization"])
  end

  def authenticate_with_token!
    render json: { errors: "Not authenticated" }, status: :unauthorized unless user_signed_in?
  end

  def user_signed_in?
    current_user.present?
  end

end

person Dayvino    schedule 20.12.2016    source источник
comment
Если request.headers["Authorization"] пусто или равно нулю, вы войдете в систему как первый найденный пользователь, у которого не установлено auth_token. Убедитесь, что request.headers["Authorization"] не равно нулю!   -  person mattes    schedule 21.12.2016


Ответы (1)


Вы вызываете обратный вызов перед действием создания

before_action :authenticate_with_token!, only: [:create]

поэтому всякий раз, когда вы переходите к этому действию, оно будет запрашивать действительный токен аутентификации, действие не будет выполняться до тех пор, пока не будет предоставлен действительный токен аутентификации.

Как вы можете видеть в своей консоли

 User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."auth_token" IS NULL LIMIT 1

Токен авторизации пользователя имеет значение null.

Пожалуйста, попробуйте отправить действительный токен авторизации для аутентификации пользователя перед созданием действия.

Возможно, у вас есть столбец auth_token в вашей таблице пользователей. Попробуйте найти authentication_token для любого пользователя и передать его в своем URL-адресе.

i.e

 /api/v1/locations?user_token= your token 
person kajal ojha    schedule 20.12.2016
comment
Пожалуйста, @kajalOjha, как мне это сделать? Я провел мозговой штурм о том, как этого добиться. Пожалуйста, помогите мне. Спасибо - person Dayvino; 20.12.2016
comment
Большое спасибо. Я проверю это сейчас. На самом деле я делал /api/v1/locations?auth_token= ваш токен раньше - person Dayvino; 21.12.2016
comment
Хотя это не сработало, я думаю, что проблема связана с этой строкой def current_user @current_user ||= User.find_by(auth_token: request.headers["Authorization"]) end. Мне нужно посмотреть, как я могу справиться с этим - person Dayvino; 21.12.2016
comment
попробуйте отладить проблему, что вы получаете в request.headers[Authorization] - person kajal ojha; 21.12.2016
comment
Все равно никак. Может быть, подойдет другой подход к этому. Но найти другой хороший способ для меня проблема. Большинство учебников старые - person Dayvino; 21.12.2016
comment
Я думаю, что исправил проблему. Я изменил auth_token: request.headers["Authorization"] на auth_token: params[:auth_token] и это исправило. Только то, что мне нужно снова переписать мой тест. Спасибо @kajal - person Dayvino; 21.12.2016
comment
Обязательно проверьте, не является ли request.headers["Authorization"] nil, прежде чем делать такой запрос. :-) - person mattes; 21.12.2016