【OAuth2】理解OAuth 2.0

什么是 OAuth2.0

OAuth (Open standard for Authorization) 是一套开放协议,这个协议给安全授权制定了简单的标准

这里所说的授权,指的是一个服务把用户的数据,授权给第三方应用。
比如登录开源中国时,使用码云(Gitee)账号登录,就是码云把你的数据授权给了开源中国。

为什么需要 OAuth2.0

举一个假设的例子:
有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。

问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢?
传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。

  1. "云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
  2. Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
  3. "云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
  4. 用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
  5. 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

可见,在第三方应用需要访问用户的数据时,用户如果直接提供用户名和密码会有很多问题。根据以往经验,使用access token(访问令牌)来代替用户名和密码是最好的,这也就是常说的“最佳实践”。

那么access token从哪来呢?
OAuth2.0就是解决了access token从哪来的问题,它为access token的获取提供了标准。

令牌与密码

令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有三点差异。

(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。
(2)令牌可以被数据所有者撤销,会立即失效。以上例而言,屋主可以随时取消快递员的令牌。密码一般不允许被他人撤销。
(3)令牌有权限范围(scope),比如只能进小区的二号门。对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限。

上面这些设计,保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全。这就是 OAuth 2.0 的优点。

注意,只要知道了令牌,就能进入系统。系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的。 这也是为什么令牌的有效期,一般都设置得很短的原因。

OAuth 2.0 对于如何颁发令牌的细节,规定得非常详细。具体来说,一共分成四种授权类型(authorization grant),即四种颁发令牌的方式,适用于不同的互联网场景。

Access Token 的作用

如果还是不清楚access token是干嘛用的,可以看下,否则可以略过

  1. 用户有自己的数据
  2. 有一个服务器,负责管理用户的数据。这个服务器被称为”Resource Server(资源服务器)“
  3. 有一个客户端应用,想要使用用户的数据
  4. 资源服务器需要准备一个 API 接口,用来传递用户的数据
  5. 客户端应用请求 API 接口,想要用户的数据
  6. 资源服务器返回用户数据
  7. 如果某个客户端应用心术不正怎么办?
  8. 坏客户端应用也请求资源服务器 API
  9. 资源服务器也可以正常返回用户数据
  10. 结果就是坏客户端拿到了用户数据
  11. 我们需要一个机制来保护用户的数据
  12. 根据最佳实践,让客户端应用使用 “Access Token(访问令牌)” 比较好。客户端有了 Token 就说明它有了访问用户数据的权限
  13. 客户端应用请求 API 时出示自己的 Token 令牌
  14. 资源服务器从请求中提取 Token
  15. 资源服务器验证 Token 令牌
  16. 确认之后,资源服务器返回用户数据
  17. 这个机制的前提是客户端得提前拿到 Token 令牌
  18. 我们需要有人负责颁发 Token 令牌
  19. 谁来颁发 Token 令牌 …
  20. 颁发 Token 的角色被称为 ”Authorization Server(授权服务器)“
  21. 客户端应用需要与授权服务器打交道了
  22. 授权服务器生成 Token 令牌
  23. 然后把 Token 颁发给客户端
  24. 先暂停,回顾一下,现在有3个角色了 ”授权服务器“、”客户端应用“、”资源服务器“
  25. 授权服务器生成 Token
  26. 然后颁发给客户端
  27. 客户端使用 Token 请求资源服务器的 API 接口
  28. 资源服务器从请求中提取 Token
  29. 验证 Token
  30. Token 没问题就返回用户数据
  31. 上面的流程中,第一步是授权服务器生成 Token,而实际流程中,生成 Token 之前是需要询问 User 用户的
  32. 首先,客户端请求授权服务器,申请一个 Token
  33. 授权服务器询问用户,是否给这个客户端权限
  34. 如果用户同意 …
  35. 那么授权服务器就生成一个 Token
  36. 然后颁发给客户端
  37. 重点就是这个黄色区域
  38. 这块儿是请求 Token、拿到 Token 的过程
  39. 这个过程就是 OAuth2 框架所关注的,为其做了标准化定义

参考
理解OAuth 2.0
OAuth 2.0 的一个简单解释
OAuth2 图解

# OAuth2 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×