OAuth2.0协议

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

前言

本质就是一串过滤器配合实现的认证与授权功能,对,你没看错,全都是过滤器。
然后还有一个规约,OAuth2.0规约,腾讯QQ、微信、等等都遵守这个规约,典型应用就是QQ快捷登录、微信快捷登录,很多网站都支持QQ快捷登录,你本来登录的是A网站,结果用的是你自己的QQ账号和密码。

SpringSecurity入门篇
SpringSecurity升级篇

一、OAuth2.0概念

OAuth2.0是一种授权框架,用于允许第三方应用程序访问用户存储在另一个服务提供商上的资源,而无需共享用户的用户名和密码。OAuth2.0主要用于授权用户登录和授权访问API。

OAuth2.0通过在应用程序和服务提供商之间建立一个安全的授权连接,允许应用程序以受限的方式访问用户的数据。这种授权方式提供了更高的安全性,因为用户的凭据不会被共享给第三方应用程序。

在OAuth2.0中,用户需要授权第三方应用程序访问其数据,然后服务提供商会为该应用程序颁发一个访问令牌。这个访问令牌允许第三方应用程序在一定的时间范围内访问用户的数据。

OAuth2.0的流程包括四个角色:资源所有者(用户)、客户端(第三方应用程序)、授权服务器和资源服务器。授权服务器负责验证用户,客户端负责向用户请求授权,资源服务器存储和提供用户数据。

OAuth2.0已经成为许多互联网服务提供商和开发者使用的标准授权框架,例如Google、Facebook、GitHub等。它提供了一种安全、可扩展和可重用的方法,用于实现用户授权和访问控制。

例如:用户授权黑马网站访问用户储存在微信上的用户信息。
在这里插入图片描述
案例流程
在这里插入图片描述
还是案例好看
在这里插入图片描述
环境
在这里插入图片描述
父工程环境搭建
在这里插入图片描述
uaa授权服务器搭建(资源微服务类似,视频少了个jwt的第三个依赖,我觉得可能还是需要的)
在这里插入图片描述

二、ClientDetailsService

ClientDetails
在这里插入图片描述
在这里插入图片描述

三、授权服务器配置

1、概念

来个 AuthorizationServerConfig 配置文件,注意和SecurityConfig的区别与联系。明明和认证有关,结果英文是个授权
在这里插入图片描述
父类的三个核心方法
在这里插入图片描述

2、客户端详情

在这里插入图片描述
内存版(刷新令牌是在令牌过期后再次申请新令牌)
在这里插入图片描述
数据库版本,框架自己设计表 为 oauth_client_details
在这里插入图片描述

3、管理令牌

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、令牌访问端点配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、令牌端点的安全约束

在这里插入图片描述
在这里插入图片描述

四、四种模式

1、授权码模式

概念

经典案例
在这里插入图片描述

该模式是最安全的一种模式,授权码和令牌都在服务器之间处理完成了,没在浏览器暴露。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

请求接口

1、认证请求 获取授权码(只能浏览器get)(账号密码system  123456)(一个授权码只能用一次)
请求前:
http://localhost:8088/oauth/authorize?client_id=system&response_type=code&scope=app&redirect_uri=https://www.baidu.com
请求后:
https://www.baidu.com/?code=NUW686

2、申请令牌(POST)
请求参数:
http://localhost:8088/oauth/token

{
    "client_id": "system",
    "client_secret": "123456",
    "grant_type": "authorization_code",
    "code": "NUW686",
    "redirect_uri": "https://www.baidu.com"
}
返回值:
{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NjI3NDksInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiNWZmODlhZWItYjBiZC00ODUwLWFkNDMtMzc0MDIwNDVhZGYzIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19._lyu9SD8emGrC90cxr1oP3nn3a-sVU-7WQe0lUV2CBY",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFwcCJdLCJhdGkiOiI1ZmY4OWFlYi1iMGJkLTQ4NTAtYWQ0My0zNzQwMjA0NWFkZjMiLCJleHAiOjE2NjMyMjAxNDksImF1dGhvcml0aWVzIjpbIlJPTEVfc2FsZSIsIm1lbnU6c3lzdGVtIiwicXgxIl0sImp0aSI6IjBlNDExOWFhLWY4YjItNDVlNS1hNDk3LTMzYTI0MmU5MDliZiIsImNsaWVudF9pZCI6InN5c3RlbSJ9.Q32sPUyzF6_ggbvytTJbjkxCDjBM8K8069jpG9Y0HFM",
    "expires_in": 1799,
    "scope": "app",
    "jti": "5ff89aeb-b0bd-4850-ad43-37402045adf3"
}

