gpt4 book ai didi

ruby-on-rails - 从 Controller 请求对象中获取 Authorization header 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 20:45:24 27 4
gpt4 key购买 nike

我有两个 RSpec 测试,一个 Controller 规范和一个请求规范,我正在向同一个 Controller 的索引操作发出 GET 请求。在这两个规范中,我都发送了一个包含 Oauth2 不记名 token 的 Authorization header 。

我遇到的问题是,根据规范的类型, header 存储在请求对象的不同属性上。在请求规范的情况下,它可以在 request.env["Authorization"] 获得。对于 Controller 规范,可在 request.session["Authorization"] 获得。 .

为什么“授权”针对不同类型的规范存储在不同的地方?有什么地方可以找到这两个规范的吗?

bearer_token方法在父 Controller 类中,我从标题中获取 token :

env 一起使用在请求规范中:

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

session 一起使用在 Controller 规范中:
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

这是我的 Controller 规范
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

最佳答案

我假设 get 的 API 是相同的请求和 Controller 规范之间的方法。在 Controller 规范中,第三个参数是 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

那么获取授权 header 的正确方法是使用:
def bearer_token
pattern = /^Bearer /
header = request.env["Authorization"] # <= env
header.gsub(pattern, '') if header && header.match(pattern)
end

关于ruby-on-rails - 从 Controller 请求对象中获取 Authorization header 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com