OAuth简单来说就是一种授权标准,目前版本为2.0,但是不向后兼容。
简述
直观例子
举个例子,我们现在需要优化登录流程,支持qq用户授权登录。为了实现这个功能,一般有这么几步:
登录页面提示用户可以使用第三方qq登录
点击qq登录,跳转到qq登录页面输入用户名密码,用户点击授权
跳转回到我们自己的网站,后端创建新用户,并同步用户qq信息(头像、用户名等)
用户使用这个新用户进行登录,并返回登录已成功,用户继续浏览页面
而这里面涉及到的授权协议,就可以使用OAuth2.0来实现。
重要名词
用我们的例子来说明:
第三方应用(Third-party application):又称客户端,我们的应用
服务提供商(HTTP service):qq
资源拥有者(Resource Owner):用户
用户代理(User Agent):浏览器
认证服务器(Authorization server):qq提供专门用于认证的服务器
资源服务器(Resource server):qq存放用户信息的服务器
OAuth2.0规定在第三方应用和服务提供商之间,需要有一个授权层。第三方应用只能登录授权层,获取令牌(token),令牌有权限和有效期。服务提供商根据令牌的权限和有效期,向第三方应该提供相应的资源。
OAuth2.0定义了四种授权方式:授权码模式、简化模式、密码模式以及客户端模式。我们主要介绍授权码模式,因为这是功能最完整、流程最严密的授权模式,使用也最广泛。
认证流程
以我们的例子来说明OAuth2.0授权码模式的流程:
主要分为以下几步:
用户访问客户端,客户端将用户导向认证服务器,并附上一个重定向客户端uri
用户在认证服务器中允许授权该客户端,认证服务器将用户导向重定向客户端uri,并附上授权码(code)
客户端收到授权码,并附上早先的重定向uri,在服务端向认证服务器申请令牌(token)
认证服务器核对重定向uri以及授权码,向客户端发放令牌
客户端使用令牌请求相应的资源
这几步中,可能还需要一些额外的参数,比如客户端id、客户端状态、权限范围等,这些跟具体的实现有关,就不再详细说明了。