我是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创建新的控制器,或者可以使用该控制器?
答案 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
结束