Ruby on Rails Web应用程序和API并发问题

时间:2018-12-02 15:34:09

标签: ruby-on-rails ruby authentication jwt

我是Ruby的新手。我需要维护一个完整的Web应用程序项目。现在,我需要在其中引入API。我已经搜索并分别获得了许多关于API和Web应用程序的教程。但是没有任何人展示这些东西将如何协同工作。我对身份验证如何同时适用于两者感到困惑。 这是application_controller.rb:

class ApplicationController < ActionController::Base
  helper_method :sort_column, :sort_direction

  protect_from_forgery

  before_filter :authenticate_user!
  # before_filter :authenticate # HTTP AUTH DISABLED

  rescue_from CanCan::AccessDenied do |exception|
    render :file => "#{Rails.root}/public/403.html", :status => 403, :layout => false
    ## to avoid deprecation warnings with Rails 3.2.x (and incidentally using Ruby 1.9.3 hash syntax)
    ## this render call should be:
    # render file: "#{Rails.root}/public/403", formats: [:html], status: 403, layout: false
  end  

  def user_for_paper_trail
    if user_signed_in?
      current_user.full_name
    end
  end

  def info_for_paper_trail
    if user_signed_in?      
      { :user_id => current_user.id }
    end
  end    

  protected
  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == "admin" && password == "123"
    end
  end  

end

我需要知道如何验证API?如果我使用JWT,则如何覆盖sign_in方法并分别为API做所有这些事情,这对我来说也很麻烦,因为身份验证已经存在。 此外,如果我知道如何在控制器中包含API函数,这将是有帮助的。就像我的用户控制器以及用于Web应用程序的所有方法一样。现在,我需要相同的API方法。所以我需要为API创建新的控制器,或者可以使用该控制器?

2 个答案:

答案 0 :(得分:0)

这里有很多问题,所以我会尝试给出一个概括的答案:

通常,其他控制器从ApplicationController继承,后者在您的情况下运行before_filter。过滤器可以重定向或渲染,因此阻止执行特定路由。由于所有控制器都继承自ApplicationController,因此过滤器会在应用程序的每个操作之前运行(假设最常见的默认情况)。

大概,API身份验证应该以与应用程序的html前端不同的方式工作(也许在标头中有api键)。您的应用似乎正在使用https://github.com/plataformatec/devise。我将看看它是否可以使用它为您的API“开启”合适的身份验证方法。

我希望这会有所帮助。

答案 1 :(得分:0)

对我来说有效的解决方案是将具有devise_token_auth的友好令牌用于api。这是我的之前过滤器:

before_filter do
if check_api_request
  authenticate_api_request
else
  authenticate_user!
end

结束