我创建了一个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
解决方法
通过包括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
诀窍是覆盖ApplicationController中的request_http_token_authentication,以不调用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