code换取token
- 概述
- 客户端认证方式
- 换取结果
概述
在获取到code后,就可以使用code换取token了,但在换取token这一步还会对客户端进行一些校验,而这也支持不同的方式,一起来看看。
客户端认证方式
- JwtClientAssertionAuthenticationConverter
这里面又包含两种具体的方式:
- ClientAuthenticationMethod.PRIVATE_KEY_JWT:这里直接以私钥生成一个 JWT 令牌发给授权服务器,然后将公钥暴露给授权服务器,授权服务器通过公钥来验证这个jwt,从而验证客户端。
- ClientAuthenticationMethod.CLIENT_SECRET_JWT:这种方式是以客户端密钥创建jwt发送给授权服务器,由授权服务器根据客户端密钥进行验签,从而验证客户端
其实这两种都是 JWT 的签名用法,只是加签的密钥不一样
-
ClientSecretBasicAuthenticationConverter
这是客户端直接传递以请求头的方式传递密钥,注意这里须用https保证安全,而且都是后端交互,以下两种本质都一样,只是一个是手动添加header;一种是由协议转换后添加,这种更标准化,也就是所谓的HTTP Basic 认证。- 直接在header 中传递 客户端id和密钥,
先用 :连接clientId和clientSecret;
然后,再进行Base64编码;
最后,前面拼上 Basic + 空格
Authorization = Basic Base64(clientId:clientSecret) - 直接在url中传递嵌入客户端id和密钥,由HTTP协议层处理,这其实算是HTTP协议下 URL 规范的一部分。
形式为
protocol://[user:password@]hostname[:port] / path / [:parameters][?query]#fragment
- 直接在header 中传递 客户端id和密钥,
-
ClientSecretPostAuthenticationConverter
这种比较好理解,直接在POST请求中将客户端id和密钥传过去
这里可以直接将 以 查询参数 和 body(x-www-form-urlencoded) 两种方式传递
http://localhost:9000/oauth2/token?grant_type=authorization_code&code=GvwOHTwHfnk50lwQOK1mLyYqOeARBpUUQzt1mSPPLWndqt51rV9sYDJmUmYY04HpRoTNhMH1XmFI-AT0FnVkjdEOKqHOdMeIh_9I-Sc1XSVP_MTp6h9ChdF9wYNI86Y&redirect_uri=http://www.baidu.com&client_id=messaging-client&client_secret=secret
- PublicClientAuthenticationConverter
这种方式就是为了之前提到的公共客户端而创建的,这种客户端校验,使用的不是客户端密钥,而是客户端每次随机生成的一个编号保存起来,并对其进行 SHA-256 散列算法,生成一个hash值,并将 散列算法和和hash值传给授权服务器。
在换取token阶段,客户端再将 原始值传给授权服务器,授权服务器再以同样的算法得到一个 hash值。二者比较,匹配则校验成功。