这些OAuth2客户端的认证方式你未必了解

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

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

OAuth2客户端认证

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

客户端认证方式

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

这些OAuth2客户端的认证方式你未必了解

前面 GiteeDEMO使用的是过时的 POST方式;微信DEMO使用的是非 OAuth2标准的方式; Spring Authorization Server目前相关的 DEMO使用的是 client_secret_basic方式。剩下的方式中 client_secret_jwtprivate_key_jwt用的比较多,这两种方式可以很好地保护客户端的认证信息,安全性更高。 Spring SecuritySpring 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_secretJWT进行解码校验以认证客户端。这种方式能很好的保护 client_secret在非 HTTPS环境下的传输。

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

private_key_jwt

private_key_jwtclient_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_basicclient_secret_post方式,对后面的五种则很少涉及,胖哥已经对 private_key_jwtclient_secret_jwt进行了实现,详细请订阅我的 Spring Security OAuth2专栏。这些OAuth2客户端认证方式在不同的场景有不同的优势,你可以根据不同的安全级别选择不同的 OAuth2客户端认证方式。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

Original: https://www.cnblogs.com/felordcn/p/16067014.html
Author: 码农小胖哥
Title: 这些OAuth2客户端的认证方式你未必了解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/589128/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java内存模型(JMM)图文并茂,条理清晰

    什么是Java内存模型(JMM)? 为什么要有内存模型? 要想回答这个问题,我们需要先弄懂传统计算机硬件内存架构。好了,我要开始画图了。 1.1. 硬件内存架构 1)CPU 去过机…

    Java 2023年5月29日
    076
  • 运行项目连接Mysql时出现警告Establishing SSL connection without server‘s identity verification is not recommende

    警告内容如下:; Thu Dec 20 12:50:09 CST 2018 WARN: Establishing SSL connection without server&#82…

    Java 2023年6月5日
    0144
  • Java的jstat命令使用详解

    jstat命令简介 jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态…

    Java 2023年6月7日
    0148
  • 分析 java.util.HashMap 源码

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    074
  • JVM的监控

    JVM的监控 Table of Contents *一、jvm常见监控工具&指令 * 1、 jps:jvm进程状况工具 * 2、jstat: jvm统计信息监控工具 * 3…

    Java 2023年6月7日
    0121
  • Java 图片裁剪,截取

    <span class="hljs-tag"><<span class="hljs-name">depende…

    Java 2023年6月7日
    093
  • Object o = new Object()占多少个字节?-对象的内存布局

    一、先上答案 这个问题有坑,有两种回答 第一种解释: object实例对象,占16个字节。 第二种解释: Object o:普通对象指针(ordinary object point…

    Java 2023年6月9日
    0146
  • 树的基本概念介绍

    为什么需要树这种数据结构 这是我本人在B站看韩顺平老师数据结构和算法的学习笔记,记录一下,防止忘记 1) 数组存储方式的分析 优点:通过 下标方式访问元素,速度快。对于有序数组,还…

    Java 2023年6月15日
    091
  • 两天两夜,1M图片优化到100kb!

    坦白从宽吧,我就是那个花了两天两夜把 1M 图片优化到 100kb 的家伙——王小二! 自从因为一篇报道登上热搜后,我差点抑郁,每天要靠 50 片安眠药才能入睡。 网络上曝光的那些…

    Java 2023年6月9日
    084
  • “假学习”与“真学习”

    什么叫做”假学习”? **一、看书 **买一堆书,有空看看。看书,这是典型的假学习。看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已。专业书都写…

    Java 2023年6月9日
    0107
  • MyBatis学习大全(狂神秦疆版)

    一、 MyBatis 1.什么是Mybaits 概念:MyBatis 是一款优秀的 持久层框架 它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JD…

    Java 2023年6月8日
    092
  • 13.数组string关于length

    数组没有length()这个方法,有length属性 string有length()这个方法。 length不是方法,是属性,数组的属性;length()是字符串String的一个…

    Java 2023年6月9日
    096
  • 项目启动时报错:java.io.EOFException

    解决方案 删除Tomcat里面的work\Catalina\localhost下的项目文件内容即可解决 问题原因 原因是由于项目测试中class文件或者其它文件更新过频繁 Orig…

    Java 2023年5月29日
    080
  • 家教小程序的设计与实现

    摘要 随着社会和技术的飞快发展,网络逐渐成为人们生活中不可或缺的存在,不管是生活、工作还是学习网络都可以给我们带来便捷。家教程序为学生和老师提供更加快捷的平台,相对舒适的工作环境,…

    Java 2023年6月7日
    089
  • JAVA SSH 框架介绍(转)

    转载自:http://www.admin10000.com/document/150.html SSH 为 struts+spring+hibernate 的一个集成框架,是目前较…

    Java 2023年5月29日
    0123
  • Stream流使用(Lamdba表达式重点场景)

    类型二: 数组:Arrays.stream(数组)或者使用Stream.of来创建 类型三:双列集合:转换成单列集合后创建 2)中间操作 filter( ) // 用作过滤集合元素…

    Java 2023年6月15日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球