具体简单应用,参考博文:JWT在JAVA项目中的简单实际应用
OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。
你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注册一个再使用豆瓣,怎么办呢?不用担心,豆瓣已经为你这种懒人做了准备,用你的qq号可以授权给豆瓣进行登录,请看:
第一步:在豆瓣官网点击用qq登录

第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录

第三步:跳回到豆瓣页面,成功登录

我们发现,我们竟然用QQ帐号登录进了豆瓣的系统里。到底发生了什么?
- 小白视角(只会看表面现象):
就是在豆瓣官网上输了个qq号和密码就登录成功了。在一些细心的用户视角看来,页面经历了从豆瓣到qq,再从qq到豆瓣的两次页面跳转。 - 上帝视角(程序员专业视角):
简单来说,上述例子中的豆瓣就是客户端,QQ就是认证服务器,OAuth2.0就是客户端和认证服务器之间由于相互不信任而产生的一个授权协议。
呵呵,要是相互信任那QQ直接把自己数据库给豆瓣好了,你直接在豆瓣输入qq账号密码查下数据库验证就登陆呗,还跳来跳去的多麻烦
其实整个过程,用下面这一张图,就能上帝视角很清晰的看出来端倪:

备注:所用到的请求路径名称都是虚构的,所附带的请求参数忽略了一些非重点的。
- 第一步:在豆瓣官网点击用qq登录
当你点击用qq登录的小图标时,实际上是向豆瓣的服务器发起了一个 http://www.douban.com/leadToAuthorize 的请求,豆瓣服务器会响应一个重定向地址,指向qq授权登录
浏览器接到重定向地址 http://www.qq.com/authorize?callback=www.douban.com/callback,再次访问。并注意到这次访问带了一个参数是callback,以便qq那边授权成功再次让浏览器发起这个callback请求。不然qq怎么知道你让我授权后要返回那个页面啊,每天像豆瓣这样的需要QQ授权的网站这么多。
- 第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录
上一步中浏览器接到重定向地址并访问 http://www.qq.com/authorize?callback=www.douban.com/callback
这时候来到的页面是QQ这边的登录授权页面。当访问QQ服务器验证用户名密码成功后,该方法会响应浏览器一个重定向地址,并附上一个code(**授权码**)。而这个授权码,就是豆瓣这边关心的了,因为豆瓣才不管QQ那边是怎么授权的呢。
3. 第三步:跳回到豆瓣页面,成功登录
这一步背后的过程其实是最繁琐的,但对于用户来说是完全感知不到的(所以你看页面上消耗的时间一般都比较长,长达好几秒)。用户在QQ登录页面点击授权登陆后,就直接跳转到豆瓣首页了,但其实经历了很多隐藏的过程。
QQ服务器在判断登录成功后,使页面重定向到之前豆瓣发来的callback的URL并且附上QQ自己提供的code授权码,即 callback=www.douban.com/callbackwithauthcode
当发送这个请求到豆瓣的服务器的时候,就复杂了,主要做了两件事(模拟了两次请求):
- 用拿到的授权码code去换token(和QQ服务器交互)
- 用拿到的token换取用户信息,比如用户名、头像等等信息(和QQ服务器交互)
最后信息拿到后,豆瓣这边就把你的信息存下来,返回到首页给你看。这样就完成了一套完整的授权。QQ服务器成功的把你的qq信息授权交给豆瓣了,完美
其实Spring和OAuth是可以完美融合的使用的。Spring Cloud官方更是提供了starter进行天然支持。
具体编码过程,本文不做详解,具体参考博文:
基于Srping security
Spring Cloud OAuth2(一) 搭建授权服务
Spring Cloud OAuth2(二) 扩展登陆方式:账户密码登陆、 手机验证码登陆、 二维码扫码登陆
1、oauth2有client和scope的概念,jwt没有。如果只是拿来用于颁布token的话,二者没区别。常用的bearer算法oauth、jwt都可以用。应用场景不同而已
2、Spring Cloud 的权限框架就是用的jwt实现的oauth2 。二者没有必然联系
3、Token功能不一样,JWT的token是包含用户基本信息的,然后通过加密的方式生成的字符串,服务器端拿到这个token之后不需要再去查询用户基本信息,解析完token之后就能拿到。想想在微服务架构下,用户服务是一个单独的服务,但是其他服务大部分情况下也会需要用户信息,难道要每次用到都去取一次吗? JWT非常适合微服务。
4、OAuth2用在使用第三方账号登录的情况(比如使用weibo, qq, github登录某个app)。OAuth2是一个相对复杂的协议, 有4种授权模式, 其中的access code模式在实现时可以使用jwt才生成code, 也可以不用. 它们之间没有必然的联系.
5、JWT是用在前后端分离, 需要简单的对后台API进行保护时使用.(前后端分离无session, 频繁传用户密码不安全)
6、JWT是一种认证协议 。JWT提供了一种用于**发布接入令牌(Access Token),**并对发布的签名接入令牌进行验证的方法。 令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明限制用户对资源的访问。
7、OAuth2是一种授权框架。提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。
jwt应用场景:
- 无状态的分布式API
JWT的主要优势在于使用无状态、可扩展的方式处理应用中的用户会话。服务端可以通过内嵌的声明信息,很容易地获取用户的会话信息,而不需要去访问用户或会话的数据库。在一个分布式的面向服务的框架中,这一点非常有用。
但是,如果系统中需要使用黑名单实现长期有效的token刷新机制,这种无状态的优势就不明显了(因为还是需要访问数据库,刷新时间啥的)
Oauth2应用场景:
- 外包认证服务器
如果不介意API的使用依赖于外部的第三方认证提供者,你可以简单地把认证工作留给认证服务商去做。
常见的,去认证服务商(比如facebook)那里注册你的应用,然后设置需要访问的用户信息,比如电子邮箱、姓名等。当用户访问站点的注册页面时,会看到连接到第三方提供商的入口。用户点击以后被重定向到对应的认证服务商网站,获得用户的授权后就可以访问到需要的信息,然后重定向回来。
这种做法的优势:快速开发,实现代码量小,维护工作简单
- 大型企业解决方案
如果设计的API要被不同的App使用,并且每个App使用的方式也不一样,使用OAuth2是个不错的选择。
优势:灵活的实现方式 ,可以和JWT同时使用,可针对不同应用扩展
OAuth1.0中的access_token过期时间通常很长,安全性差。于是OAuth2.0推出了refresh_token。
OAuth2.0为了增强安全性,access token的有效期被大大缩短,通常只有几个小时,也可以申请增加到几十天,但是总是会有过期的时候。为此,OAuth2.0增加了一个refresh token的概念,这个token并不能用于请求api.它是用来在access token过期后刷新access token的一个标记.
access_token的有效期一般都很短,几个小时到几天不等。如果这个时间已经过了,难道强制要求用户重新登录一次?那是不是体验太糟糕了。这个时候refresh_token就有用武之地了。
这个时候客户端就可以通过refresh_token获得新的access_token,expire_in,与refresh_token。 周而复始,你的token的有效期就能被明显延长了
这里所描述的场景,通常是指那种长周期的应用.也就是需要一直保持用户在线的应用.
在线并不是说用户一直在用这个应用,也可能是用户已经离开,我们在后台仍然可以自动维持用户的状态.例如一个自动发状态的应用.用户并不需要操作这个应用,我们会定时在后台利用用户的accesskey帮助用户发送状态.这也算是用户维持登录状态的一种.
因此如果你的refresh_token有效期是1个月,你只需要每个月帮用户发一条状态的话,走上面的流程,一直下去,这个用户的登录状态一直都不会过期。(App移动端就可以这么来实现)
这篇文章,你值得拥有:
JWT(JSON Web Token)自动延长到期时间
1、为了不能一个帐号多次登录,因此当别地获取到一个新的token时候,之前的token需要作废,不能够在使用(做得更好一点,可以通知另外一端强制下线。参考QQ俩PC端同时登录的情况)
2、token的过期时间的设置 也一定要谨慎
总而言之,Oauth2和jwt是完全不同的两种东西,一个是授权认证的框架,另一种则是认证验证的方式方法(轻量级概念)。OAuth2不像JWT一样是一个严格的标准协议,因此在实施过程中更容易出错。尽管有很多现有的库,但是每个库的成熟度也不尽相同,同样很容易引入各种错误。在常用的库中也很容易发现一些安全漏洞。
注意:
两种方案都需要SSL安全保护,也就是对要传输的数据进行加密编码。安全地传输用户提供的私密信息,在任何一个安全的系统里都是必要的。否则任何人都可以通过侵入私人wifi,在用户登录的时候窃取用户的用户名和密码等信息。
安全这个概念都是相对的,没有绝对的。比如服务端自己掌握着加密值,但万一这个值被泄漏了呢?别人还是可以破译你的JWT了。但是加上SSL的话,安全性就大大增加了
System.out.println("写得可还行?收藏再看吧,点个赞吧,分享下吧");
echo("关注公号【Java方向盘】 https://yourbatman.cn https://wangpan.yourbatman.cn");
console.log("私聊【方向盘】:fsx1056342982");
我是方向盘(YourBatman、方哥):一个前25年还不会写Hallo World、早已毕业的大龄程序员。网瘾失足、清考、延期毕业、房产中介、保险销售、送外卖…是我不可抹灭的黑标签
- 🎓2013.07 清考、毕业答辩3次未通过、延期毕业
- 🏷2013.08-2014.07 宁夏中介公司卖二手房1年,毕业后第1份工作
- ️️🏷2014.07-2015.05 荆州/武汉,泰康人寿卖保险3月、饿了么送外卖2月,还有炸鸡排、直销等第2345份工作
- 🏷2015.08 开始从事Java开发,闯过外包,呆过大厂!多年架构经验,任基础架构/中间件团队负责人
- 🏷2021.08 因“双减政策”失业!历经9面,终获美团外卖L8的offer
- 🙅🏻♀️Java架构师、Spring开源贡献者、CSDN博客之星年度Top 10、领域建模专家、写作大赛1/2届评委
- 📚将出版书籍《Spring奇淫巧技》,致力于国内zui好、zui具深度、zui实用的专栏,为市场贡献微薄之力
- 现在写纯粹技术专栏(公号后台回复专栏列表),不哗众取宠。如果你也有共鸣,可加我好友(fsx1056342982)一起进步
接口说明,支持两种方式,两套接口
1.使用JWT生成Token,使用shiro实现鉴权
2.使用oauth2生成token,spring security实现鉴权
使用JWT生成Token,使用shiro实现鉴权
UMS返回参数说明
请求状态(0:失败;1:成功)
messageCode
详情请移步错误码page
message
String
result
Object
获取token
POST /shiro/auth/token
applicationKey
String
需要登录的项目key
userName
String
password
String
返回Result
token
String
使用JWT生成的Token
官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html
翻译及修改补充:Alex Liao.
转载请注明来源:http://www.cnblogs.com/xingxueliao/p/5911292.html
Spring OAuth2.0 提供者实现原理:
Spring OAuth2.0提供...
Oauth2:
是一种安全的授权框架,提供了一套详细的授权机制。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。它详细描述了系统中不同角色、用户、服务前端应用(比如API),以及客户端(比如网站或移动App)之间怎么实现相互认证。
Oauth2定义了一组想当复杂的规范。涉及到:Roles角色、Client Types客户端类型、Client Profile客户端描述、Authorization ...
随着互联网技术的发展,微服务架构已经成为每个互联网公司的标配。伴随着服务粒度的细化,服务的安全和鉴权问题,以及客户端与服务之间的认证问题已经成为必不可少的一项工作。说起认证和鉴权,那怎么少得了 OAuth 2.0 协议呢?火锅店旁边的照片打印机这个案例想必大家都遇到过,在商场里面或者餐馆门口会看到一些可以打印照片的设备。想要设备打印出照片那么必须传输照片给设备,但是假如此时由于你的手机设备存储有限...
适用人群所有的IT从业者,尤其适合快速掌握新技术,快速增长工作经验人群,对教育公平,教育公益,教育爱心公益人士提供完整的课程源代码,前端 后端点击视频观看,在右侧的【课件】中下载,所有代码都是线下班级运行很多次额,请放心购买。 课程概述该互联网实战项目是基于 Spring Boot 2+ SpringSecurity5+Element UI+Vue Admin Template+蚂蚁可视化AntV 等技术栈开发的项目,采用分布式,多模块,前后端分离开发。包括图形展示、权限管理、用户管理等功能。【后端技术】技术说明Spring Boot2MVC框架 开发的一站式解决方案Spring Security5 认证和授权框架MyBatisPlus3.3.1 基于 MyBatis 框架的快速研发框架MyBatisCode工具生成 MyBatis 相关代码Jackson提供了处理 JSON 数据的工具Lombok简化对象封装工具 Druid 数据库连接池 【前端技术】Vue 互联网最火的前端框架Vue Router路由框架Vuex全局状态管理框架Axios前端 HTTP 框架Element UI前端 UI 框架Vue Element Admin前端模板Antv 蚂蚁金服可视化技术,阿里巴巴可视化技术,天猫,淘宝,支付宝,花呗均使用AntV【开发工具】IntelliJ IDEA开发 IDESQLyog数据库连接客户端PostmanHTTP 请求工具【开发环境】工具版本JDK1.8MySQL5.7
该互联网实战项目是基于 Spring Boot 2+ SpringSecurity5+Element UI+Ant Design Pro Vue+可视化AntV 等技术栈开发的项目,采用多模块前后端分离开发。包括图形展示、权限管理、用户管理等功能,用于研发企业级中后台产品。【后端技术】技术 说明Spring Boot2 MVC框架 开发的一站式解决方案Spring Security5 认证和授权框架MyBatisPlus3.3.1 基于 MyBatis 框架的快速研发框架MyBatisCode工具 生成 MyBatis 相关代码Jackson 提供了处理 JSON 数据的工具Lombok 简化对象封装工具 Druid 数据库连接池 【前端技术】Vue 互联网最火的前端框架Vue Router 路由框架Vuex 全局状态管理框架Axios 前端 HTTP 框架Element UI 前端 UI 框架Ant Design Pro Vue 前端模板Antv 蚂蚁金服可视化技术,阿里巴巴可视化技术,天猫,淘宝,支付宝,花呗均使用AntV主要用于研发企业级中后台产品。特性提炼自企业级中后台产品的交互语言和视觉风格。使用 TypeScript 开发,提供完整的类型定义文件。 链路开发和设计工具体系。【开发工具】IntelliJ IDEA 开发 IDESQLyog 数据库连接客户端Postman HTTP 请求工具【开发环境】工具 版本JDK 1.8MySQL 5.7
什么是OAuth2?
OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在限定时间、限定范围访问指定资源。主要涉及的RFC规范有RFC6749(整体授权框架),RFC6750(令牌使用),RFC6819(威胁模型)这几个,一般我们需要了解的就是RFC6749。获取令牌的方式主要有四种,分别是授权码模式,简单模式,密码模式和客户端模式,如何获取token不在本篇文章的讨论范围,我们这里假定客户
在我们的 java 业务系统中,或多或少的会涉及到权限、认证等类似的概念。但是很多小伙伴还是傻傻的分不清这些的概念和区别,今天我们就来好好的捋一捋,将其区别的概念深深的刻在脑海中。
认证 Authentication
百度百科中对于认证的解释是:身份验证(Authentication),在 .NET Framework 安全中,通过对照某些机构检查用户的凭据,发现和验证主体标识的过程。
当然,今天我们来讨论肯定不会用这么生硬的词来解...
jwt全称 JSON Web Token。这个实现方式不用管如何进行存储(内存或磁盘),
因为它可以把相关信息数据编码存放在令牌里
。JwtTokenStore 不会保存任何数据,
但是它在转换令牌值以及授权信息方面与 DefaultTokenServices 所扮演的角色是一样的。
OAuth2提供了JwtAccessTokenCo.........