开启 Nacos 服务端 Token 鉴权需要配置 nacos.core.auth.enabled=true 并设置自定义 Token 密钥,适用于所有生产环境部署,但需注意 Nacos 默认鉴权是弱鉴权体系,不适合高安全诉求场景。
先说结论:Nacos 服务端 Token 鉴权通过启用 auth.enabled 参数并配置自定义密钥实现,能有效防止未授权访问配置和服务注册接口。
- 先判断:确认部署方式(Docker/K8S/直接部署)和网络环境(内网/公网)
- 优先做:配置 nacos.core.auth.enabled=true 和 nacos.core.auth.plugin.nacos.token.secret.key 密钥
- 再验证:通过 OpenAPI 登录获取 accessToken 并测试带 Token 访问配置接口
命令速用版
Docker 部署开启鉴权的完整命令:
dockerrun`--namenacos-server`\-p8848:8848\-e MODE=cluster\-e NACOS_AUTH_ENABLE=true\-e NACOS_AUTH_TOKEN=您的 Base64 编码密钥\-e NACOS_AUTH_IDENTITY_KEY=自定义身份识别 key\-e NACOS_AUTH_IDENTITY_VALUE=自定义身份识别 value\nacos/nacos-server
OpenAPI 登录获取 Token:
curl-XPOST'127.0.0.1:8848/nacos/v3/auth/user/login'\-d'username=nacos&password=nacos'
带 Token 访问配置接口:
curl-XGET'127.0.0.1:8848/nacos/v2/cs/config?accessToken=您的 accessToken'
为什么会这样
Nacos 默认不开启鉴权是为了方便内部可信网络快速部署,但生产环境必须开启。
Nacos 是内部微服务组件,设计定位是在可信内部网络运行。默认鉴权实现是弱鉴权体系,主要防止业务错用而非恶意攻击。开启鉴权后,客户端、SDK 和 OpenAPI 都需要配置身份信息才能访问 Nacos 服务。Token 机制是轻量级认证方式,客户端首次通过用户名密码认证成功后,服务端使用密钥生成有时效性的 Token,后续请求携带 Token 即可授权访问。
分步处理
步骤 1:确定部署方式
K8S/Docker 部署通过环境变量配置,直接部署修改 application.properties 文件。Docker 部署使用 NACOS_AUTH_ENABLE、NACOS_AUTH_TOKEN、NACOS_AUTH_IDENTITY_KEY、NACOS_AUTH_IDENTITY_VALUE 环境变量。直接部署在 conf/application.properties 中添加对应参数。
步骤 2:配置鉴权核心参数
必须配置以下参数:
- nacos.core.auth.enabled=true(开启鉴权功能开关)
- nacos.core.auth.plugin.nacos.token.secret.key(生成 Token 的密钥,建议大于 32 位字符串,进行 Base64 编码)
- nacos.core.auth.server.identity.key(服务端身份标识的键)
- nacos.core.auth.server.identity.value(服务端身份标识的值)
密钥配置注意事项:所有 Nacos 节点配置必须一致,不使用默认值,定期更换增强安全性。
步骤 3:重启 Nacos 服务
修改配置后需要重启 Nacos 服务器使更改生效。Docker 部署重新创建容器,直接部署重启服务进程。
步骤 4:客户端配置鉴权信息
Java SDK 初始化 ConfigService 时传入用户名和密码:
Propertiesproperties=newProperties();properties.put("serverAddr",serverAddr);properties.put("username","${username}");properties.put("password","${password}");ConfigServiceconfigService=NacosFactory.createConfigService(properties);Spring Cloud Alibaba 项目在 application.properties 中配置:
spring.cloud.nacos.discovery.metadata.token=sa-token
怎么验证是否生效
通过 OpenAPI 登录获取 accessToken,然后用该 Token 访问配置或服务接口。登录成功返回 accessToken 和 tokenTtl 信息,后续请求在 URL 后添加参数 accessToken=$accessToken。如果未配置鉴权或 Token 无效,请求会被拒绝访问。
验证检查点:
- 不带 Token 访问配置接口应返回鉴权失败
- 带有效 Token 访问应正常返回配置信息
- 客户端 SDK 配置用户名密码后能正常拉取配置
常见坑
- Token 未生效:检查是否正确设置了 nacos_auth_enable 和 nacos_auth_token,两个参数缺一不可
- 密钥不一致:集群部署时所有节点必须使用相同的 Token 密钥,否则服务端间通信会失败
- Token 过期:默认 accessToken 过期时间为 18000 秒,可适当调整 nacos_auth_token_timeout 值
- 命名空间不一致:检查客户端与服务端的 namespace 配置是否一致
- 暴露公网风险:Nacos 不可暴露在公网环境,应在公网环境下严格限制访问来源
- 使用默认值:nacos.core.auth.server.identity.key 和 value 避免使用默认值以降低安全风险
常见问题
Nacos 默认鉴权强度如何?
Nacos 默认鉴权是弱鉴权体系,主要防止业务错用而非恶意攻击。如果运行在不可信网络环境或有强鉴权诉求,需要参考官方简单实现进行自定义插件开发。
Token 密钥有什么要求?
Token 密钥建议使用大于 32 位的字符串,并进行 Base64 编码增强安全性。所有 Nacos 节点必须配置相同的密钥值,集群部署时密钥不一致会导致服务端间通信失败。
开启鉴权后客户端如何配置?
客户端 SDK 初始化时需传入用户名和密码参数,OpenAPI 调用需先登录获取 accessToken,后续请求在 URL 中添加 accessToken 参数。Spring Cloud 项目可通过 metadata.token 配置。
从哪个版本开始 Nacos 控制台默认开启鉴权?
从 Nacos3.0.0 版本开始,Nacos 的控制台访问默认开启鉴权。早期版本需要手动配置 nacos.core.auth.enabled=true 开启。
参考来源
- Nacos 官方文档 - 配置鉴权
- Nacos 官方文档 - 鉴权插件
- Nacos 官方文档 - Authorization 参数说明
- 阿里云 MSE Nacos 服务文档 - Nacos 鉴权配置
- Nacos Docker 镜像文档 - 环境变量配置说明