Stack level too deep

Mam taki kod.

     def user_signed_in?
        if current_user.nil?
          render_error(401, 'User not signed in. Wrong authorization token')
        end
      end

      def current_user
        User.find_by(token: http_auth_header)
      end


      def http_auth_header
        if request.headers['Authorization'].present?
           request.headers['Authorization'].split(' ').last
        else
          render_error(401, 'No Authorization token')
        end
      end

      def render_error(code, resource)
        if resource.respond_to?(:errors)
          resource_name = resource.class.name.demodulize.to_s.downcase.to_sym
          render status: code, json: {
              status: code,
              errors: resource.errors,
              resource_name => ActiveModel::Serializer.serializer_for(resource).new(resource)
          }
        else
          render json: {status: code, error: resource.to_s}, status: code
        end
      end

Zapętla się on jeśli nie jest ustawiony headers[‘Authorization’].

app/controllers/v1/api_controller.rb:21:in http_auth_header' app/controllers/v1/api_controller.rb:13:incurrent_user’
app/controllers/v1/api_controller.rb:34:in render_error' app/controllers/v1/api_controller.rb:21:inhttp_auth_header’
app/controllers/v1/api_controller.rb:13:in current_user' app/controllers/v1/api_controller.rb:34:inrender_error’
app/controllers/v1/api_controller.rb:21:in http_auth_header' app/controllers/v1/api_controller.rb:13:incurrent_user’
app/controllers/v1/api_controller.rb:7:in `user_signed_in?’

Nie bardzo rozumiem, dlaczego po render_error następuje ponowna próba wywołania current_user.

Bez wchodzenia w szczegóły proponuje wycofać się z tej autentykacji i napisać od nowa bazując na którejś propozycji od Devise

Pozdrawiam

uwierzytelniania

Jakoś średnio widzi mi się ładowanie Devise do tego co potrzebuje. Zresztą bardziej interesuje mnie zrozumienie skąd bierze się taka rekurencja.

user_signed_in?

powinien zwrócić true/false (konwencja) względnie instancję lub nil

tymczasem gdy user nie jest znaleziony metoda zwraca JSON w ujęciu true/false true

Do wywołania

User.find_by(token: ...)

trafia jedna z dwóch rzeczy
albo String wycięty z parametru Authorization # czy to jest autoryzacja ?

albo wyrenderowany JSON z render_error (który tokenem nie jest i nie powinien być przekazany Userowi jako potencjalny token do wyszukania)

Tu stwierdziłem …[quote=“Snickers, post:4, topic:14122”]
średnio widzi mi się
[/quote]

… code flow … najlepiej wycofać się z całości

jak to zrobili inni ?

Proponuje zajrzeć tutaj i przejrzeć inne rozwiązania z wcześniejszego posta

Pozdrawiam

p.s.

@Jacki polonistka mnie nigdy nie lubiła :blush:

Dzięki DarkCoin, przejrzę jeszcze Devise.