草庐IT

OAuth 授权协议 | 都云原生时代了,我们应该多懂一点OAuth ?

PivotalCloud 2023-03-28 原文

We are not here because we are free .we are here because we are not free.

我们在这里不是因为我们自由,我们在这里是因为我们不自由。——《黑客帝国》

写在开头

在这个互联网最美好的时代,随着业务产品线的增多,业务应用平台逐渐增多后,每个系统单独管理各自的用户数据容易形成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进。当业务产品线发展到一定规模,构建统一的标准化账户管理体系将是必不可少的,构建一套互联网云平台的重要基础设施,能够为平台带来统一的帐号管理、身份认证、用户授权等基础能力,为企业带来诸如跨系统单点登录、第三方授权登录等基础能力,为构建开放平台和业务生态提供了必要条件和基本准绳。
关于OAuth授权协议的问题,也许我们中的大多数都还是从玩Github 开始的,或者就是从阮一峰的网络日志看到的,不论是何种情况下接触到OAuth的。我们都要相信,OAuth的正确打开方式,绝对不是三言两语的事情,需要经过系统的分析和项目实战,才会有不一样的味道,不然我们遇到的都是坏味道。

OAuth授权协议

An open protocol to allow secure API authorization in a simple and standard method from web, mobile and desktop applications.

基本定义

OAuth授权协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。OAuth是Open Authorization的简写。

一般来说,OAuth是一个授权协议,它允许软件应用代表(而不是充当)资源拥有者去访问资源拥有者的资源。应用向资源拥有者请求授权,然后取得令牌(token),并用它来访问资源,并且资源拥有者不用向应用提供用户名和密码等敏感数据。目前常用的是2.0版本,又称为OAuth 2.0 。从官网来看,新版本2.1不久面世。

其实挑点实际话讲,OAuth 2.0 并不是一门新的技术,从 2007 年 OAuth 1.0 面世,到 2011 年发布 OAuth 2.0 草案。但是,看似简单的 OAuth 2.0 会让我们望而却步,在如何使用授权码流程上踌躇不前。比如,在 Web 应用中到底应该怎么使用授权码流程,移动 App 中还能使用授权码流程吗?
当我带着这些问题尝试到网上搜索资料时,那些不成体系的资料着实也让我走了不少弯路。不知道你是不是也被下面问题困扰着:

  1. 开发一个 Web 应用,当使用 OAuth 2.0 的时候,担心授权码被拦截,却因为没有较好的解决方法而一筹莫展
  2. 开发一款移动 App,当使用 OAuth 2.0 的时候,在确定是否需要 Server 端上,花费了大把的时间
  3. 开发一个小程序,当使用 OAuth 2.0 的时候,在确定是否需要 Server 端上,需要考虑的场景是否足够多
  4. 开发一个面向多产品的统一授权认证平台时,比如open-iam,对于PC平台,后台平台,门户平台,移动端APP平台,小程序平以及大数据监控平台,这样的一个需求时,当使用 OAuth 2.0 的时候,是否能实现和满足需求
  5. 开发一个统一授权认证平台,对于用户和资源之间如何界定设置,前后端分离模式,又如何保证用户登录实现平台的跳转和通信
  6. 在不同架构模式背景下,对于OAuth的使用,其中的技术选型又会有怎样的差异,更多情况下,我们的技术选型是否可取

从大方向上总结来看,OAuth 2.0 这种授权协议,就是保证第三方(软件)只有在获得授权之后,才可以进一步访问授权者的数据。因此,我们常常还会听到一种说法,OAuth 2.0 是一种安全协议。现在访问授权者的数据主要是通过 Web API,所以凡是要保护这种对外的 API 时,都需要这样授权的方式。而 OAuth 2.0 的这种颁发访问令牌的机制,是再合适不过的方法了。同时,这样的 Web API 还在持续增加,所以 OAuth 2.0 是目前 Web 上重要的安全手段之一。

