最近在补架构师图谱里的内容,OAuth2.0是其中一块,抽空看了几个文章,理解了一下。
不过我感觉多数文章都不是很直观,花费了好久才理解其中的过程,以及为什么要这么设计,也许里面还有一些为什么没搞清楚。
于是我试着写出来,用更好的方式来理解OAuth2.0。
一、OAuth2.0是什么
我们经常用某些公众号,用一些论坛,有用QQ,微信登录什么的,需要你在QQ,微信的界面上授权,这些号、论坛就可以拿到你的个人信息,头像什么的,但他们没有你的用户密码。
生活中,我去银行办理过代扣水电煤,银行确认我的身份,然后签一个代扣合同,给我回执,之后水电煤公司就直接从我的账户划钱过去了。但公司不知道我的密码,不能代做其它没授权的操作。
差不多上OAuth2.0就是解决上面的问题。
二、如果我来设计OAuth2.0,怎么设计?
先设想一个场景:我有银行账户,想授权朋友查看账户金额,不告诉他密码,应该怎么办?
我和朋友去银行,银行先后验证我们俩的身份证。银行让我签一个授权合同,上面写着我授权朋友查我的账户,银行给我和朋友各一份合同凭证。银行后台登记朋友拿这个凭证可以查我的账户这样一条信息。之后朋友拿着凭证和他自己的身份证,果然查到了我的账户信息。
上面的分析蛮简单的,貌似也没有什么问题。朋友不可能转账,因为银行会查授权合同,我的合同被其它人知道了,别人也不可能查我的账户,因为只授权给朋友。
那么把上面的过程转化到应用之中去。
- 我在某论坛上操作,希望用QQ登录。(论坛认为我有QQ号的,论坛本身也在QQ注册过自己的应用的。就如同去银行,这个银行必须可以鉴定我们双方的身份。)
- 点了QQ登录,那论坛就引导跳转到QQ的授权页面了。(这个过程中,论坛必须提供了自己的登录信息,QQ那边认证了,才出现授权页面。)
- 在这个页面里,我要登录一下QQ了。前面已经认证过论坛了,现在登录就是认证我了。
- 登录成功后,QQ显示出授权的内容,让我确认,我点了确认。(类似银行让我签授权合同了)
- 确认之后,按说是银行将确认了的授权合同,一式三份,给我和论坛各一份。给我看合同并不重要,可以后台存下来,我随时可以登录后,在已授权的地方查看给过的授权信息。关键是怎么给论坛?
- 事实上论坛当初转到QQ授权页面的时候,除了提供自己的身份,还有一个redirectUrl。当我点了授权后,QQ把合同给了这个Url,等于就是给了论坛了。
- 论坛拿到了合同,再把自己的登录信息给QQ再验证一下,QQ就把我的资料给了论坛了。如果这里不再验证论坛的身份,论坛把合同卖给其它地方怎么办?那就不安全了!当然我也可能把合同转给其它地方用,来陷害是这个论坛在用。
三、标准的认证过程
OAuth认证和授权的过程如下:
1、用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。
2、第三方网站向服务商请求一个临时令牌。
3、服务商验证第三方网站的身份后,授予一个临时令牌。
4、第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。
5、用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。
6、授权成功后,服务商将用户导向第三方网站的返回地址。
7、第三方网站根据临时令牌从服务商那里获取访问令牌。
8、服务商根据令牌和用户的授权情况授予第三方网站访问令牌。
9、第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。
四、对比一下二与三
【2.第三方网站向服务商请求一个临时令牌】,也就是论坛自己也登录一下,比如被QQ认证一下。
【7.第三方网站根据临时令牌从服务商那里获取访问令牌。】,临时令牌只是论坛的身份,而访问令牌是临时令牌与授权码的组合。
有没有可能授权后,直接返回给网站【访问令牌】呢?
貌似也可以,这时候服务商页面把这个访问令牌发到网站的返回地址了,但用户是不是可以从浏览器里看到从QQ发给论坛的内容呢?如果用户再把这个POST内容给了其它地方,好像可以诬陷网站呢。
如同最初银行里,银行可以给朋友一个超级码,朋友以后可以不被验身份只凭这个码查询。但这个码是不能给我看到的。
浏览器做不到不给我看,这个访问令牌是不可以给用户看到的,给大家都看到的只是授权码。
有没有可能服务商后台悄悄把【访问令牌】给网站呢?那一开始就要传给服务商两个地址了,一个是悄悄给网站令牌的地址,一个是返回给用户显示的网站的地址了,更麻烦了。
上面的解释是不是更清楚呢?从生活中来思考软件上的实现,一方面不容易忘记整个过程,另一方面有助于自己设计开发一些复杂的场景。
五、引伸
1.回过头再看支付过程。
从生活中设想场景,与上面的OAuth2.0是非常的相似。比如生活中,我在商家购买东西,可以一起进银行,银行验证我的身份,验证商家身份。再由我签字认可划钱给商家就结束了。没有了最后一个步骤,比上面还简单一点。
在电商中,就是我和商家都是某平台的用户,在商家买好了,跳转到平台,商家要传订单信息与付款金额以及自己的认证信息过去。平台确认商家信息后,显示我的登录页面和授权转钱给商家的页面,我不同意就付款失败,我同意了就转账并跳转到商家的成功页面。当然商家会另外查询成功或者是失败的。
2.从生活场景理解KAFKA帮助记忆
2.1 KAFKA分布式的、可分区、可复制的消息系统。
基本术语:
- broker:一个kafka集群由一个或者多个broker组成;
- topic:Kafka中用来维护的一类消息;
- partition:每个topic包含多个分区,每一个分区都存在各个broker中,但是一个分区只选取一个broker作为主节点;
- producer:生产并发送消息到Kafka topic中;
- consumer:消息消费者;
- consumer group:每个consumer属于一个特定的consumergroup,对于一个topic中的消息只能被同一个group下的一个consumer消费。
2.2 上述过程可理解为:
一个主题topic比如是一个元帅,下面有10个信使(10个partition),每个人都传元帅的消息命令,每个信使都有一个小跟班(复制1份备用)。
每个信使传2个命令给5个部队的主要将军们(5个消费者群),但信使们要过3个独木桥,每个只能选一个桥过。信使与小跟班分过不同的桥(broker),以防止意外。
那么一个桥上有平均7个信使或者跟班。但同一个信使与跟班一定在不同的桥上,防止桥断了的情况下消息与备份都消失。桥宽窄不同,不同的信使通过速度不同。但同一个信使的人个消息有先后。
5个部队都要收够10个信使(桥断了就是对应的跟班)的信息,共20条信息。
5个部队的将军们分头在不同的桥头接着消息。来自同一个部队的将军们中只能有一个收同一个信使的消息,否则这个部队中两个将军收到同一个信使消息的话,对这个部队来说就有重复了(不知是部队记录消息重复,还是信使记录是否某个部队收过了?应该是后者,信使如果又碰到同一部队的将军就不给他消息了)。
5个部队各自都要收齐所有10信使的20个消息。每个信使都要确保手上的消息给了5个部队。
2.3上面要记录的一些信息,比如消费者群里的消费者,都记录在zookeeper这个分布式事务协调器中,树弄结构,动态的都对应临时节点。比如:
- Broker node 注册 ls /broker/ids/[0...N]-->broker的id,唯一不重复。
- Broker Topic 注册 ls /broker/topics/[topic]/partitions/[0...N]-->partition索引号
- Consumer id 注册 ls /consumers/[group_id]/ids/[consumer_id]-->consumer的id
- Consumer offset 跟踪 get /consumers/[group_id]/offsets/[topic]/[partition_id]-->offset值
- Partition Owner 注册 get /consumers/[group_id]/owners/[topic]/[partition_id]--->consumerId
可以看到partition只记录给consumergroup,单独的consumer去消费一下partition时,可以知道partition_id是不是已经消费了,以及消费到那个offset了。
分享到:
相关推荐
### OAuth2.0协议原理与实现 #### 一、OAuth2.0协议概述 OAuth2.0协议是一种广泛应用于第三方登录及授权的标准协议。相比于OAuth1.0版本,OAuth2.0进行了多方面的优化和改进,例如简化了授权流程、取消了Token的...
OAuth2.0是互联网上的一种授权协议,全称为“The OAuth 2.0 Authorization Framework”,由互联网工程任务组(IETF)标准化,在RFC 6749中进行了定义。该协议主要用来允许一个第三方应用,如应用程序(App)、网站或...
在本文中,我们将深入探讨 OAuth 2.0 的核心概念,并结合 Java 实现来理解其工作原理。 OAuth 2.0 主要分为四个角色:资源所有者(Resource Owner)、客户端(Client)、授权服务器(Authorization Server)和资源...
OAuth 2.0 协议中文译本共分为九大部分,分别介绍了 OAuth 2.0 协议的背景知识、术语中英对照表、OAuth 2.0 协议的中文译本、OAuth 2.0 协议的工作流程、OAuth 2.0 协议的安全机制、OAuth 2.0 协议的优点、OAuth 2.0...
**OAuth2.0协议概述** OAuth2.0是一种授权框架,允许第三方应用在用户许可的情况下,访问特定资源。它主要用于安全地实现用户数据的共享,比如社交媒体登录、云存储服务等。OAuth2.0的核心是将用户的授权过程与实际...
在本文中,我们将详细探讨微信OAuth2.0的原理、实现流程以及如何在实际项目中应用。 一、OAuth2.0概述 OAuth2.0是一个授权框架,允许第三方应用在用户许可的情况下访问其存储在特定服务提供商(如微信)上的资源。...
通过学习和实践这个项目,开发者不仅可以掌握OAuth2.0的原理,还能深入理解Django框架的使用,以及如何扩展其功能来满足特定需求。在"OAuth2.0_Django2.1.2-master"这个压缩包中,可能包含了项目的所有源代码和相关...
OAuth2.0是一种广泛使用的开放授权...理解并掌握OAuth2.0的核心原理和流程,对于开发安全、可扩展的Web应用至关重要。在这个小demo中,我们可以学习到如何在实际项目中应用OAuth2.0,提高应用程序的健壮性和安全性。
**OAuth2.0简介** OAuth2.0是一种授权框架,广泛应用于Web API的身份验证和授权。它允许第三方应用在用户授权的情况下,访问该用户的特定资源,而无需获取用户的用户名和密码。OAuth2.0的核心是将认证和授权分离,...
OAuth2.0是一种授权框架,广泛应用于Web应用和API接口的安全访问控制,允许第三方应用在用户许可的...通过这个项目,开发者可以学习到OAuth2.0的原理,以及如何在实际开发中应用这些概念,提高应用的用户体验和安全性。
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用...
在深入理解OAuth2.0原理的基础上,你可以对服务端和客户端代码进行定制,比如增强安全性、优化性能、增加额外的功能,如支持更多的授权模式或实现自定义的令牌策略。同时,参与社区交流和讨论,可以借鉴其他开发者的...
OAuth2.0是一种广泛使用的授权框架,用于在第三方应用与用户资源之间建立安全的数据共享机制。这个框架允许用户授权第三方应用访问他们存储在特定服务提供商(如Google或Facebook)上的数据,而无需分享他们的登录...
OAuth 2.0 是一个授权框架,用于安全地允许第三方应用访问用户存储在另一服务上的资源,而无需共享用户凭证。...通过这个项目,开发者可以深入理解OAuth 2.0的工作原理,并掌握如何在Java环境中安全地实现这一标准。
在使用这个工具之前,需要理解 JWT 和 OAuth 2.0 的基本原理,并按照库的文档或说明进行配置和调用。 总的来说,JWT 和 OAuth 2.0 是现代Web应用中身份验证和授权的关键技术。了解它们的工作原理和使用方法对于构建...
OAuth2.0是一种广泛应用于各种在线服务的授权框架,它允许第三方应用安全地访问用户的受保护资源,而无需用户直接共享他们的登录凭证。在Java环境中实现OAuth2.0,通常会依赖于一些特定的jar包。这些jar包包含了处理...
OAuth2.0的核心概念包括四个主要角色:资源所有者(Resource Owner)、客户端(Client)、授权服务器(Authorization Server)和资源服务器(Resource Server)。资源所有者是拥有数据的用户,客户端是需要访问这些...
课程讲义所提及的视频资源和文章可以作为学习OAuth 2.0的入门材料,帮助开发者从基础开始深入理解并运用OAuth 2.0授权框架。通过这些材料,开发者可以学习如何为应用程序实现授权流程,以及如何正确使用AccessToken...
通过分析和运行这个项目,你可以深入理解OAuth2.0的工作原理及其在Spring Boot中的实现。同时,也可以作为模板,为自己的项目添加OAuth2.0认证功能。在实际开发中,还可以考虑添加刷新令牌功能,以及更复杂的权限...