最近在做对用户的认证及REST API的访问权限控制,需要用OAuth来实现第三方应用对我们API的访问控制。OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。OAuth在全世界得到广泛应用,目前版本是2.0版。本文对OAuth 2.0的应用场景、设计思路和运行流程做一个简明通俗的解释。
应用场景
上图是一个典型的应用场景,一个游戏应用希望读取用户Facebook账号的用户名和头像作为该用户在游戏中的角色信息,用户为了避免自己重新输入用户名并上传头像,必须让游戏应用读取自己Facebook账号的一些信息。但是只有得到用户授权,Facebook才会同意让游戏应用读取这些信息。如何让游戏应用获得用户授权呢?传统方法是用户把自己的Facebook账号用户名和密码告诉游戏应用,然后由游戏服务器代表用户登陆Facebook服务器获取用户的信息,但是这种方法存在一些严重的安全问题:
- 游戏应用为了后续的服务,会保存用户的密码,这样很不安全。
- Facebook需要部署直接密码登录,而单纯的密码登录并不安全。
- 游戏应用拥有获取用户储存在Facebook所有资料的权力,用户无法限制游戏应用获得授权的范围和有效期。
- 用户只有修改密码,才能收回赋予游戏应用的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
- 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。
如何保证第三方应用能够安全可控的访问用户资源,这就是Oauth要解决的问题。
OAuth的思路
OAuth在第三方应用与服务提供商之间设置了一个授权层。第三方应用不能直接登录服务提供商,只能登录授权层,以此将用户与客户端区分开来。第三方应用登录授权层所用的令牌,与用户的密码不同。用户可以在登录授权的时候,指定授权层令牌的权限范围和有效期。
第三方应用登录授权层以后,服务提供商根据令牌的权限范围和有效期,向第三方应用开放用户资源。
协议流程
OAuth 2.0的运行流程如下图:
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(