使用Locust测试NextCloud页面遇401未授权错误求助
问题:Locust测试NextCloud时登录后访问受限页面返回401未授权
使用Locust对NextCloud网页进行负载测试,已成功登录并加载首页/,但访问/apps/dashboard/、/apps/deck/或/logout等页面时收到错误信息:401 Client Error: unauthorized for url: /apps/dashboard,疑似登录状态未保持,还未访问目标页面就已登出。
现有代码
import time from locust import HttpUser, task, between class StartUserBehavior(HttpUser): def on_start(self): self.login() def login(self): response = self.client.post('/login', json={'username':'admin', 'password':'adminpasswd'}) if response.status_code == 200: print('[+]Connection succeeded') else: print('[-]Connection failed') print('[-]Error :', response.status_code) def on_stop(self): response = self.client.get('/logout') if response.status_code == 200: print('[+]Disconnection succeeded') else: print('[-]Disconnection failed') print('[-]Error :', response.status_code) @task def view_pages(self): self.client.get('/') time.sleep(5) result = self.client.get('/apps/dashboard') time.sleep(5)
已做检查
- 网页地址正确
- 使用管理员账号登录
- 登录请求返回状态码200,确认登录操作成功
- 仅
/login和可自由访问的/页面正常,其他页面均返回401错误
解决方案
问题根源
NextCloud的登录验证依赖会话Cookie,但当前登录请求用json格式提交数据,和NextCloud实际的表单提交格式(application/x-www-form-urlencoded)不符,且参数名错误(应为user而非username),导致服务器未正确设置会话Cookie,后续请求无有效认证信息,返回401。
修改步骤
- 调整登录请求的提交格式和参数名:将
json参数改为data,并把username替换为user(NextCloud登录表单的字段名)。 - 修正登录成功的判断逻辑:NextCloud登录成功后通常会返回302跳转,所以需同时判断200和302状态码。
- 替换
time.sleep()为Locust内置的wait_time:符合Locust的最佳实践,更准确模拟用户行为。
修改后的完整代码
import time from locust import HttpUser, task, between class StartUserBehavior(HttpUser): wait_time = between(1, 3) # 模拟用户操作间隔,替代time.sleep def on_start(self): self.login() def login(self): # 用表单格式提交登录数据,参数名对应NextCloud表单字段 response = self.client.post('/login', data={'user':'admin', 'password':'adminpasswd'}) if response.status_code in (200, 302): print('[+]登录成功') else: print('[-]登录失败') print('[-]错误码:', response.status_code) def on_stop(self): response = self.client.get('/logout') if response.status_code in (200, 302): print('[+]登出成功') else: print('[-]登出失败') print('[-]错误码:', response.status_code) @task def view_pages(self): self.client.get('/') self.client.get('/apps/dashboard')
额外提示
- 可通过浏览器开发者工具(F12)查看登录请求的Form Data,确认字段名和提交格式,这是排查这类认证问题的通用方法。
- Locust的
HttpUser.client会自动管理Cookie,只要登录请求正确获取会话Cookie,后续请求会自动携带,无需手动处理。
内容的提问来源于stack exchange,提问作者Fangshi
相关产品推荐
相关产品推荐

