配置访问凭据
注意
- Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。
- Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。
- 如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做进行自定义插件开发。
当服务端开启鉴权后,SDK、OpenAPI 和控制台请求都需要携带身份信息。不同鉴权插件使用的身份材料不同。
| 服务端鉴权类型 | 客户端常用身份材料 | 说明 |
|---|---|---|
nacos | username、password、accessToken | 默认 Nacos 鉴权。SDK 会用用户名密码登录并自动携带 token。 |
ldap | username、password、accessToken | LDAP 校验用户名密码,Nacos 签发 token。 |
oidc | Authorization: Bearer ...、accessToken | 使用外部 IdP 签发的 OAuth2/OIDC token。 |
SDK 配置
Java SDK 在传入 username 和 password 后,会使用默认登录接口获取 accessToken,并把 token 注入后续请求。
Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");properties.setProperty(PropertyKeyConst.USERNAME, "${username}");properties.setProperty(PropertyKeyConst.PASSWORD, "${password}");
ConfigService configService = NacosFactory.createConfigService(properties);NamingService namingService = NacosFactory.createNamingService(properties);Java SDK 可以使用 OAuth2 Client Credentials flow 获取 bearer token。该方式适合服务到服务调用。
Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");properties.setProperty("nacos.client.auth.oidc.issuer-uri", "https://idp.example.com/realms/nacos");properties.setProperty("nacos.client.auth.oidc.client-id", "nacos-client");properties.setProperty("nacos.client.auth.oidc.client-secret", "${client_secret}");properties.setProperty("nacos.client.auth.oidc.scope", "openid");
ConfigService configService = NacosFactory.createConfigService(properties);NamingService namingService = NacosFactory.createNamingService(properties);如果不希望通过 Discovery 获取 token endpoint,可以直接配置:
properties.setProperty("nacos.client.auth.oidc.token-endpoint", "https://idp.example.com/realms/nacos/protocol/openid-connect/token");Go SDK 使用用户名和密码访问默认 Nacos 鉴权或 LDAP 鉴权:
sc := []constant.ServerConfig{ *constant.NewServerConfig("${serverAddr}", 8848, constant.WithContextPath("/nacos")),}
cc := *constant.NewClientConfig( constant.WithUsername("${username}"), constant.WithPassword("${password}"),)
namingClient, err := clients.NewNamingClient(vo.NacosClientParam{ ClientConfig: &cc, ServerConfigs: sc,})
configClient, err := clients.NewConfigClient(vo.NacosClientParam{ ClientConfig: &cc, ServerConfigs: sc,})其他语言客户端请优先查看对应 SDK 的鉴权参数说明。默认 Nacos 鉴权通常需要配置用户名和密码;OIDC/OAuth2 场景通常需要配置 bearer token 或由业务侧获取 token 后注入请求。
OpenAPI 配置
默认 Nacos 鉴权和 LDAP 鉴权
先使用用户名和密码登录:
curl -X POST 'http://127.0.0.1:8848/nacos/v3/auth/user/login' \ -d 'username=nacos&password=${password}'返回示例:
{ "accessToken": "eyJhbGciOiJIUzI1NiJ9...", "tokenTtl": 18000, "globalAdmin": true, "username": "nacos"}之后请求 OpenAPI 时携带 token。推荐使用 Authorization header:
curl -X GET 'http://127.0.0.1:8848/nacos/v2/cs/config?dataId=example.properties&group=DEFAULT_GROUP' \ -H 'Authorization: Bearer ${accessToken}'兼容旧调用时,也可以通过 accessToken 参数传递:
curl -X GET 'http://127.0.0.1:8848/nacos/v2/cs/config?accessToken=${accessToken}&dataId=example.properties&group=DEFAULT_GROUP'OIDC/OAuth2 鉴权
当服务端使用 nacos.core.auth.system.type=oidc 时,不使用 /v3/auth/user/login 获取 token。请从企业 IdP 获取 OAuth2/OIDC token,然后请求 Nacos 时携带:
curl -X GET 'http://127.0.0.1:8848/nacos/v2/cs/config?dataId=example.properties&group=DEFAULT_GROUP' \ -H 'Authorization: Bearer ${idp_access_token}'OIDC/OAuth2 的服务端配置请参考运维手册 - OIDC/OAuth2 认证。
常见问题
默认登录接口返回当前鉴权类型不支持
/v3/auth/user/login 只适用于 nacos 和 ldap。如果服务端使用 oidc,请从外部 IdP 获取 token。
token 突然失效
常见原因包括:
- token 已过期。
- 集群节点之间
nacos.core.auth.plugin.nacos.token.secret.key不一致。 - 服务端切换了鉴权插件类型。
- 权限被修改,但客户端仍在使用旧 token。
有 token 但仍然无权限
认证成功只表示服务端识别了调用者。是否能读取或写入目标资源,还取决于该身份的角色、权限以及资源可见性。