简介: 【方向盘】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)(中)
Java中使用JWT
具体简单应用,参考博文:JWT在JAVA项目中的简单实际应用
详解OAuth2.0是什么(通俗易懂版)
OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。
举个例子
你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注册一个再使用豆瓣,怎么办呢?不用担心,豆瓣已经为你这种懒人做了准备,用你的qq号可以授权给豆瓣进行登录,请看:
第一步:在豆瓣官网点击用qq登录
第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录
第三步:跳回到豆瓣页面,成功登录
我们发现,我们竟然用QQ帐号登录进了豆瓣的系统里。到底发生了什么?
小白视角(只会看表面现象):
就是在豆瓣官网上输了个qq号和密码就登录成功了。在一些细心的用户视角看来,页面经历了从豆瓣到qq,再从qq到豆瓣的两次页面跳转。
上帝视角(程序员专业视角):
简单来说,上述例子中的豆瓣就是客户端,QQ就是认证服务器,OAuth2.0就是客户端和认证服务器之间由于相互不信任而产生的一个授权协议。
呵呵,要是相互信任那QQ直接把自己数据库给豆瓣好了,你直接在豆瓣输入qq账号密码查下数据库验证就登陆呗,还跳来跳去的多麻烦
其实整个过程,用下面这一张图,就能上帝视角很清晰的看出来端倪:
备注:所用到的请求路径名称都是虚构的,所附带的请求参数忽略了一些非重点的。
1.第一步:在豆瓣官网点击用qq登录
当你点击用qq登录的小图标时,实际上是向豆瓣的服务器发起了一个 http://www.douban.com/leadToAuthorize 的请求,豆瓣服务器会响应一个重定向地址,指向qq授权登录
浏览器接到重定向地址 404 您访问的页面找不到了_腾讯网,再次访问。并注意到这次访问带了一个参数是callback,以便qq那边授权成功再次让浏览器发起这个callback请求。不然qq怎么知道你让我授权后要返回那个页面啊,每天像豆瓣这样的需要QQ授权的网站这么多。
2.第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录
上一步中浏览器接到重定向地址并访问 404 您访问的页面找不到了_腾讯网
这时候来到的页面是QQ这边的登录授权页面。当访问QQ服务器验证用户名密码成功后,该方法会响应浏览器一个重定向地址,并附上一个code(**授权码**)。而这个授权码,就是豆瓣这边关心的了,因为豆瓣才不管QQ那边是怎么授权的呢。
3. 第三步:跳回到豆瓣页面,成功登录
这一步背后的过程其实是最繁琐的,但对于用户来说是完全感知不到的(所以你看页面上消耗的时间一般都比较长,长达好几秒)。用户在QQ登录页面点击授权登陆后,就直接跳转到豆瓣首页了,但其实经历了很多隐藏的过程。
QQ服务器在判断登录成功后,使页面重定向到之前豆瓣发来的callback的URL并且附上QQ自己提供的code授权码,即 callback=www.douban.com/callbackwithauthcode
当发送这个请求到豆瓣的服务器的时候,就复杂了,主要做了两件事(模拟了两次请求):
1.用拿到的授权码code去换token(和QQ服务器交互)
2.用拿到的token换取用户信息,比如用户名、头像等等信息(和QQ服务器交互)
最后信息拿到后,豆瓣这边就把你的信息存下来,返回到首页给你看。这样就完成了一套完整的授权。QQ服务器成功的把你的qq信息授权交给豆瓣了,完美
编码实现
其实Spring和OAuth是可以完美融合的使用的。Spring Cloud官方更是提供了starter进行天然支持。
具体编码过程,本文不做详解,具体参考博文:
基于Srping security
Spring Cloud OAuth2(一) 搭建授权服务
Spring Cloud OAuth2(二) 扩展登陆方式:账户密码登陆、 手机验证码登陆、 二维码扫码登陆
理解OAuth和JWT的区别(通俗易懂)
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是一种授权框架。提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。