2015-06-29 1 views
2

Я использую самородку Autodesk Autodesk (https://github.com/lynndylanhurley/devise_token_auth) с несколькими пользователями и получаю странную ошибку при попытке аутентификации. Я создаю devise_token_auth_group, который позволяет мне аутентифицировать несколько типов пользователей. Однако ни одно из нижеприведенных условий или elsif не выполнено, хотя, как представляется, before_action :authenticate_user! передает действие индекса (поскольку оно не отображает или не перенаправляет и не позволяет запустить действие индекса). Любые идеи, если я делаю это неправильно или что-то не хватает?Несколько типов пользователей - групповая аутентификация - анонимный токен Auth

Я вхожу в качестве покупателя и должен получать все адреса, когда я отправляю запрос на это действие. Сначала я получаю все места. Однако после многократного обращения к серверу каждые 5 секунд @locations заканчивается пустым, потому что не выполняются никакие условия if или elsif ... Это заставляет меня думать, что перед действием не работает должным образом. В качестве теста я попытался просто нанести удар по этому маршруту, используя PostMan Rest Client без токена доступа, и каким-то образом он вернул пустой массив, поэтому я считаю, что именно там проблема.

devise_token_auth_group :user, contains: [:shopper, :merchant] 
before_action :authenticate_user!, except: [:update] 
before_action :authenticate_merchant!, only: [:update] 

def index 
    if merchant_signed_in? 
     @locations = Location.where(merchant_company_id: params[:merchant_company_id]) 
    elsif shopper_signed_in? 
     @locations = Location.all 
    end 

    # the @locations variable sometimes has all locations (as expected) 
    # but after a bunch of sequential requests, it is empty so the action renders "null" 
    render json: @locations, status: 200 
end 
+0

Можете ли вы сказать мне, если 'user_signed_in?' Функция возвращает истину? И если вы можете получить доступ к помощнику 'current_user'? –

+0

К сожалению, 'current_user' -' nil', а 'user_signed_in?' Возвращает false, но я очень надеюсь, увидев ваше предложение ниже. Возможно ли, что эти методы в ссылке, которую вы включили, не проходят должным образом? Кроме того, похоже, что это может быть связано с дросселем запроса партии? –

+0

Я считаю, что это действительно связано с пакетным запросом, и это проблема в GitHub, которая связана: https://github.com/lynndylanhurley/devise_token_auth/issues/188 Кроме того, если вы получаете доступ к этому маршруту и не предоставляйте токен доступа, вы должны получить 401 Unauthorized, потому что 'before_action: authenticate_user!' должен отображать или перенаправлять. Вместо этого, как описано в OP, он возвращает пустой массив ('@ locations') –

ответ

1

Для index действия, вы называете :authenticate_user! помощника, так, в этой акции, вы можете получить доступ к user_signed_in? и current_user хелперов, полученные от вашего authenticate_user! вызова.

Согласно this part of the gem code, мы можем прочитать, что authenticate_XXX!, XXX_signed_in и current_XXX генерируются с devise_token_auth_group как XXX, так user.

В этом случае, вы можете только хелперы доступа, сгенерированный devise_token_auth_group именем:

  • authenticate_user!
  • user_signed_in?
  • current_user
  • current_users

Хороший способ изменить ваш код выглядит так:

devise_token_auth_group :user, contains: [:shopper, :merchant] 
before_action :authenticate_user!, except: [:update] 
before_action :authenticate_merchant!, only: [:update] 

def index 
    if current_user.is_a? Shopper 
     @locations = Location.where(merchant_company_id: params[:merchant_company_id]) 
    elsif current_user.is_a? Merchant 
     @locations = Location.all 
    end 

    # the @locations variable sometimes has all locations (as expected) 
    # but after a bunch of sequential requests, it is empty so the action renders "null" 
    render json: @locations, status: 200 
end 

More documentation here