OAuth是一个用于授权(authorization)的开放网络标准,在全世界得到广泛应用,最新版本是2.0。 Facebook, Google, 鹅厂等都有基于OAuth的开放授权平台。它是为了解决什么问题而产生的呢?下面来举个栗子:
我们有一个文件服务系统,用户登录之后可以上传自己的文件。现在有一个打印应用提供一个在线打印文件的服务。但是每个用户只能打印自己的文件,只有符合隐私级别的文件才能被打印。那么打印服务和文件服务之间是怎么沟通,获取到用户可以打印的文件呢?过去,文件服务系统会将用户数据共享给打印服务,这会带来一系列问题,同时带了管理用户身份信息的复杂度。OAuth标准可以在不共享身份信息的情况下,给在线打印服务进行授权,获取可以打印的文件。
OAuth2.0专用名词
resource owner - 资源拥有者,上面例子中上传照片的人
resource server - 根据access token返回申请资源
client - 申请使用资源的第三方系统
authorization server - 颁发access token的服务, 可以与resource server部署在一起
OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。
OAuth 2.0的运行流程
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
四种授权模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式:
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)
不同的认证方式,决定了客户端与服务提供商之间的交互方式,具体的流程细节请参考RFC 6749,不同的厂商针对业务需求实现的也不尽相同,自己搭建OAuth认证授权中心可以参考Spring Security的OAuth2.0实现。