Oauth2的授权码模式为什么要用code获取token?而非回跳时直接返回token呢

为什么oauth2中的授权码模式 在获取token之前非要先到资源服务器获取一个code 然后才使用资源服务器的code去资源服务器去申请token?而不能在回跳时直接返回token呢?

首先,从产品交互上,我们需要浏览器跳转到“认证服务器”,让用户明确表态同不同意“第三方站点”的授权请求。这个时候,浏览器访问的地址已经到“认证服务器”去了,不跳转回来的话,网页不在“第三方站点”的控制中,怎么进行授权成功后的下一步交互呢?授权码模式的安全考量,是基于产品交互能完成的前提下,考虑如何不在浏览器这种暴露 url 的环境里做到安全的。如果你想表达的是“认证服务器”跳转回来,但是不带 code,而是通过 Server 对 Server 将 token 直接给“第三方服务器”。这样会造成一系列问题:

  1. Http 协议是无状态的,“第三方服务器”无法从一个 Server 对 Server 的请求轻易区分这个 token 对着自己当前哪个 Session。
  2. 如果依赖第一步里,“第三方服务器”跳转到“认证服务器”时传递的 GET 参数来作为 Session 身份区分,又涉及到跳转本身就是明文,可能被篡改的问题,需要协定复杂的签名协议来保证安全,这和 OAuth2 希望设计简洁验证模式的初衷违背。
  3. 假设安全问题解决了,已跳转回来的“第三方服务器”网页需要等待一个不知道何时才会过来的“认证服务器” Server 回调,才能告诉用户到底授权成功没有。远不如同步主动去请求“认证服务器”获取方便。

你可能感兴趣的:(实现原理,应用设计,oauth)