基本规范

OAuth 2.0 的标准是 RFC 6749 文件。OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。也就是说,OAuth 的核心就是向第三方应用颁发令牌。

按照一般软件系统开发定义开看,一个 OAuth 标准应用规范都有如下几个定义规范,或者说基本角色:

  • Third-party /Client application:第三方应用端程序,一般系统平台都称“客户端”(client)。代表资源拥有者访问受保护资源的软件,它使用OAuth 来获取访问权限。
  • HTTP service:HTTP服务提供商,一般系统平台都简称“服务提供商”。
  • Resource Owner:资源所有者,一般系统平台都称“用户”(user),即登录用户。是有权将访问权限授权给客户端的主体,在大多数情况下,资源拥有者是一个人,他使用客户端软件访问受他控制的资源;
  • User Agent:用户代理,一般系统平台就是指浏览器。
  • Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。一个HTTP 服务器,它在OAuth 系统中充当中央组件。授权服务器对资源拥有者和客户端进行身份认证,让资源拥有者向客户端授权、为客户端颁发令牌。某些授权服务器还会提供额外的功能,例如令牌内省、记忆授权决策
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。资源服务器能够通过HTTP 服务器进行访问,在访问时需要OAuth 访问令牌。受保护资源需要验证收到的令牌,并决定是否响应以及如何响应请求。

这里必须强调一点的是,这里说的第三方,大多数指的是区别于当前应用系统的其他应用,包括不限于微信,QQ,新浪,抖音,今日头条等等。按照正常的系统的应用来说,在所用系统之前,都会有一个类似于open-iam身份识别与访问管理的系统的,至少来讲都会有这么一个系统组件的。这样来说,这个IAM应用平台在多产品业务线,甚至说是多租户场景模式来说,这是一个系统底层架构的核心元组件,所有其他的业务应用系统,都是围绕这个组件来进行整合和糅合其他的业务需求的,如图所示:

其实不论在单体架构时代,还是分布式(RPC)服务时代,以及眼花缭乱微服务时代,还是现在都在追捧的云原生架构时代,授权和认证应用模块在日常开发里,基本上是一个框架的底层组件来构建和关联第三方软件以及其他应用的。互联网中所有的受保护资源,几乎都是以 Web API 的形式来提供访问的。每次都是用访问令牌而不是用户名和密码来请求用户的数据,才大大减少了安全风险上的“攻击面”,至少从系统架构层面来说,引入 OAuth 主要还是为项目架构底层保驾护航。

基本流程

在一个日常应用系统里,对于Oauth应用的系统流转流程如下:

但是实际上,对于OAuth2 的工作原理我们通过结构化思维的拆解分析可以发现,Oauth应用的最终目的,是要获取一个叫做“访问令牌”的东西。在业务系统获取到访问令牌之后,才有足够的 “能力” 去请求系统拿到系统给我授权的资源列表数据。不论是任何终端应用,访问我们提供的统一授权服务,几乎都需要依托Oauth来经历和经过如下流程:

其中,OAuth 授权的核心就是颁发访问令牌、使用访问令牌。比如,业务应用系统访问统一鉴权管控平台,其间统一鉴权管控平台会依据业务应用系统的需要(请求参数),为其生成授权码,业务应用系统拿到授权码表示得到了授权,再次访问统一鉴权管控平台,后续验证完毕生成访问令牌,返回业务应用系统,最后业务应用系统拿到访问令牌,去查询对应的授权资源列表和数据,这就是使用访问令牌。其中主要的动作,就是生成授权码–> 生成访问令牌–> 使用访问令牌。其中授权码许可(Authorization Code)类型。它是 OAuth 2.0 中最经典、最完备、最安全、应用最广泛的许可类型。除了授权码许可类型外,OAuth 2.0 针对不同的使用场景,还有 3 种基础的许可类型,分别是隐式许可(Implicit)、客户端凭据许可(Client Credentials)、资源拥有者凭据许可(Resource Owner Password Credentials)。

