配置带认证的Fiware IoT Agent JSON连接MongoDB时认证失败求助
问题描述
尝试通过docker-compose配置带认证的Fiware IoT Agent JSON与MongoDB连接,始终收到认证失败错误。已在IoT Agent中配置IOTA_MONGO_USER和IOTA_MONGO_PASSWORD环境变量,对应MongoDB的根用户名和密码。
docker-compose配置
iot-agent: image: fiware/iotagent-json:latest hostname: iot-agent container_name: fiware-iot-agent depends_on: - mongo-db networks: - fiware ports: - "4041:4041" - "7896:7896" environment: - IOTA_MONGO_HOST=mongo-db - IOTA_MONGO_PORT=${MONGO_DB_PORT} - IOTA_MONGO_USER=${MONGO_USER} - IOTA_MONGO_PASSWORD=${MONGO_PWD} - IOTA_MONGO_DB=iotagentul mongo-db: image: mongo:${MONGO_DB_VERSION} hostname: mongo-db container_name: db-mongo expose: - "${MONGO_DB_PORT}" ports: - "${MONGO_DB_PORT}:${MONGO_DB_PORT}" # localhost:27017 networks: - fiware volumes: - ./volumes/mongo-db/db:/data/db environment: - MONGO_INITDB_ROOT_USERNAME=${MONGO_USER} - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PWD}
错误日志
subsrv=n/a | msg=尝试连接MongoDB实例,URL为"mongodb://mongo-db:27017/iotagentul",选项为{"auth":{"user":"","password":""}}。第1次尝试 | comp=IoTAgent
(node:1) [MONGODB DRIVER] 警告:当前服务器发现和监控引擎已过时,将在未来版本中移除。要使用新的服务器发现和监控引擎,请向MongoClient构造函数传递选项 { useUnifiedTopology: true }。
(使用node --trace-warnings ...显示警告创建位置)
(node:1) [MONGODB DRIVER] 警告:未指定saslprep库,密码将不会被清理
time=2023-08-14T21:12:11.543Z | lvl=ERROR | corr=9ad5f04f-8b95-4292-837e-54c57de0461d | trans=9ad5f04f-8b95-4292-837e-54c57de0461d | op=IoTAgentNGSI.DbConn | from=n/a | srv=n/a | subsrv=n/a | msg=MONGODB-001: 连接MongoDB出错:MongoNetworkError: 首次连接服务器[mongo-db:27017]失败 [MongoError: 认证失败。
at Connection.messageHandler (/opt/iotagent-json/node_modules/mongodb/lib/core/connection/connection.js:364:19)
at Connection.emit (node:events:513:28)
at Connection.emit (node:domain:552:15)
at processMessage (/opt/iotagent-json/node_modules/mongodb/lib/core/connection/connection.js:456:10)
at Socket. (/opt/iotagent-json/node_modules/mongodb/lib/core/connection/connection.js:625:15)
at Socket.emit (node:events:513:28)
at Socket.emit (node:domain:552:15)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Socket.Readable.push (node:internal/streams/readable:228:10)
at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
at TCP.callbackTrampoline (node:internal/async_hooks:130:17) {
ok: 0,
code: 18,
codeName: 'AuthenticationFailed'
}]
排查与解决步骤
1. 验证环境变量传递
从错误日志{"auth":{"user":"","password":""}}可知,IoT Agent未正确读取到用户名和密码环境变量:
- 检查当前目录是否存在
.env文件,且文件内变量配置正确,示例:MONGO_USER=root MONGO_PWD=你的强密码 MONGO_DB_PORT=27017 MONGO_DB_VERSION=6.0 - 进入IoT Agent容器验证环境变量是否加载:
若输出为空或无对应值,需确保docker-compose正确读取docker exec -it fiware-iot-agent env | grep IOTA_MONGO.env文件(默认读取当前目录,否则需通过--env-file参数指定路径)。
2. 修复MongoDB认证数据库配置
MongoDB的MONGO_INITDB_ROOT_USERNAME默认创建在admin数据库中,而IoT Agent默认使用连接目标数据库(iotagentul)进行认证,导致权限验证失败。需为IoT Agent添加认证数据库指定:
在iot-agent的environment中新增变量:
- IOTA_MONGO_AUTH_SOURCE=admin
3. 重置MongoDB数据卷(若之前未启用认证启动过)
如果之前MongoDB未配置认证就已启动,数据卷中会残留无认证的数据库配置,需清理后重新启动:
docker-compose down -v docker-compose up -d
4. 验证连接状态
启动后查看IoT Agent日志,确认连接成功:
docker logs fiware-iot-agent
若出现类似Connected to MongoDB instance的日志,说明连接正常。
可选:解决MongoDB驱动警告
添加环境变量解决驱动版本警告:
- IOTA_MONGO_OPTIONS='{"useUnifiedTopology": true}'
内容的提问来源于stack exchange,提问作者Nuno Rolo

