一张图搞定OAuth2.0

1、引言

本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式

非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们。

一项新的技术,无非就是了解它是什么为什么怎么用。至于为什么,本篇文章不做重点探讨,网上会有各种文章举各种什么丢钥匙、发船票的例子供你去阅读,个人认为还是有些哗众取宠,没有聊到本质。

那我们就重点聊聊OAuth2.0是什么怎么用。但首先在读本文之前,你要先对OAuth2.0有一定的了解,建议先读一下阮一峰的oauth2.0文章,直接看“授权码模式”即可,带着疑问再来读本文效果更好。

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

2、OAuth2.0是什么

OAuth2.0是什么——豆瓣和QQ的故事

OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。

举个例子,你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注册一个再使用豆瓣,怎么办呢?不用担心,豆瓣已经为你这种懒人做了准备,用你的qq号可以授权给豆瓣进行登录,请看。

第一步:在豆瓣官网点击用qq登录

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

 

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

 这几秒钟之内发生的事情,在无知的用户视角看来,就是在豆瓣官网上输了个qq号和密码就登录成功了。在一些细心的用户视角看来,页面经历了从豆瓣到qq,再从qq到豆瓣的两次页面跳转。但作为一群专业的程序员,我们还应该从上帝视角来看这个过程。

OAuth2.0是什么——上帝视角

  简单来说,上述例子中的豆瓣就是客户端,QQ就是认证服务器,OAuth2.0就是客户端和认证服务器之间由于相互不信任而产生的一个授权协议。呵呵,要是相互信任那QQ直接把自己数据库给豆瓣好了,你直接在豆瓣输入qq账号密码查下数据库验证就登陆呗,还跳来跳去的多麻烦。

  先上一张图,该图描绘了只几秒钟发生的所有事情用上帝视角来看的流程

 就这这张图,来说一下上述例子中的三个步骤在图中的表现。所用到的请求路径名称都是虚构的,所附带的请求参数忽略了一些非重点的。

如想了解每次的请求和响应的标准齐全的参数,还是去读那篇阮一峰的文章。http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

第一步:在豆瓣官网点击用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的服务器接受到了豆瓣访问的authorize,在次例中所给出的回应是跳转到qq的登录页面,用户输入账号密码点击授权并登录按钮后,一定还会访问qq服务器中校验用户名密码的方法,若校验成功,该方法会响应浏览器一个重定向地址,并附上一个code(授权码)。由于豆瓣只关心像qq发起authorize请求后会返回一个code,并不关心qq是如何校验用户的,并且这个过程每个授权服务器可能会做些个性化的处理,只要最终的结果是返回给浏览器一个重定向并附上code即可,所以这个过程在图中并没有详细展开。现把展开图画给大家。

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

 这一步背后的过程其实是最繁琐的,但对于用户来说是完全感知不到的。用户在QQ登录页面点击授权登陆后,就直接跳转到豆瓣首页了,但其实经历了很多隐藏的过程。

首先接上一步,QQ服务器在判断登录成功后,使页面重定向到之前豆瓣发来的callback并附上code授权码,即 callback=www.douban.com/callback 

页面接到重定向,发起 http://www.douban.com/callback 请求

豆瓣服务器收到请求后,做了两件再次与QQ沟通的事,即模拟浏览器发起了两次请求。一个是用拿到的code去换token,另一个就是用拿到的token换取用户信息。最后将用户信息储存起来,返回给浏览器其首页的视图。到此OAuth2.0授权结束。

 

转载于:https://www.cnblogs.com/AnXinliang/p/9991732.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

insert select 过滤掉重复数据

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 table1和table2表结构一样时: INSERT INTO table2 SELECT * FROM table1;table1和table2表结构不一样时: INSERT INTO table2(field1,field2,field3) SELECT …

jdbc连接sqlserver,mysql,oracle

