1

基本的な http 認証を実装しようとしていますが、認証されているアカウントのステータスに基づいて、さまざまな HTTP ステータス コードを返す必要があります。私は Sinatra を使用して API をホストしています。これが私のアプリケーションの外観です。

require 'rubygems'
require 'bundler/setup'
require 'sinatra'
require 'active_record'
require 'openssl'

# Define the paths that the application responds to, and include the authentication mechanism to provide
# basic HTTP authentication using the Rack middleware.
use Rack::Auth::Basic do |username, password|
  result = LoginApi::User.authenticate(username, password)

  # Check the status of the user we just authenticated. If he is banned or unverified then we
  # need to return special responses.
  throw :halt, [403, 'User is banned'] if LoginApi::AuthUser.user.banned?
  throw :halt, [412, 'User is not verified'] unless LoginApi::AuthUser.user.verified?

  # Return the result if no exceptions were raised in the meanwhile
  result
end

# This action responds on the root of the application and will return the basic authentication of a User
# in the headers. This is done by Rack::Auth, which requires the credentials to be sent in the initial
# call so they can be verified by the application
get '/' do
  headers \
    "X-UserID" => "#{LoginApi::AuthUser.user.id}|",
    "X-P1" => "#{LoginApi::AuthUser.p1}",
    "X-P2" => "#{LoginApi::AuthUser.p2}"
end

したがって、基本的には、OK 認証の場合はステータス 200、禁止されたユーザーの場合は 403、検証されていないユーザーの場合は 412、認証が失敗した場合は 400 を返します。

問題は、テストをこれで適切に動作させることができないことです。通常の認証のテストは問題なく機能し、合格しますが、カスタム HTTP ステータス応答を確認する必要があるテストは次のエラーで失敗します。

ArgumentError: uncaught throw :halt ./app.rb:23:in throw' ./app.rb:23:inblock in ' ./features/step_definitions/when_steps.rb:8:in /^I make the call to the API$/' ./features/banned.feature:8:inWhen I make the API to'

スキップされたステップ

これを希望どおりに機能させるために、私が間違っていることや欠けていることを誰かが説明してもらえますか?

4

1 に答える 1

0

禁止および未検証のチェックをアクションの本体に移動し、そこで結果を処理するだけです。

Rackヘルパーでそれを行うことができないのは残念です...

于 2012-05-23T13:35:20.243 に答える