Oauth2
OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的规范标准。与以往的授权方式不同之处是
OAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就
可以申请获得该用户资源的授权,因此 OAuth 是开放的安全的。
业界提供了 OAuth 的多种实现,如 Java、PHP、Ruby 等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的。很多大公司如 阿里、腾讯、 Google,Yahoo,Microsoft等都提供了 OAuth 认证服务,这些都足以说明 OAuth 标准逐渐成为开放资源授权的标准。
OAuth 协议1.0版本过于复杂,目前发展到2.0版本,2.0版本已得到广泛应用。
说白了:OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
oauth2服务组成
第三方应用(Third-party application): 非受信任的系统 ,可以参考微信登录,qq登录 ,csdn想通过微信用户登录 csdn就属于第三方应用 (在前后端分离项目 前端项目也属于第三方应用)
认证服务器(Authorization server): 专门用来对资源所有者的身份进行认证、对要访问的资源进行授权、产生令牌的服务器。想访问资源,需要通过认证服务器由资源所有者授权后才可访问。
资源服务器(Resource server): 微服务系统的业务服务,如用户服务,文件服务,第三方服务想从资源服务器中获取数据。
资源所有者:不是服务组成的部门 为下文概念 就是操作用户本人。
注意:认证服务器 和资源服务器 虽然是两个解决,但其实他们可以是同一台服务器、同一个应用。
服务提供商(Service Provider): 如 QQ、微信等 (包含认证和资源服务器)。
四种模式
比较常用为前两种方式 后两种了解即可
一.授权码模式
功能最完整,流程最严密的授权模式。国内各大服务提供商(微信、QQ、微博、淘宝 、百度)都采用此模式进行授权。可以确定是用户真正同意授权;而且令牌是认证服务器发放给第三方应用的服务器,而不是浏览器上。这种方式跳转的登录页面为被接入系统的页面 所以接入并不会获取到登陆者的账号密码 参考 csdn的微信登录
1.流程
clinet:第三方
authorization server :认证授权服务器
user agent:用户
resource owner:资源拥有者 可以理解为账户所有人. 可以理解为使用者本人 但和使用者不是同一角色
它的步骤如下:
(A)用户(user agent)访问客户端(clinet),后者将前者导向认证服务器。
(B)用户(resource owner)选择是否给予客户端授权。
(C)假设用户(resource owner)给予授权,认证服务器(authorization server)将用户导向客户端(clinet)事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端(clinet)收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端(clinet)发送访问令牌(access token)和更新令牌(refresh token)。
二.密码模式
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。大多数当第三方是高度受信任系统 如:本公司的系统接入本公司的系统
1.流程
它的步骤如下:(各角色请参考上文)
他的步骤如下:
( A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C)认证服务器确认无误后,向客户端提供访问令牌。
三.简化模式(隐藏式)
简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。(适用于没有后台的网站)
1.流程
他的步骤:
(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F)浏览器执行上一步获得的脚本,提取出令牌。
(G)浏览器将令牌发给客户端。
四.客户端模式(凭证式)
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题
1.流程
他的步骤:
(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B)认证服务器确认无误后,向客户端提供访问令牌。