如何使用REST API生成的AccessToken登录Azure容器注册表(ACR)
问题描述
我通过ACR的REST端点生成了AccessToken,但不知道如何用它完成Docker登录。在ACR仓库范围权限的文档里,UI和CLI操作都会用到用户名,但通过REST API生成Token时并没有返回用户名。
我使用的REST API请求(已修改值):
GET /oauth2/token?service=demoregistry.azurecr.io&scope=registry:catalog:* HTTP/1.1 Host: demoregistry.azurecr.io Authorization: Basic ZGVtb3JlZ2lzdHJ5OmNDZWJ3UU9jN1BzM1poQndGMzg2LzBPdndCZU1vTQ==
已尝试的方法
- 使用注册表用户名 + AccessToken作为密码,报错:
unauthorized: incorrect username or password - 使用
rid/jti作为用户名 + AccessToken作为密码,报错:unauthorized: Application not registered with AAD
生成的Token(已修改值)
Header
{ "alg": "RS256", "typ": "JWT", "kid": "QWFG:M237:K2HA:33DK:5PGT:CA3M:DBN3:XOQB:A5QB:I63Q:AT3Q:NQAK" }
Payload
{ "jti": "69853560-dc76-4458-8bac-137f33121e39", "sub": "demoregistry", "nbf": 1669691010, "exp": 1669695510, "iat": 1669691010, "iss": "Azure Container Registry", "aud": "demoregistry.azurecr.io", "version": "1.0", "rid": "f013d21b1c1349ecb85457182a1b1466", "access": [ { "Type": "registry", "Name": "catalog", "Actions": [ "*" ] } ], "roles": [ "Owner" ], "grant_type": "access_token" }
解决方案
正确登录方式
使用ACR OAuth2端点生成的JWT令牌登录Docker时,用户名可填写任意非空字符串(官方推荐使用00000000-0000-0000-0000-000000000000或token),密码直接用获取到的完整JWT令牌。
执行命令:
docker login demoregistry.azurecr.io -u 00000000-0000-0000-0000-000000000000 -p "你的JWT令牌内容"
失败原因说明
- 注册表用户名+Token的组合:混淆了“换取Token的认证凭据”和“Token的使用逻辑”,注册表用户名密码是用来生成Token的,不能和Token组合作为登录凭据。
rid/jti作为用户名:这两个是JWT的元数据字段,并非ACR认可的登录用户名格式,系统会误判为AAD认证流程,因此报错。
验证登录
登录成功后,可通过以下命令验证权限:
# 查看仓库列表(对应你的token scope: registry:catalog:*) docker search demoregistry.azurecr.io
内容的提问来源于stack exchange,提问作者PSKP
相关产品推荐
相关产品推荐

