你知道吗?OAuth2客户端有两种,认证方式有七种

服务器 服务器产品
机密类型的自身会有个密码凭据,比如Web服务器后端程序;而公共类型则没有密码凭据,纯浏览器前端应用或者移动客户端应用大都属于这一种类型。不管是哪一种,它们都有客户端ID(client_id)。

OAuth2客户端按照它们与授权服务器进行安全认证的能力可以分为机密类型(Confidential)和公共类型(Public)。

机密类型的自身会有个密码凭据,比如Web服务器后端程序;而公共类型则没有密码凭据,纯浏览器前端应用或者移动客户端应用大都属于这一种类型。不管是哪一种,它们都有客户端ID(client_id)。

OAuth2客户端认证

客户端在执行OAuth2授权的敏感流程中(相关的流程有令牌请求、令牌自省请求、令牌撤销请求)必须使用授权服务器进行客户端身份验证,确保客户端中途不会被调包。

客户端认证方式

目前客户端认证的方式有以下几种:

前面Gitee的DEMO使用的是过时的POST方式;微信DEMO使用的是非OAuth2标准的方式;Spring Authorization Server目前相关的DEMO使用的是client_secret_basic方式。剩下的方式中client_secret_jwt和private_key_jwt用的比较多,这两种方式可以很好地保护客户端的认证信息,安全性更高。Spring Security和Spring Authorization Server目前已经支持这两种方式。

client_secret_jwt

client_secret_jwt方式是OAuth2客户端将自己的密钥作为HmacSHA256算法的key生成SecretKey:

byte[] pin = clientSecret.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretKey = new SecretKeySpec(pin,"HmacSHA256");

然后通过SecretKey生成一个携带OAuth2客户端信息的JWT,在授权码请求Token环节携带该JWT以便授权服务器进行客户端认证,请求的报文为:

     POST /oauth2/token HTTP/1.1
Host: oauth2_client.felord.cn
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&
code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&
client_assertion=你的JWT

授权服务器收到请求后通过OAuth2客户端的client_secret对JWT进行解码校验以认证客户端。这种方式能很好地保护client_secret在非HTTPS环境下的传输。

这里OAuth2客户端的密钥(client_secret)比特长度必须大于等于256。

private_key_jwt

private_key_jwt和client_secret_jwt唯一的区别就是生成JWT的方式不同。通过这种方式,OAuth2客户端已经不需要client_secret,只需要配置一对RSA或者EC密钥,通过密钥来生成JWT,另外还需要向授权服务器提供公钥,通常是一个jwkSetUrl。该方式的细节已经在胖哥专栏[1]中JOSE规范[2]一文中进行过详细说明了,这里不再赘述。这种方式让客户端的认证信息更加安全的传输,是我个人比较喜欢的方式。

tls_client_auth

这个比较高级,嵌入了TLS安全层,在HTTP协议级别来认证OAuth2客户端,它涉及的证书来自可信任的CA。这种方式基本脱离了应用层,是一种无侵入的方式。

self_signed_tls_client_auth

这个同样也是在TLS安全层,不过它使用了自签名的X.509证书。

总结

市面上的教程大多只会提到过时的POST方式以及client_secret_basic和client_secret_post,对后面的五种很少涉及,胖哥会对private_key_jwt和client_secret_jwt详细的实现,详细请订阅我的Spring Security OAuth2专栏。这些OAuth2客户端认证方式在不同的场景有不同的优势,你可以根据不同的安全级别选择不同的OAuth2客户端认证方式。

参考资料

[1]胖哥专栏: https://blog.csdn.net/qq_35067322/category_11691173.html

[2]JOSE规范: https://felord.blog.csdn.net/article/details/123540550

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2021-01-06 08:48:35

CSS 命名模块

2018-05-19 22:29:16

无线无线网桥中继传输

2023-04-26 10:21:04

2021-11-19 10:10:14

手机移动设备网络攻击

2022-05-18 09:01:31

JavaScriptEvalErrorURIError

2023-03-29 13:06:36

2022-01-19 13:57:22

ymlSpringSnakeYml

2020-03-23 08:31:13

网络时延时延网络

2023-04-26 10:06:08

RocketMQ属性Consumer

2022-01-26 00:36:24

vue组件化通信

2020-09-11 06:39:29

ThreadLocal线程

2022-09-14 08:11:06

分页模糊查询

2017-06-14 16:44:15

JavaScript原型模式对象

2022-01-09 23:20:50

手机国产苹果

2023-12-07 07:08:09

Angular函数

2015-10-09 09:51:29

Web API认证

2018-07-04 11:02:23

无线传输模式

2019-12-02 10:16:46

架构设计模式

2011-03-03 10:26:04

Pureftpd

2018-06-10 16:31:12

点赞
收藏

51CTO技术栈公众号