总结来说,OAuth 授权有 3 个关键点:

  1. OAuth 2.0 的核心是授权许可,更进一步说就是令牌机制。对于业务应用系统来说,只有拿到颁发的访问令牌,也就是得到了授权许可,然后才可以代表用户访问他们的数据。
  2. 互联网中所有的受保护资源,几乎都是以 Web API 的形式来提供访问的。我们说 OAuth 2.0 与安全相关,是用来保护 Web API 的。另外,第三方软件通过 OAuth 2.0 取得访问权限之后,用户便把这些权限委托给了第三方软件,我们说 OAuth 2.0 是一种委托协议,也没问题。
  3. 业务应用系统对于统一鉴权管控平台算是客户端,统一鉴权管控平台是服务端,而且是独立部署服务的,每次都是用访问令牌而不是用户名和密码来请求用户的数据,才大大减少了安全风险上的“攻击面”。

版权声明:本文为博主原创文章,遵循相关版权协议,如若转载或者分享请附上原文出处链接和链接来源。

有关OAuth 授权协议 | 都云原生时代了,我们应该多懂一点OAuth ?的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  5. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  6. ruby-on-rails - 我现在(2010 年 1 月)应该使用哪个版本的 Ruby? - 2

    我有1.8.6附带的VanillaMacOSXLeopard。我是RoR的新手,所以会学习网上的教程。在使用更高版本的Ruby时,我是否可能会发现遵循它们的问题?我目前正在查看提到1.8.6和1.8.7的这个-http://www.railstutorial.org/book 最佳答案 RoR教程对两者都适用,但如果您正在学习Ruby,则应该学习1.9。Rails3将不支持1.8.6,所以我会选择1.8.7或1.9。我还推荐使用RVM在Ruby版本之间切换。 关于ruby-on-rail

  7. ruby-on-rails - Rails 两条腿的 OAuth 提供商? - 2

    我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案

  8. ruby-on-rails - Rails 中的类实例变量应该在互斥体中设置吗? - 2

    假设我的Rails项目中有一个设置实例变量的Ruby类。classSomethingdefself.objects@objects||=begin#somelogicthatbuildsanarray,whichisultimatelystoredin@objectsendendend是否可以多次设置@objects?是否有可能在一个请求期间,在上面的begin/end之间执行代码时,可以在第二个请求期间调用此方法?我想这实际上归结为Rails服务器实例如何fork的问题。我应该改用Mutex还是线程同步?例如:classSomethingdefself.objectsreturn@o

  9. ruby-on-rails - 访问授权和访问 token 之间的区别 - 2

    Doorkeeper中Token和Grant的区别我搞不清楚。Doorkeeper在哪个时刻创建访问授权,何时创建访问token?文档似乎对此什么也没说,现在我正在阅读代码,但不是十几行。 最佳答案 我还建议阅读documentationofoauth2据我了解,Doorkeeper也是基于该文档中描述的协议(protocol)。在doorkeeper中,你会先获得accessgrant,然后是accesstoken。访问授权通常只存在很短的时间(doorkeeper中的默认值为10分钟)。您将通过向api-url/oauth/au

  10. ruby - 构建网络蜘蛛时,应该使用递归吗? - 2

    构建一个深度优先的网络蜘蛛,这意味着它将访问第一页上的所有链接,然后转到每个链接,并访问所有第二页上的链接...你应该使用递归吗?我发现这是CPU密集型的。defrecursion()linkz_on_first_page.eachdo|link|recursion(link)endendrecursion(firstpage) 最佳答案 绝对不是,由于万维网的实际性质,您很快就会遇到问题。当您访问带有主导航部分的网站时,每个页面都链接到其他页面,您就进入了一个无限循环。您可以跟踪您处理了哪些链接,但即便如此,递归循环并不真正适合万

随机推荐