简介
OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的规范标准。与以往的授权方式不同之处是OAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth 是开放的安全的。
业界提供了 OAuth 的多种实现,如 Java、PHP、Ruby 等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的。很多大公司如阿里、腾讯、 Google,Yahoo,Microsoft等都提供了 OAuth 认证服务,这些都足以说明 OAuth 标准逐渐成为开放资源授权的标准。
OAuth 协议1.0版本过于复杂,目前发展到2.0版本,2.0版本已得到广泛应用
OAuth2涉及的角色
- 资源所有者(Resource Owner):通常为 "用户"(user),如昵称、头像等这些资源的拥有者(用户只是将这些资源放到了服务提供商的资源服务器中)。
- 第三方应用(Third-party application):又称为客户端(Client),比如百度官网想要使用微信的资源(昵称、头像等)百度官网对于QQ、微信等系统来说是第三者,我们称百度官网为第三方应用。
- 认证服务器(Authorization server):专门用来对资源所有者的身份进行认证、对要访问的资源进行授权、产生令牌的服务器。想访问资源,需要通过认证服务器由资源所有者授权后才可访问。
- 资源服务器(Resource server):存储用户的资源(昵称、头像等)、验证令牌有效性。比如: 微信的资源服务器存储了微信的用户信息,淘宝的资源服务器存储了淘宝的用户信息等。注意:认证服务器和资源服务器虽然是两个解决,但其实他们可以是同一台服务器、同一个应用。
- 服务提供商(Service Provider):如 QQ、微信等(包含认证和资源服务器)。
OAuth2协议的授权模式
授权方式
-
授权码模式(Authorization Code):功能最完整,流程最严密的授权模式。国内各大服务提供商(微信、QQ、微博、淘宝、百度)都采用此模式进行授权。可以确定是用户真正同意授权;而且令牌是认证服务器发放给第三方应用的服务器,而不是浏览器上。
-
简化模式(Implicit):令牌是发放给浏览器的,oauth客户端运行在浏览器中,通过JS脚本去申请令牌。而不是发放给第三方应用的服务器。
-
密码模式(Resource Owner Password Credentials):将用户名和密码传过去,直接获取 access_token 。用户同意授权动作是在第三方应用上完成,而不是在认证服务器上。第三方应用申请令牌时,直接带着用户名密码去向认证服务器申请令牌。这种方式认证服务器无法断定用户是否真的授权了,用户名密码可能是第三方应用盗取来的。
-
客户端证书模式(Client credentials):用得少。当一个第三应用自己本身需要获取资源(而不是以用户的名义),而不是获取用户的资源时,客户端模式十分有用。
授权码模式流程(较为复杂)
OAuth在"第三方应用" 与 "服务提供商" 之间,设置了一个授权层(authorization layer)。"第三方应用" 不能直接登录 "服务提供商",只能通过授权层将 "第三方应用" 与用户区分开来。"第三方应用" 通过授权层获取令牌(token), 获取令牌后拿令牌去访问服务提供商。令牌和用户的密码不同,可以指定授权层令牌的权限范围和有效期,"服务提供商" 根据令牌的权限范围和有效期,向 "第三方应用" 开放用户对应的资源。