客户端的验证方法
请求某些端点需要执行客户端的身份验证,必须根据应用程序配置的身份验证方法:在请求的头或参数中包含需要的验证值。
注册OAuth 2.0客户端应用程序时,通过token_endpoint_auth_method参数来指定身份验证方法。
注意:如果没有指定验证的方法,默认方式是
client_secret_basic
.
XAuth支持如下的验证方式:
client_secret_basic
,client_secret_post
,client_secret_jwt
: 当客户端有client secret时,使用这几种方式的任何一种。公开的客户端(SPA、Native APP等)不能保障secret的安全,必须设置为none
。none
:使用该方式的客户端不保存Secret,使用PKCE或implicit flow。
客户端秘密(Secret)
如果你的客户端的验证方式为client_secret_basic
, client_secret_post
, 需要在请求中包含Secret。
-
client_secret_basic
:请求时在header中办好base64编码的字符串:Authorization: Basic ${Base64(<client_id>:<client_secret>)}
-
client_secret_post
: 把client_id
和client_secret
额外的参数放在请求的body中。
JWT 格式
如果您将客户端配置为使用client_secret_jwt
客户端身份验证方法:
使用HMAC SHA算法(HS256、HS384或HS512)在JWT中提供client_id
,并使用client_secret
进行签名。JWT还必须包含其他值,如发行人和主体等,详细的token格式如下:
Claims | 描述 | 类型 |
---|---|---|
aud | 必须。使用JWT进行身份验证的资源的完整URL。 | String |
exp | 必须。自UTC 1970年1月1日起令牌的过期时间(秒)。 | Integer |
jti | 可选。Token的标识 | String |
iat | 可选。自UTC 1970年1月1日起令牌的签发时间 | Integer |
iss | 必须。签发该token的签发者。与client_id 相同 | String |
sub | 必须。签发该token的主体。与client_id 相同 | String |
说明:
- 如果
jti
参数指定,则该token只能被使用一次,如果后续使用相同的jti的token,则无效 - 如果
exp
参数超过当前时间1个小时,或者已经过期,请求均已失败。 - 如果
iat
参数指定,则该参数必须是在收到token的时间之前。
注意:具有共享密钥的JWT需要长度至少为32个字符的密码才能满足HS256密码最小值。如果向XAuth发送JWT进行验证的客户端使用HS256、HS384或HS512签名,密码少于32个字符,将收到一个错误:
The client secret is too short to verify a JWT HMAC.
.
创建JWT后,在请求中需要将客户机断言类型client_assertion_type
指定为urn:ietf:params:oauth:client-assertion-type:jwt-bearer
,并在 client_assertion
中包含jwt的值。
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=i1WsRn1uB1&
client_id=0oajncakofQmjxlSw0h3
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&
client_assertion=PHNhbWxwOl ... Z