Oauth2令牌认证
预计阅读时间:4分钟
使用OAuth2进行Docker Registry v2身份验证
本文档介绍了对授权服务器中OAuth2协议的支持。RFC6749应该用作此处描述的协议和HTTP端点的参考。
注意:并非所有令牌服务器都实现oauth2。如果对端点的请求404
使用HTTPPOST
方法返回,请参阅
令牌文档,以使用GET
所有令牌服务器支持的HTTP方法。
刷新令牌格式
刷新令牌的格式对于客户端是完全不透明的,应由授权服务器确定。授权应确保令牌足够长,并负责存储有关吊销可能需要的长期令牌的任何信息。客户不会提取并提供令牌中存储的任何信息。
获取令牌
POST /令牌
标头
内容类型:application / x-www-form-urlencoded
发布参数
grant_type
- (必需)用于获取令牌的授权类型。使用凭证获取刷新令牌时,此类型应设置为“密码”,并具有随附的用户名和密码参数。保留类型“ authorization_code”以供将来用于向授权服务器进行身份验证,而不必直接从客户端发送凭据。当请求带有刷新令牌的访问令牌时,应将其设置为“ refresh_token”。
service
- (必填)托管要获取访问权限的资源的服务的名称。刷新令牌仅对获取此服务的令牌有用。
client_id
- (必需)用于标识客户端的字符串。此client_id不需要在授权服务器上注册,但应设置为有意义的值,以允许审核未注册客户端创建的密钥。可接受的语法在[RFC6749附录A.1](https://tools.ietf.org/html/rfc6749#appendix-A.1)中定义
access_type
- (可选)正在请求的访问权限。如果提供“离线”,则将返回刷新令牌。默认值为“在线”,仅返回短暂的访问令牌。如果授予类型为“ refresh_token”,则将仅返回相同的刷新令牌,而不返回新的刷新令牌。
scope
- (可选)正在讨论的资源,其格式设置为上述标题中的
scope
参数中以空格分隔的条目之一WWW-Authenticate
。该查询参数只能指定一次,但可以使用范围语法中定义的范围列表格式包含多个范围。如果标头scope
提供了多个,则WWW-Authenticate
在请求令牌之前,应先将范围转换为范围列表。上面的示例将指定为:scope=repository:samalba/my-app:push
。当请求刷新令牌时,范围可能为空,因为刷新令牌将不受此范围的限制,只有提供的短期访问令牌才具有范围限制。 refresh_token
- (可选)使用授予类型“ refresh_token”时用于身份验证的刷新令牌。
username
- (可选)使用授权类型“密码”时用于身份验证的用户名。
password
- (可选)使用授权类型“密码”时用于身份验证的密码。
回应栏位
access_token
- (必需)
Bearer
客户端应在Authorization
标头中提供给后续请求的不透明令牌。客户端不应尝试解析或理解此令牌,而应将其视为不透明字符串。 scope
- (必需)在访问令牌内授予的范围。这可能是与所请求的范围相同的子集。通过严格要求返回值的范围,此要求比[RFC6749第4.2.2节](https://tools.ietf.org/html/rfc6749#section-4.2.2)中指定的要强。
expires_in
- (必需)自颁发令牌以来,保持有效的时间(以秒为单位)。如果省略,则默认为60秒。为了与较旧的客户端兼容,令牌返回的时间不得少于60秒。
issued_at
- (可选)发出给定令牌的RFC3339序列化的UTC标准时间。如果
issued_at
省略,则到期时间为令牌交换完成之时。 refresh_token
- (可选)令牌,可用于为具有不同范围的同一主题获取其他访问令牌。该令牌应由客户端保持安全,并仅发送给颁发承载令牌的授权服务器。仅在请求中提供`access_type = offline`时,才设置此字段。
示例获取刷新令牌
POST /token HTTP/1.1
Host: auth.docker.io
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=johndoe&password=A3ddj3w&service=hub.docker.io&client_id=dockerengine&access_type=offline
HTTP/1.1 200 OK
Content-Type: application/json
{"refresh_token":"kas9Da81Dfa8","access_token":"eyJhbGciOiJFUzI1NiIsInR5","expires_in":900,"scope":""}
刷新访问令牌的示例
POST /token HTTP/1.1
Host: auth.docker.io
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=kas9Da81Dfa8&service=registry-1.docker.io&client_id=dockerengine&scope=repository:samalba/my-app:pull,push
HTTP/1.1 200 OK
Content-Type: application/json
{"refresh_token":"kas9Da81Dfa8","access_token":"eyJhbGciOiJFUzI1NiIsInR5":"expires_in":900,"scope":"repository:samalba/my-app:pull,repository:samalba/my-app:push"}