你知道吗?OAuth2客户端有两种,认证方式有七种。
时间:2022-12-21 13:30:00
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); SecretKeySpecsecretKey=newSecretKeySpec(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传输环境。
?这里OAuth客户端密钥(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专栏:
https://blog.csdn.net/qq_35067322/category_11691173.html
这些OAuth客户端认证方法在不同的场景中有不同的优势。您可以根据不同的安全级别选择不同的OAuth2客户端认证方式。
推荐阅读
秒杀德云社!今晚魔都朋友的朋友圈,快把我笑死了
裁员这么猛?潮水要退了?
如何卸载360浏览器的过程堪比拆弹