从控制器请求对象中抓取授权头的正确方法是什么?

问题描述 投票:15回答:2

我有两个RSpec测试,一个是控制器规范,一个是请求规范,我向同一个控制器的index操作发出GET请求。在这两个规范中,我都发送了一个包含Oauth2承载令牌的授权头。

我遇到的问题是,根据规范的类型,头存储在请求对象的不同属性上。在请求规范的情况下,它可以在以下位置找到。request.env["Authorization"] 而在控制器规格的情况下,它可以在以下网址获得 request.session["Authorization"].

为什么不同类型的规格的 "授权 "存储在不同的地方?有没有什么地方可以让我找到这两种规格的 "授权"?

这个 bearer_token 方法在父控制器类中,我从头中抓取令牌。

可以用... env 在请求规格中。

def bearer_token
  pattern = /^Bearer /
  header  = request.env["Authorization"] # <= env
  header.gsub(pattern, '') if header && header.match(pattern)
end

工作与 session 在控制器规格中。

def bearer_token
  pattern = /^Bearer /
  header  = request.session["Authorization"] # <= session
  header.gsub(pattern, '') if header && header.match(pattern)
end

这是我的请求规格。

describe '' do
  let(:user) { Fabricate(:user) }

  describe 'accessing content with valid token' do
    let(:token) { OauthToken.create(user: user) }
    let(:auth_headers) { {
      'Authorization' => "Bearer #{token.access_token}",
      'HTTPS' => 'on'
    } }
    before { get api_v2_cats_path, {}, auth_headers }
    specify { response.status.should == 200 }
  end
end

这是我的控制器规格

describe Api::V2::CatsController do
  let(:user) { Fabricate(:user) }

  describe ".index" do
    let(:token) { OauthToken.create(user: user) }
    let(:auth_headers) { {
      'Authorization' => "Bearer #{token.access_token}",
      'HTTPS' => 'on'
    } }

    it "should be valid" do
      get :index, { format: :json, page_size: 1 }, auth_headers
      @json = JSON.parse(response.body)
      @json.should_not be_nil
    end
  end
end
ruby-on-rails ruby-on-rails-3 rspec
2个回答
14
投票

我认为API对于控制器来说是一样的。get 方法在请求和控制器规范之间。在控制器规范中,第三个参数是session变量的哈希,而不是头变量。你可以直接在 @request 对象这样。

describe Api::V2::CatsController do
  let(:user) { Fabricate(:user) }

  describe ".index" do
    let(:token) { OauthToken.create(user: user) }
    let(:auth_headers) { {
      'Authorization' => "Bearer #{token.access_token}",
      'HTTPS' => 'on'
    } }

    before do
      @request.env.merge!(auth_headers)
    end

    it "should be valid" do
      get :index, { format: :json, page_size: 1 }
      @json = JSON.parse(response.body)
      @json.should_not be_nil
    end
  end
end

那么获取授权头的正确方法是用..:

def bearer_token
  pattern = /^Bearer /
  header  = request.env["Authorization"] # <= env
  header.gsub(pattern, '') if header && header.match(pattern)
end

1
投票

我找到了这个.

https:/github.comrailsrailscommitcf9d6a95e805bdddfa9c6b541631d51b3165bf23#diff-10b31f2069dfc4810229c8d60c3a4cda。

的控制器中,你可以做这样的事情来获取头值。


def index

  header_value = request.authorization

end
© www.soinside.com 2019 - 2024. All rights reserved.