Azure Cosmos DB:数据平面用户的令牌管控与连接字符串问题
如何后续获取Cosmos DB资源令牌
你提到创建权限时能拿到令牌,但后续无法获取——其实资源令牌可以通过重新查询权限资源来再次获取,不用每次都重新创建权限。具体操作分两种方式:
用REST API重新获取
你可以用拥有账户级权限的凭证(比如账户密钥生成的授权令牌),向权限的专属端点发送GET请求:
- 请求URL格式:
https://<你的Cosmos账户名>.documents.azure.com/dbs/<数据库ID>/users/<用户ID>/permissions/<权限ID> - 请求头必须包含:
Authorization:用账户密钥生成的HMAC授权头(和你创建用户/权限时用的头格式一致)x-ms-date:当前UTC时间x-ms-version:指定API版本(比如2023-03-15)
响应的JSON体里会再次返回_token字段,这就是你需要的资源令牌。
用SDK简化操作
如果用官方SDK(比如.NET、Java、Python),会更省心:
- 以.NET为例:先通过账户客户端获取到目标
User对象,再调用user.GetPermissionAsync("<权限ID>"),返回的Permission对象里就包含Token属性 - 其他SDK的逻辑类似,都是先定位到用户和权限,再查询权限资源获取令牌
另外要注意:默认创建的权限令牌是永不过期的,除非你在创建权限时手动指定了expiryTime参数。如果设置了过期时间,就需要在令牌过期前重新获取。
为什么令牌需要包含在连接字符串中
资源令牌本质是数据平面访问的身份凭证,它的作用是替代账户密钥,实现最小权限访问——毕竟账户密钥拥有整个Cosmos账户的控制+数据平面权限,而资源令牌只允许特定用户访问指定的资源(比如某个容器的只读/读写权限)。
把令牌放在连接字符串里,是SDK提供的便捷方式:
- 当你用资源令牌构建连接字符串时(格式类似
AccountEndpoint=https://<账户名>.documents.azure.com:443/;ResourceToken=<你的令牌内容>;),SDK会自动将令牌注入到每个数据请求的Authorization头中,不用你手动在每个请求里添加凭证 - 如果你不用连接字符串,也可以手动在每个请求的
Authorization头里带上令牌(格式是type=resource&ver=1&sig=<签名部分>),但这样开发效率很低
简单说:连接字符串是SDK管理凭证的一种方式,让你不用重复处理身份验证逻辑,专注于业务代码。
内容的提问来源于stack exchange,提问作者mwa
相关产品推荐
相关产品推荐

