Невозможно получить доступ к любым методам / объектам Grape :: API внутри блока http_basic - PullRequest
4 голосов
/ 26 августа 2011

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

Вот код, который у меня есть:

require 'grape'

module MyApp
  class API < Grape::API
    prefix 'api'
    version 'v1'

    helpers do
      def current_user
        @current_user ||= User.authenticate(env)
      end

      def authenticate!
        error!('401 Unauthorized', 401) unless current_user
      end
    end

    resources :projects do

      http_basic do |u,p|
        authenticate!                    #=> Results in undefined method `authenticate!' for MyApp::API:Class (NoMethodError)
        error! "401 Unauthorized", 401
        !current_user.nil?
      end
    end
  end
end

Кажется, я не могу получить доступлюбые методы или объекты внутри блока http_basic, включая запрос, env, все, что находится внутри методов helpers, и даже не ошибки!.

Глядя на код, это не имеет смысла.

Кто-нибудь сталкивался с этим раньше?У кого-нибудь есть примеры использования Grape API с http базовой аутентификацией?Примеры в Интернете не являются примерами из реальной жизни.

1 Ответ

6 голосов
/ 30 августа 2011

Grape хранит ваш блок http_basic как процесс в хэше настроек.Метод build_endpoint в Grape::API сводит все это к следующему:

Rack::Builder.new.use Rack::Auth::Basic, "API Authorization", &your_block

Ваши помощники в данный момент недоступны.(См. https://github.com/intridea/grape/blob/master/lib/grape/api.rb#L258)

. Вы можете попытаться реализовать это без помощников, используя метод класса в вашей модели User, например:

http_basic do |user, password|
  User.authenticate(user, password)
end

Если User также не является 't, реализуйте свою базовую аутентификацию, используя Rack::Builder, как в строке выше.

...