authenticate_or_request_with_http_token返回html而不是json

时间:2013-07-18 00:04:15

标签: ruby-on-rails json rails-api

我已经创建了一个rails-api应用程序并继续使用令牌身份验证来保护它。

我设置的before_filter正在调用使用authenticate_or_request_with_http_token的方法。一切正常,但是,当身份验证不正确时,我得到一个HTML回复。

如何定义响应的格式?

before_filter :restrict_access

private

def restrict_access
  authenticate_or_request_with_http_token do |token, options|
    check_token token
  end
end

def check_token(token)
  Session.exists?(access_token: token)
end

2 个答案:

答案 0 :(得分:31)

通过添加ActionController::HttpAuthentication::Token::ControllerMethods,您可以包含多种方法,其中request_http_token_authentication只是Token.authentication_request的包装。那个#authentication_request - 方法是罪魁祸首,并发送纯文本(不是你的问题建议的HTML),如下所示:

def authentication_request(controller, realm)
  controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
  controller.__send__ :render, :text => "HTTP Token: Access denied.\n", :status => :unauthorized
end

诀窍是覆盖request_http_token_authentication中的ApplicationController而不是调用Token.authentication_request,但要设置正确的状态和标头,然后再渲染JSON。将其添加到您的ApplicationController

protected
def request_http_token_authentication(realm = "Application")
  self.headers["WWW-Authenticate"] = %(Token realm="#{realm.gsub(/"/, "")}")
  render :json => {:error => "HTTP Token: Access denied."}, :status => :unauthorized
end

答案 1 :(得分:1)

在Rails 5中,authenticate_or_request_with_http_token方法允许使用带有自定义消息的第二个参数,因此您可以这样做:

df2[(df2!=df1.values).any(1)]