背景:需要API网关控制权限,单点登陆。
当前关于这方面的系统资料较少,因此大多是找寻网上零散的示例解析,结合官方文档中的demo再加上源码跟踪调试来进行学习与搭建。但由于涉及的知识点较多,且零散示例中配置或实现方式各有不同,作者经常只会记录关键、核心部分内容,因此会漏掉一些基础配置信息,给初学者带来极大困难。往往按照多个示例拼凑出来的demo无法正常运行,或者不明就里。官方给出的文档又需要具备一定英文功底。综合以上因素,这篇文章横空出世:)既包含周边理论知识浅析,又包含实际案例demo完整代码(为了保证下载即可正常运行已附上SQL语句)
涉及知识点:
l Oauht2基础知识(授权类型,运行流程)
l SpringBoot项目增加https支持(https协议简单概述)
l Keytools工具基本使用(常用命令参数解析及证书类别)
l Springsecurity知识(spring-security-oauth2是基于springsecurit的,很多配置相关都是沿用springsecurity的)
l 具体项目实现(包含服务端及客户端具体实现,鉴权、SSO)
Oauht2基础知识
既然是要搭建基于spring-security-oauth2的授权服务器,那Oauth2的基础原理和运行流程我们还是需要了解一下的,否则对于授权模式选择和认证授权流程会比较晕。对于Oauth2的介绍这里强烈推荐: 理解OAuth2.0,在这里只简单描述和摘抄部分关键信息。
核心角色介绍:
l 三方客户端
l 资源所有者
l 认证服务器
l 资源服务器
为了便于理解,这里举一个大家耳熟能详的应用场景来介绍各个角色在实际应用中是如何交互的:在一个愉快的周六午后,小明同学吃完午饭就迫不及待的躺在床上,拿起手机打开吃鸡游戏(三方客户端),为了便于同朋友开黑,小明选择了微信登陆的方式,这时候吃鸡游戏(三方客户端)跳转到一个微信登陆认证页面(认证服务器),在这里小明(资源所有者)输入账号密码(身份认证),登陆成功后界面上显示:是否授权使吃鸡游戏可以访问你的微信头像、昵称、好友资料等。(授权)。授权通过后,剩下是后台处理,用户不可见(返回给客户端一个授权码,客户端拿到授权码结合开始申请授权时的appkey申请token,通过后客户端凭着这个token去资源服务器获取用户头像、昵称等信息)
客户端的授权模式
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
关于这4种授权模式的区别,详细内容请参见OAuth2.0,在这里我给出了自己比较土的解释:
授权码模式:安全性最高,也是比较常用的方式,但是整个流程最长。运行流程见上面举的“吃鸡”游戏登陆授权例子。
简化模式: 跳过了获取授权码的环节,后续流程同授权码模式。
密码模式:把账号密码给到客户端程序,由客户端程序去请求认证服务器获取token,这种方式客户端是能够获取到用户名、密码信息的。
客户端模式:这种其实就和用户授权没什么关系,需要认证的主体是客户端本身了,客户端本身以自己的名义去找认证服务器要授权。