gpt4 book ai didi

ruby-on-rails - 如何测试使用 Rails 5 创建的经过身份验证的 API?

转载 作者:行者123 更新时间:2023-11-28 21:17:49 24 4
gpt4 key购买 nike

我有一个需要身份验证的 API,它是使用 Rails 5 创建的。身份验证的基本流程是用户使用 Base64 编码的 Authorization: Basic header 中的用户名/密码执行登录,以及 API key 。然后将其交换为授权 token ,该 token 记录在用户数据库表中并在一段时间内有效。后续 API 调用需要在 Authorization: Bearer header 中使用此 token 。

我遇到的问题是,当我尝试测试需要身份验证的 Controller 时,我必须完成让用户登录的过程(以确保 auth_token在测试数据库表中,因为这可能是正在运行的第一个测试,等等...)这很复杂,因为,例如,如果我正在测试一个名为 RecipesController 的 Controller ,并且我的身份验证位于 AuthController 中,我需要切换 Controller 才能执行登录操作。

我过去在 spec_helper.rb 中使用类似的东西成功地做到了这一点:

def login username, password
current_controller = @controller
... setup login call ...

post :login

@controller = current_controller
... return auth token ...
end

但是,正如我在 Why are parameters not being passed within my test in Rails 5? 中了解到的那样,我相信这搞乱了我的测试请求,结果参数丢失了。

不过,这似乎是一种非常简单易用的模式,所以我想知道如何测试它?实际上,我更愿意单独测试身份验证,并只传递一个模拟的用户对象,但我不确定该怎么做,因为我对 Rails 的熟悉程度不如我希望的那样。

最佳答案

在 ApplicationController 中有您的 Auth 验证功能(假设您的 Recipes 继承自此)

def current_user
return nil unless auth_token
User.find(decoded_token['user_id'])
end

def authenticate_with_token
head(:unauthorized) unless user_signed_in?
end

private

def user_signed_in?
current_user.present?
end

def auth_token
return nil unless request.headers['Authorization'].present?
request.headers['Authorization']&.split(' ')&.last
end

def decoded_token
JsonWebToken.decode(auth_token) #use your own decoder class
end

然后您可以在需要身份验证的操作上添加 before_action :authenticate_with_token

对于测试,您可以添加一个助手来登录用户,这样您就不会在所有需要身份验证的地方重复。

module LoginSupport
def login_user(user:, password:)
valid_credentials = { "email": user.email, password: password}
post '/auth/sessions', params: valid_credentials

valid_jwt_token = JSON.parse(response.body)["token"]
{ "Authorization": "Bearer #{valid_jwt_token}" }.merge(json_api_headers)
end

def json_api_headers
{'Accept' => JSONAPI::MEDIA_TYPE, 'CONTENT_TYPE' => JSONAPI::MEDIA_TYPE}
end
end

RSpec.configure do |config|
config.include LoginSupport
end

然后在 RecipesContoller 测试或任何其他地方的请求中使用返回的 Auth token 。

关于ruby-on-rails - 如何测试使用 Rails 5 创建的经过身份验证的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55293768/

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