【OAuth2】二、OAuth2.1

前言

OAuth2.0现在越来越流行了,特别在微服务大行其道的情况下。不过OAuth2.0太老了, 最初的OAuth2.0规范于 2012 年 10 月以RFC 6749文档为蓝本发布,取代了 2010 年 4 月发布的 OAuth1.0,在发布OAuth2.0的时候,Vue、React还没有兴起,甚至连跨域资源共享CORS还不是正式的W3C标准。OAuth2.0面对如今飞速发展的移动互联网已经老态龙钟,跟不上时代了。好在OAuth2.0非常开放,开发者可以做很多自定义操作,它把很多“设计权限”下放给了开发者,经过开发者多年的实践,OAuth2.0存在的问题缺陷已经被修补了很多,甚至有些流程扩展让OAuth2.0更加健壮。

OAuth社区审时度势,起草了新的新的OAuth规范,被称作OAuth2.1,目前还处于草案阶段。在新的规范中将淘汰OAuth2.0的某些不安全的流程,补充OAuth2.0的不足。

OAuth2.1有什么变化

我想很多OAuth2开发者很想知道新的OAuth2.1都有什么变化,我这里列举了一些,当然受能力所限可能不太完整。

授权码+PKCE

我们都知道OAuth2.0的授权码模式是最安全的授权模式。但在非TLS链接发生时,该模式的部分授权流程可能被拦截导致“中间人攻击”。为了防止报文被修改,在授权码的基础上附加了一个PKCE流程RFC7636用于JavaScript单页应用,后面还出台了针对移动端的PKCE规范RFC8252。

隐式授权被移除

在单页应用中,隐式授权response_type=token会把令牌附着在URL中,前端应用会把令牌放在本次存储、会话存储、Cookie中,无论哪种方式都存在令牌泄露的风险。消除这种风险的技术成本高昂,因此我也不建议学习和使用这种方式。

密码模式被移除

密码模式起码在国内使用的非常多,每天都有大量的开发者咨询相关的细节。虽然这种模式好用,但它打破了委托授权的模式,降低了OAuth2的安全性。

它的流程非常像“网络钓鱼攻击”,想象一下应用程序随意的让你在一个平台的登录页面中输入另一个平台的密码,如果两个平台都是可信的,这样做也无可厚非,不过对于安全而言,这扩大了泄露的面积,这是一种反密码模式,用户密码可能有意无意就暴露出去了。而且用户无法控制授权的流程,虽然用户限制了scope,但是客户端程序依然提供了编程机会来打破用户的scope。如果在公共OAuth2客户端上使用密码模式,你的令牌端点也可能会被嗅探到,进而被暴力穷举。

密码模式诞生的时候,单页应用还没有兴起,它是一种为了解决遗留问题而采用的过渡方案。

对Refresh Token进行限制

**Refresh Token(刷新令牌)**允许客户端无需重新认证即可检索新的访问令牌。当访问资源的时间超过访问令牌的有效时间,访问的频率非常低的情况下这种机制很有帮助。Refresh Token通常比访问令牌寿命更长,因此它的安全更应该收到重视。

如果它们被攻击者获取,攻击者可以随意创建访问令牌,安全壁垒将形同虚设。 OAuth 2.1草案规范为Refresh Token提供了两个选项:它可以一次性使用,也可以对之进行加密以保证不在传输中暴露。

小结

虽然目前OAuth2.1还处于起草阶段,不过上面的变动基本已经确定,目的是让授权模型更加科学和安全。对于我们普通开发者而言,隐匿模式和密码模式可以放弃了,Spring Security已经弃用了相关的功能和后续的维护。对于单页应用尽量采用Authorization Code+PKCE模式;对于移动端也有针对性的PKCE方案;而对于IoT可以使用Device Code模式。

OAuth2.1OAuth2.0的一个扩展协议,它增加了一些额外的安全措施,例如公共客户端的验证和授权服务器的证书绑定。在iOS上实现OAuth2.1,您可以使用第三方库或自己编写代码来处理授权流程和令牌管理。 以下是使用第三方库实现OAuth2.1的步骤: 1. 添加OAuth2.1依赖库到您的项目中。常用的库有Auth0、Okta和AppAuth。这些库提供了OAuth2.1的实现,并且已经集成了大多数授权服务器的配置信息。 2. 配置应用程序和授权服务器。您需要在应用程序和授权服务器之间设置正确的重定向URI和客户端ID。这些信息将在授权流程中使用。 3. 实现授权流程。使用第三方库提供的方法来执行授权流程。通常,您需要向授权服务器发送请求以获取授权代码,并将授权代码交换为访问令牌。一些库提供了UI控件来处理授权流程,使它们更容易集成到您的应用程序中。 4. 存储和管理访问令牌。一旦您获得了访问令牌,您需要存储它并在需要时使用它来访问受保护的资源。您可以使用Keychain或其他安全存储机制来保存令牌。 5. 处理令牌过期和刷新。访问令牌有一个有效期,在过期之前,您需要使用刷新令牌来获取新的访问令牌。您可以使用库提供的方法来处理令牌过期和刷新。 使用第三方库可以简化OAuth2.1的实现,但您需要确保库与您的授权服务器兼容,并且符合您的安全要求。如果您需要更高的安全性和控制权,您可以编写自己的代码来处理OAuth2.1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值