3、校验令牌(POST)
http://localhost:8088/oauth/check_token
请求参数:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NjI3NDksInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiNWZmODlhZWItYjBiZC00ODUwLWFkNDMtMzc0MDIwNDVhZGYzIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19._lyu9SD8emGrC90cxr1oP3nn3a-sVU-7WQe0lUV2CBY"
}
返回值:
{
    "user_name": "admin",
    "scope": [
        "app"
    ],
    "active": true,
    "exp": 1662962749,
    "authorities": [
        "ROLE_sale",
        "menu:system",
        "qx1"
    ],
    "jti": "5ff89aeb-b0bd-4850-ad43-37402045adf3",
    "client_id": "system"
}

2、简化模式

概念

在这里插入图片描述
在这里插入图片描述

请求接口

1、申请令牌(只能浏览器get)(账号密码system  123456)(少了获取授权码的一步)(注意type变为了token=简化模式)
请求前:(state=coding10laravel不传也行的。表示客户端的当前状态,为预防 CSRF 攻击,请务必设定此值并进行严格检查,认证服务器会原封不动地返回这个值。)
http://localhost:8088/oauth/authorize?client_id=system&response_type=token&scope=app&redirect_uri=https://www.baidu.com&state=coding10laravel
请求后:
https://www.baidu.com/#access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NzEzODgsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiYjA3ZTcwY2UtNDUzYS00N2E4LTg5YjItNDA1ZjExZWVkYzZkIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19.Tc92EQRhkiBgS5vMVGtVBtYN60IiZfWCK6mxctwyhZw&token_type=bearer&state=coding10laravel&expires_in=1799&jti=b07e70ce-453a-47a8-89b2-405f11eedc6d

2、校验令牌(POST)
http://localhost:8088/oauth/check_token
请求参数:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NzEzODgsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiYjA3ZTcwY2UtNDUzYS00N2E4LTg5YjItNDA1ZjExZWVkYzZkIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19.Tc92EQRhkiBgS5vMVGtVBtYN60IiZfWCK6mxctwyhZw"
}
返回值:
{
    "user_name": "admin",
    "scope": [
        "app"
    ],
    "active": true,
    "exp": 1662971388,
    "authorities": [
        "ROLE_sale",
        "menu:system",
        "qx1"
    ],
    "jti": "b07e70ce-453a-47a8-89b2-405f11eedc6d",
    "client_id": "system"
}

访问报错,坑的原因是 数据库少配置了东西。
该模式常见于没有服务器的web应用上,由浏览器直接向认证服务器申请令牌了,token也暴露到url地址上面了,不太安全
在这里插入图片描述
在这里插入图片描述

3、密码模式

概念

在这里插入图片描述
注意,只适合我们自己开发,因为泄漏了密码了
在这里插入图片描述

请求接口

1、申请令牌(POST)
请求参数:
http://localhost:8088/oauth/token

{
    "client_id": "system",
    "client_secret": "123456",
    "grant_type": "password",    
    "username": "admin",// 登录传过来的username和密码,要和UserDetailsService查询数据库的数据对比校验,由于密码泄漏,所以只能是我们自己开发的应用用这种模式
 "password":"123456"
}
返回值:
{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NzQ3NzEsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiYTk1NzRkOGYtMWE3My00ZWI5LWJmNGMtOTRjNGY5ZjI1NzE0IiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19.Gt8sqd8XWQdvdEf7ZqSpML3g81tUBm7hwdOuYMG0_RE",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFwcCJdLCJhdGkiOiJhOTU3NGQ4Zi0xYTczLTRlYjktYmY0Yy05NGM0ZjlmMjU3MTQiLCJleHAiOjE2NjMyMzIxNzEsImF1dGhvcml0aWVzIjpbIlJPTEVfc2FsZSIsIm1lbnU6c3lzdGVtIiwicXgxIl0sImp0aSI6IjdkYzBlYzY0LTIyNTktNGU1YS04YjM2LTg4MDZiMTlkN2I0OSIsImNsaWVudF9pZCI6InN5c3RlbSJ9.ZFKzTvFLdtNKpUJMmiql7_N3bbIGfDI7AoFDsmC08OU",
    "expires_in": 1799,
    "scope": "app",
    "jti": "a9574d8f-1a73-4eb9-bf4c-94c4f9f25714"
}

