17

我创建了一个 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
4

2 回答 2

32

通过包括ActionController::HttpAuthentication::Token::ControllerMethods你包括几个方法,其中request_http_token_authentication只是一个简单的Token.authentication_request. 该#authentication_request-method 是罪魁祸首,并发送纯文本(不是您的问题所暗示的 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在您调用但设置正确的状态和标头然后呈现 JSON 的情况ApplicationController下覆盖。将此添加到您的:Token.authentication_requestApplicationController

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
于 2013-08-29T11:45:46.290 回答
1

从 Rails 5 开始,authenticate_or_request_with_http_token方法允许带有自定义消息的第二个参数,所以你可以这样做:

  authenticate_or_request_with_http_token('realm', json_error) do |token, options|
    check_token token
  end
于 2020-06-04T21:22:32.420 回答