docker registry 的认证token流程图如下

docker 自签名 证书 docker 认证_身份验证

流程解释:
1. 尝试推/拉操作。
2. 如果需要授权,它将返回401 Unauthorized HTTP响应,并提供有关如何进行身份验证的信息。
3. 客户端向授权服务请求一个Bearer token
4. 授权服务返回代表客户授权访问opaque Bearer token
5. 客户端重新尝试原始请求,并在请求的授权标头Bearer token
6. docker registry 通过验证持证人token和嵌入在其中的声明集来授权客户端,并开始推送/拉取会话。

如何授权
docker registry v2 当docker client去pull/push镜像的时候 如果docker registry服务器要求身份验证,则它将返回一个401未经授权的响应,并带有WWW-Authenticate标头,详细说明如何向此注册表进行身份验证

例如 有个usernamejlhawn用户,想要push镜像到samalba/my-app这个镜像仓库,如果未授权,那么将会返回一下信息:

HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push"
Date: Thu, 10 Sep 2015 19:32:31 GMT
Content-Length: 235
Strict-Transport-Security: max-age=31536000

{"errors":[{"code":"UNAUTHORIZED","message":"access to the requested resource is not authorized","detail":[{"Type":"repository","Name":"samalba/my-app","Action":"pull"},{"Type":"repository","Name":"samalba/my-app","Action":"push"}]}]}

HTTP响应标头:

Www-Authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io",scope="repository:samalba/my-app:pull,push"

这表明要求
GET请求到 https://auth.docker.io/token using the service and scope values from the WWW-Authenticate header.

获取 Token
入参:
service:仓库地址,
offline_token:是否与持票人令牌一起返回刷新令牌。 刷新令牌能够为不同范围的相同主体获得额外的bearer token。 刷新令牌没有到期并且应该被认为对客户完全不透明。
client_id:客户端ID
scope:权限范围,通过WWW-Authenticate取的scope的值,例如上面的例子:scope=repository:samalba/my-app:push

返回参数
token:token的值
access_token:token以及access_token都可能出现,主要为了兼容低版本
expires_in:token的生效时间,默认是60s
issued_at:(可选)发布给定令牌的RFC3339序列化UTC标准时间。 如果issued_at被省略,则过期是从令牌交换完成时开始的。
refresh_token:(可选)可用于为具有不同范围的同一scope获取额外访问令牌的令牌。 该令牌应该由客户端保持安全,并且只发送给发布承载令牌的授权服务器。 该字段仅在请求中提供offline_token = true时设置生效。

例子

https://auth.docker.io/token?service=registry.docker.io&scope=repository:samalba/my-app:pull,push

在对客户端进行身份验证之后(如果没有尝试进行身份验证,它可能只是一个匿名客户端),令牌服务器必须接下来查询其访问控制列表以确定客户端是否具有所请求的范围。 在这个示例请求中,如果我已经以用户jlhawn进行身份验证,则令牌服务器将确定对实体registry.docker.io托管的存储库samalba / my-app的访问权限。

返回的信息

HTTP/1.1 200 OK
Content-Type: application/json

{"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlBZWU86VEVXVTpWN0pIOjI2SlY6QVFUWjpMSkMzOlNYVko6WEdIQTozNEYyOjJMQVE6WlJNSzpaN1E2In0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJqbGhhd24iLCJhdWQiOiJyZWdpc3RyeS5kb2NrZXIuY29tIiwiZXhwIjoxNDE1Mzg3MzE1LCJuYmYiOjE0MTUzODcwMTUsImlhdCI6MTQxNTM4NzAxNSwianRpIjoidFlKQ08xYzZjbnl5N2tBbjBjN3JLUGdiVjFIMWJGd3MiLCJhY2Nlc3MiOlt7InR5cGUiOiJyZXBvc2l0b3J5IiwibmFtZSI6InNhbWFsYmEvbXktYXBwIiwiYWN0aW9ucyI6WyJwdXNoIl19XX0.QhflHPfbd6eVF4lM9bwYpFZIV0PfikbyXuLx959ykRTBpe3CYnzs6YBK8FToVb5R47920PVLrh8zuLzdCr9t3w", "expires_in": 3600,"issued_at": "2009-11-10T23:00:00Z"}

使用Bearer token的例子

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IkJWM0Q6MkFWWjpVQjVaOktJQVA6SU5QTDo1RU42Ok40SjQ6Nk1XTzpEUktFOkJWUUs6M0ZKTDpQT1RMIn0.eyJpc3MiOiJhdXRoLmRvY2tlci5jb20iLCJzdWIiOiJCQ0NZOk9VNlo6UUVKNTpXTjJDOjJBVkM6WTdZRDpBM0xZOjQ1VVc6NE9HRDpLQUxMOkNOSjU6NUlVTCIsImF1ZCI6InJlZ2lzdHJ5LmRvY2tlci5jb20iLCJleHAiOjE0MTUzODczMTUsIm5iZiI6MTQxNTM4NzAxNSwiaWF0IjoxNDE1Mzg3MDE1LCJqdGkiOiJ0WUpDTzFjNmNueXk3a0FuMGM3cktQZ2JWMUgxYkZ3cyIsInNjb3BlIjoiamxoYXduOnJlcG9zaXRvcnk6c2FtYWxiYS9teS1hcHA6cHVzaCxwdWxsIGpsaGF3bjpuYW1lc3BhY2U6c2FtYWxiYTpwdWxsIn0.Y3zZSwaZPqy4y9oRBVRImZyv3m_S9XDHF1tWwN7mL52C_IiA73SJkWVNsvNqpJIn5h7A2F8biv_S2ppQ1lgkbw

参考:
docker token