什么是 OAuth2.0?

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。

OAuth2.0 主要解决的问题就是,如何让不信任的第三方应用方应用程序通过一个统一认证获得访问资源的token?请注意:严格区分认证(Authorization)和授权(Authentication),OAuth解决的是认证领域的问题,该问题在client得到access token之后结束,不关注后续资源服务器的鉴权过程。

阅读了理解OAuth 2.0 - 阮一峰的网络日志 (ruanyifeng.com)之后,我对里面的一些解释还存在疑问,本篇博客就是记录我的这些疑问的解释。疑问有:

  1. 在授权码模式下,授权码有什么存在的必要?换句话说,为什么认证服务器AS不能直接把token发回,而必须先发回code,然后再由客户端请求认证服务器得到token?
  2. 简化模式下,中间一连串获得脚本并运行的操作有何存在必要?

授权码存在的必要?

问题:在授权码模式下,授权码有什么存在的必要?换句话说,为什么认证服务器AS不能直接把token发回,而必须先发回code,然后再由客户端请求认证服务器得到token?

疑问的集中点:认证后就算直接发回access-token,也能重定向到第三方客户端的url,能够让第三方拿到token,就可以访问资源了。

解释:大量第三方网站并不是https的。重定向到第三方客户端的url如果没有被ssl加密,token就可能泄露。因为第三方客户端的后台请求认证服务器获得token除了code,大部分还需要secret,所以code就算泄露了,黑客也无法获得token。第三方客户端访问认证服务器时,因为认证服务器肯定提供有ssl加密,所以此过程发回的token不会泄露。因此,code授权码使得http的第三方也能够安全地完成认证。

参考:OAuth2 授权码模式为什么不直接返回access_token_Maxiao1204的博客-CSDN博客

简化模式?

问题:简化模式下,中间一连串获得脚本并运行的操作有何存在必要?

疑问:中间的脚本在做什么?简化模式为什么能够防止token泄露?

解释:其实中间脚本的下载等等是没有必要的,这里只是为了强调,这里的脚本是从第三方可信任处拿到的,读取token后不会泄露出去。token是以hash的方式从认证服务器发回的(hash表示的是url中#之后的内容,请求时不会将这部分内容发出,而是在浏览器完成一些操作时使用,例如定位锚点),因此重定向的过程中不会将hash传输出去,而是会保留在浏览器中,因此不用担心泄露的问题,只要保证拿到可以读取该token的脚本可信即可。