2、校验令牌(POST)
http://localhost:8088/oauth/check_token
请求参数:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NjI3NDksInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiNWZmODlhZWItYjBiZC00ODUwLWFkNDMtMzc0MDIwNDVhZGYzIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19._lyu9SD8emGrC90cxr1oP3nn3a-sVU-7WQe0lUV2CBY"
}
返回值:
{
    "user_name": "admin",
    "scope": [
        "app"
    ],
    "active": true,
    "exp": 1662962749,
    "authorities": [
        "ROLE_sale",
        "menu:system",
        "qx1"
    ],
    "jti": "5ff89aeb-b0bd-4850-ad43-37402045adf3",
    "client_id": "system"
}

4、客户端模式

概念

返回值没有刷新令牌
在这里插入图片描述
在这里插入图片描述

请求接口

1、申请令牌(POST)
请求参数:
http://localhost:8088/oauth/token

{
    "client_id": "system",
    "client_secret": "123456",
    "grant_type": "password"

}
返回值(注意没有刷新令牌):
{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NzQ3NzEsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiYTk1NzRkOGYtMWE3My00ZWI5LWJmNGMtOTRjNGY5ZjI1NzE0IiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19.Gt8sqd8XWQdvdEf7ZqSpML3g81tUBm7hwdOuYMG0_RE",
    "token_type": "bearer",
    "expires_in": 1799,
    "scope": "app",
    "jti": "a9574d8f-1a73-4eb9-bf4c-94c4f9f25714"
}

2、校验令牌(POST)
http://localhost:8088/oauth/check_token
请求参数:
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI5NjI3NDksInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9zYWxlIiwibWVudTpzeXN0ZW0iLCJxeDEiXSwianRpIjoiNWZmODlhZWItYjBiZC00ODUwLWFkNDMtMzc0MDIwNDVhZGYzIiwiY2xpZW50X2lkIjoic3lzdGVtIiwic2NvcGUiOlsiYXBwIl19._lyu9SD8emGrC90cxr1oP3nn3a-sVU-7WQe0lUV2CBY"
}
返回值:
{
    "user_name": "admin",
    "scope": [
        "app"
    ],
    "active": true,
    "exp": 1662962749,
    "authorities": [
        "ROLE_sale",
        "menu:system",
        "qx1"
    ],
    "jti": "5ff89aeb-b0bd-4850-ad43-37402045adf3",
    "client_id": "system"
}

五、资源服务器配置

1、概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、验证token

在这里插入图片描述
在这里插入图片描述

3、请求访问

在只有Security的时候,UserDetailServiceImpl中的权限menu:system只要能和Controller中test方法上的@PreAuthorize(“hasAnyAuthority(‘menu:system’)”) 对应的上,那么就可以访问这个test接口。但是加了OAuth2协议后,就必须header里面增加令牌等信息,才能访问test接口成功。

密码模式下的申请令牌(这个是非jwt的令牌截图,升级jwt以后令牌非常长)
在这里插入图片描述
开始报401是把资源服务的配置给关闭了,打开就可以了。
在这里插入图片描述

4、JWT令牌

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果第一二部门被篡改,第三部分直接可以校验就知道是否被篡改了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、CAS(SSO框架)和OAuth2的区别

1、概念

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
cas原理图
在这里插入图片描述

2、铁哥总结

相同点:
1、都是登录的时候跳转到CAS或者微信认证中心了,也就是说都是第三方提供登录界面(输入用户名和密码的地方),并不是业务系统自己的登录界面,用户名和密码也是第三方保存了,业务系统自己不知道用户密码。
2、登录成功后也是CAS或者微信认证中心给发个ticket(code)给业务系统,业务系统带着ticket再次请求CAS或者微信认证中心的时候能获取更有用的信息。
不同点:
1、业务系统带着ticket再次请求CAS是直接可以拿到用户信息的,而且此时设置局部session返回给浏览器了sessionid,浏览器用sessionid和业务系统各接口互通有无。
2、业务系统带着ticket再次请求微信认证中心拿到的是token(oAuth2这边有四种模式,这里说授权码模式),业务系统带着token再再再请求微信认证中心才能拿到用户信息,而且此时既可以设置session返回给浏览器sessionid,也可以返回给浏览器业务系统自己的token,可以灵活使用各种令牌技术。
3、CAS技术方案中,业务系统和浏览器只能用session机制,CAS服务器有个全局session,每一个业务系统有自己的局部session,两个session是有关联的,可能是一样的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝影铁哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值