class xxx{private static String port "1433";private static String ip "192.168.2.163";//mysql : jdbc:mysql:////sqlserver : jdbc:sqlserver// 或者 jdbc:microsoft:sqlserver://private static String driverType "jdbc:sqlserver://&qu…

extjs展示列表,显示来很多空白行,但是数据没显示

检查&#xff1a; mysql查询是没有大小写问题 sql返回的字段大小写问题 Map<String, Object> result new hashmap<String, Object>();创建的map、key是有大小写区分 Map<String, Object> result new CaseInsensitiveMap(); 中的key是没大小写区分 最后…

linux部署redis详细步骤

公司一直在使用redis集群&#xff0c;寻思着自己也部署一套练练手。 打开redis的官网下载页&#xff1a;https://redis.io/download 按照官网的步骤进行操作&#xff1a; 你会发现输入src/redis-cli命令之后&#xff0c;一直连接不上。 提示信息&#xff1a;Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数&#xff0c;例如-1&#xff0c;-1/2&#xff0c;-3‘4/5等。 4) 题目的数量&#xff08;个人项目的要求&#xff09; 5) …

linux部署redis集群遇到的问题

版本信息&#xff1a; redis&#xff1a;5.0.8 linux服务器&#xff1a;CentOS 7 不同版本问题处理方式可能有所不同 1、在java程序中&#xff0c;连接不上redisCluster。 报错信息&#xff1a; no reachable node in cluster 原因&#xff1a;创建集群时&#xff0c;使用了127…

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

mysql服务自动关闭的解决

笔记本上设置成合上板子不休眠&#xff0c;于是干脆把笔记本放在书包里面&#xff0c;通过远程桌面连接笔记本电脑&#xff0c;经过了很长的时间&#xff0c;再去连接数据库&#xff0c;结果出现cann’t connect 10061错误&#xff0c;发现原来是MySQL服务不知怎么的就关闭了&a…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

安装版win7安装时分区

先创建一个主分区&#xff0c;用于安装系统然后按下 ShiftF10 启动命令窗口&#xff0c;输入如下命令输入 diskpart 并回车list disk //显示所有硬盘select disk 0 //选择你的硬盘create partition extended //把剩下的…

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件&#xff0c;加入如下配置&#xff1a; 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…

详细介绍nagios基本配置

配置文件路径/usr/local/nagios/etc/objects类型名 包含文件 作用基类配置文件 templates.cfg 定义基类时间配置文件 timeperiods.cfg 定义控制时间联系人文件 contacts.cfg 定义联系人信息和联系人组监控文件 localhost…

轻知 | 为什么全球只有13组根域名服务器?

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由9527发表 根域名服务器是域名解析系统&#xff08;DNS&#xff09;中最为顶级的域名服务器&#xff0c;它们负责管理顶级域的权威域名服务器地址。作为互联网基础设施的重要部分&#xff0c;所有域名…

Openssl更新步骤

openssl下载地址&#xff1a;http://www.openssl.org/source/安装openssl#tar zxvf openssl-0.9.8i.tar.gz#cd openssl-0.9.8i#./config shared zlib #make #make test #make install mv /usr/bin/openssl /usr/bin/openssl.OFF &#xff08;关闭系统自带的&#xff09;mv /us…

HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)

<题目链接> 题目大意&#xff1a; 一个有向图&#xff0c;让你按规则划分区域&#xff0c;要求划分的区域数最少。 规则如下&#xff1a;1.所有点只能属于一块区域&#xff1b;2&#xff0c;如果两点相互可达&#xff0c;则这两点必然要属于同一区域&#xff1b;3&#x…

nagios常见问题

1.错误“CHECK_NRPE: Received 0 bytes from daemon. Check the remote server logs for error messages.”解决&#xff1a;启用了NRPE的命令行参数功能&#xff0c;不过可能会带来严重的安全问题。$ /usr/local/nagios/etc/nrpe.cfgdont_blame_nrpe12.在Nagios中&#xff0c;…

【Linux 命令】- find 命令

find 是日常工具箱中功能更强大、更灵活的命令行工具之一&#xff0c;因此值得花费更多的时间。 最简单的&#xff0c;find 跟上路径寻找一些东西。例如&#xff1a; find / 它将找到&#xff08;并打印出&#xff09;系统中的每个文件。而且由于一切都是文件&#xff0c;你会得…

CentOS提示另一个目前运行的程序正在访问软件信息

原因是&#xff1a;yum&#xff0d;updatesd服务一起的&#xff0c;这个服务会时不时的访问网络&#xff0c;如果卡住了&#xff0c;同时你又在运行yum&#xff0c;就会总是提示你另一程序在访问软件信息用 rm -f /var/run/yum.pid 杀掉 yum-updatesd 就好了命令如下&#xff1…