【问题标题】:GET request with authorization headers (upgrade Rails-4.2 to Rails-5.1)带有授权标头的 GET 请求(将 Rails-4.2 升级到 Rails-5.1)
【发布时间】:2018-02-14 10:16:16
【问题描述】:

因此,我们正在将 Rails 应用程序从 Rails 4.2 升级到 Rails 5.1。一切都很顺利,直到我也必须升级我们的测试。我们有一个 oauth_spec 文件,用于检查我们的 Auth 流程是否一切正常。

我目前正在更改 Rspec 语法,所以一切正常,但我真的坚持我们的一项测试。它一直返回给我 401-未经授权,我想我已经阅读了我在 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

有人知道我可以做些什么来完成这项工作吗?

【问题讨论】:

  • 是否有特定原因将语法从 get('/users/me', data, {'HTTP_ACCEPT' => "application/json", "Authorization" => "Bearer #{token}"}) 更改为手动将标头添加到 request 对象然后 get '/users/me'

标签: ruby-on-rails rspec ruby-on-rails-5 doorkeeper


【解决方案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"}

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2015-11-27
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多