Link Search Menu Expand Document
  1. 客户端的验证方法
    1. 客户端秘密(Secret)
      1. JWT 格式

客户端的验证方法

请求某些端点需要执行客户端的身份验证,必须根据应用程序配置的身份验证方法:在请求的头或参数中包含需要的验证值。

注册OAuth 2.0客户端应用程序时,通过token_endpoint_auth_method参数来指定身份验证方法。

注意:如果没有指定验证的方法,默认方式是client_secret_basic.

OneAuth支持如下的验证方式:

  • 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_idclient_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密码最小值。如果向OneAuth发送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