Итак, мы обновляем наше приложение Rails с Rails 4.2 до Rails 5.1. Все шло хорошо, пока мне не пришлось обновить наши тесты. У нас есть файл oauth_spec для проверки того, что все работает с нашим процессом аутентификации.

В настоящее время я меняю синтаксис Rspec, поэтому все работает нормально, но я действительно застрял в одном из наших тестов. Он продолжает возвращать мне 401-Unauthorized, и я думаю, что прочитал все, что смог найти на StackOverflow по этому поводу.

Вот как выглядел наш тест в 4.2:

it "grants access to a user's data when he sets an Authentication token as a request parameter" do
  data =
  {
    "grant_type" => "password",
    "password" => password,
    "username" => user.email
  }
  post('/oauth/token', data, {'HTTP_ACCEPT' => "application/json"})
  token = json["access_token"]
  get('/users/me', data, {'HTTP_ACCEPT' => "application/json", "Authorization" => "Bearer #{token}"})

  expect(response).to have_http_status(200)
  expect(json["email"]).to eq(user.email)
end

И вот что у меня получилось:

it "grants access to a user's data when he sets an Authentication token as a request parameter" do
  data =
  {
    "grant_type" => "password",
    "password" => password,
    "username" => user.email
  }
  post "/oauth/token", params: data
  token = json["access_token"]

  header = {"Authorization": "Bearer #{token}", "Accept": "application/json"}
  request.headers.merge!(header)
  get '/users/me'

  expect(response).to have_http_status(200)
  expect(json["email"]).to eq(user.email)
end

Первый почтовый запрос работает нормально и дай мне моего носителя. Но вот следующий перерыв, и я всегда получаю:

Отказ / ошибка: expect (response). To have_http_status (200) ожидал, что ответ будет иметь код состояния 200, но это было 401

Кто-нибудь знает, что я могу сделать, чтобы это сработало?

1
Vanessa 14 Фев 2018 в 13:16

1 ответ

Лучший ответ

Ваш оригинальный код:

get('/users/me', data, {'HTTP_ACCEPT' => "application/json", "Authorization" => "Bearer #{token}"})

Ваш новый код:

header = {"Authorization": "Bearer #{token}", "Accept": "application/json"}
request.headers.merge!(header)
get '/users/me'

В исходном коде вы передали data, то есть имя пользователя и пароль, в качестве параметров, тогда как в коде Rails 5 вы больше не передаете эти данные. Это может быть одной из причин ошибки 401, но, учитывая название спецификации, я не думаю, что это так.

Я рекомендую вам просто сделать:

get '/users/me', headers: {"Authorization": "Bearer #{token}", "Accept": "application/json"}
1
Tamer Shlash 14 Фев 2018 в 14:52