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。该方式的细节已经在OAuth2专栏中JOSE规范一文中进行过详细说明了,这里不再赘述。这种方式让客户端的认证信息更加安全的传输,是我个人比较喜欢的方式。
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客户端认证方式。
关注公众号:Felordcn 获取更多资讯
Original: https://www.cnblogs.com/felordcn/p/16067014.html
Author: 码农小胖哥
Title: 这些OAuth2客户端的认证方式你未必了解
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589128/
转载文章受原作者版权保护。转载请注明原作者出处!