
Jina credential validation POST lacks bounded timeout
快速结论:Jina API Key 凭证校验请求缺少显式超时设置,导致当 Jina 服务端响应缓慢或挂起时,Dify 的凭证校验可能无限阻塞。优先排查 services/auth/jina/jina.py 中 _post_request() 方法是否传递了 timeout 参数。
问题场景
在 Dify 应用中配置或校验 Jina Reader API Key 时触发。具体涉及 services.auth.jina.jina.JinaAuth.validate_credentials() 方法,该方法在校验 Jina 凭证时通过 _post_request() 发起 HTTP POST 请求。
报错原文
E KeyError: 'timeout'
此报错出现在运行单元测试时:
uv run --project api pytest -o addopts='' api/tests/unit_tests/services/auth/test_jina_auth.py::TestJinaAuth::test_should_validate_valid_credentials_successfully -q
原因分析
JinaAuth._post_request() 方法当前实现为:
def _post_request(self, url, data, headers):
return _http_client.post(url, headers=headers, json=data)
该调用未传递 timeout 参数,且整个 _http_client 池在初始化时也未设置默认超时。这与 Dify 中其他已加固的认证路径(如 Firecrawl #37521、Nacos PR #37444)采用的显式超时策略不一致。测试用例期望 timeout 键存在但实际缺少,因此抛出 KeyError。
环境排查
- Dify 版本:
main分支 - 检查文件
api/services/auth/jina/jina.py中_post_request()方法的实现 - 确认同一目录下
FirecrawlAuth、WatercrawlAuth等其它认证提供者是否存在相同问题
解决步骤
- 定位到
api/services/auth/jina/jina.py文件。 - 修改
_post_request()方法,在调用_http_client.post()时添加显式超时参数:def _post_request(self, url, data, headers): return _http_client.post(url, headers=headers, json=data, timeout=httpx.Timeout(10.0, connect=3.0))该超时值与 Dify 最近其他认证路径加固 PR(如 #37444)中使用的常量一致。
- (可选)如果多个
services/auth/下的认证提供者(FirecrawlAuth、WatercrawlAuth、JinaAuth)都存在此问题,可考虑在同一 PR 中统一修复。
验证方法
运行单元测试确认修复生效:
uv run --project api pytest -o addopts='' api/tests/unit_tests/services/auth/test_jina_auth.py::TestJinaAuth::test_should_validate_valid_credentials_successfully -q
测试应不再抛出 KeyError: 'timeout' 并顺利通过。同时可模拟 Jina 服务端超时场景,确认凭证校验不会无限阻塞。



