我已经创建了一个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
答案 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)]