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それらは単に .xml のラッパー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

トリックは、呼び出すのではなく、正しいステータスとヘッダーを設定し、代わりに JSON をレンダリングするようにオーバーライドrequest_http_token_authenticationする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 に答える