于2021年3月15日更新的OAuth2.1文档,相较于OAuth2.0有哪些区别呢?在此整理一下。
翻译:
PKCE出版于2015年,扩展了授权代码授予模式,保护认证流程的一部分发生在非TLS连接的攻击。例如,如果有一个本地应用程序的组件之间有通信就会发生这种情况。
PKCE需要一个额外的一次性代码生成和发送到OAuth服务器。这段代码验证请求没有被拦截或修改。
OAuth 2.1草案规范要求PKCE被用于每个授权码模式,防止授权代码被攻击者获取和被用来获得一个令牌。
我们或多或少的会配置一个或者多个重定向地址,这使得我么当启动一个新的服务时就需要去添加重定向地址。
例如,如果一个CI系统构建为每个特性分支一个应用程序,它可能的主机名dans-sample-application-1551.herokuapp.com
,假设包含一个特性分支修复问题#1551。如果我想使用授权码模式,我需要更新我的OAuth服务器URI设置重定向地址使其包括URI: https://dans-sample-application-1551.herokuapp.com/oauth-callback.
与此同时,另一个问题#1552 问题来了,那同样的,我们需要添加一个重定向地址https://dans-sample-application-1552.herokuapp.com/oauth-callback
。很明显,这并不方便,所以就需要一个这样的重定向地址:https://dans-sample-application-*.herokuapp.com/oauth-callback.
然而,允许通配符匹配重定向的URI是一个安全风险。如果重定向的URI匹配的是灵活的,攻击者可以向服务器发送用户开放的重定向控制它们,然后在一个恶意的目的地。
所以使用精确匹配定向URI可以消除这种风险,因为重定向URI总是一个已知值。
ps: 我特么看到一半还以为在夸模糊匹配多么好,看到最后才发现是在先扬后抑啊0.0
隐式授予方式在使用单页面应用时是不安全的,就等于你把access_token
暴露出来了,你的access_token
不是一次性使用的,它存在有效时间,在这有效时间内,你泄露了你的access_token
,攻击者可以对你的程序发起千万亿次请求!
为什么不安全,请看:官方说明
这种模式时OAuth2.0为了简化迁移OAuth兼容的服务的。虽然其可以使我们更好的迁移应用,但是这并不符合标准。毕竟,应用服务器完全访问用户的凭据,OAuth还旨在避免什么呢。
如果你有一个移动应用程序使用这个格兰特,你可以更新客户端使用一个授权代码模式并继续使用PKCE 或 继续使用OAuth 2.0来兼容你的系统。
Bearer token ,也被称为访问令牌,允许访问受保护的资源,因此必须是安全的。他们被称为不记名的令牌,因为仅仅拥有让你访问。他们就像一套房子的钥匙。当今时代,大多数jwt令牌。客户安全地存储它们,然后用它们来让应用程序服务器API调用。然后应用程序服务器使用令牌,以确保客户端调用API提供了适当的权限。
当第一次在RFC 6750中定义,令牌被允许在hearers,post的body里或查询字符串里。OAuth 2.1草案禁止发送在查询字符串Bearer token。
任何字符串URL,从来都不是私密的。页面上的JavaScript执行可以访问它。一个URL或组件可能会记录在服务器日志文件,浏览器缓存,或者浏览器历史中。
一般来说,如果你想安全的通过互联网传递信息,那就不能再URL中放任何东西。相反,使用TLS,把敏感信息在Body或HTTP头更好。
如果你需要访问资源超过一个access_token的生存时间,或如果你需要频繁访问,refresh_token可以帮助你。因此,你应该确保使用刷新令牌时要多加注意。禁止不同设备之间分享你的刷新令牌!
如果被攻击者获取,他们就可以随意创建access_token。你必须安全的使用你的刷新token。如何安全使用:参见:文章1,文章2
因此:OAuth 2.1草案为刷新令牌提供了两个选择:他们可以一次性使用或与发送方加密绑定。
参见: