OAuth协议简介

  1、OAuth协议是什么

  关于OAuth,不在长篇大论的讲了,以一个例子说明。

  微信上存着用户的自拍数据,假如我们开发一个应用,读取并美化微信上用户的自拍数据。微信肯定不会允许我们读微信的用户信息,这时候我们就需要微信用户的授权,用户同意我们读微信上的自拍数据信息,用户就告诉微信,同意应用读取信息,微信就把自拍数据开放给应用了。

  如何得到用户的授权呢?传统思想是跟用户要账号、密码。这就存在问题了,首先用户不愿意给,再者即使给了也存在很多问题:

  1)应用可以访问用户在微信上的任何数据,无法控制权限。

  2)用户只有修改密码,才能收回授权。

  3)密码泄露的可能性大大提高。

  这个场景可以使用OAuth来实现,使用OAuth不需要用户告诉第三方应用用户名、密码,而是交给第三方应用一个令牌(Token),当第三方应用访问用户数据的时候带着令牌。令牌可以指定只能访问哪些数据,也可以指定有效期。

  2、OAuth协议中的角色

  OAuth协议中总的来说涉及到3个角色:服务提供商、资源所有者、第三方应用。

  服务提供商(Provider):逻辑上分为认证服务器和资源服务器,其实可以写在一个应用上。

  认证服务器 (Authorization Server):认证用户的身份、产生令牌。

  资源服务器(Resource Server):保存用户的资源、验证令牌。

  资源所有者(Resource Owner):拥有资源的人,比如微信用户,QQ用户等,拥有自己的照片、文件等资源。

  第三方应用(Client):我们自己开发的应用 ,访问用户在微信、QQ上的数据,提供功能。

  3、OAuth协议的流程

  

  1)用户访问第三方应用,第三方应用请求资源所有者授权 (用户就是资源所有者)。

  2)资源所有者同意授权。

  3)第三方应用访问认证服务器申请令牌。

  4)认证服务器验证用户确实授权了,就发放令牌给第三方应用。

  5)第三方应用拿到了令牌,带着令牌访问资源服务器申请获取资源。

  6)资源服务器验证令牌无误后,把资源开放给第三方应用。

  4、OAuth协议中4种授权模式

  从上面流程的第二步可以看到 ,第三方应用需要资源所有者授权。OAuth协议中4种授权模式:

  1)授权码模式(authorization code)

  2)简化模式(implicit)使用少

  3)密码模式(resource owner password credentials)

  4)客户端模式(client credentials)使用少

  这4种模式中简化模式和客户端模式使用很少。授权码模式功能最完整,逻辑最严密,绝大多数服务提供商是采用该模式。

  5、授权码模式流程

  

  过程:用户访问第三方应用,第三方应用将用户导向认证服务器授权,授权后,认证服务器返回授权码,第三方应用携带授权码去申请令牌。

  1)第三方应用需要用户授权,会将用户导向认证服务器

  2)用户同意授权(用户授权的动作在认证服务器上完成)。

  3)认证服务器会将用户重新导回到第三方应用上去,同时返回一个授权码,导到哪个地址上是第三方应用和认证服务器提前商量好的。

  4)第三方应用在收到授权码以后携带授权码去认证服务器申请令牌(发出申请动作在第三方应用上完成的,用户不可见)。

  5)认证服务器核对第三方应用携带的授权码是不是第三步发的,如果是则向第三方应用发放令牌

  授权码模式的特点:

  1)用户同意的动作是在认证服务器上完成的,其他3种模式是在第三方应用上完成的。

  2)用户同意授权,返回第三方时携带的不是令牌,而是授权码,第三方拿着授权码再去换取令牌。

  授权码模式的好处:

  用户授权时在认证服务器保存授权码,第三方应用请求令牌时携带该授权码进行对比,更加安全。如果用户同意的动作在第三方应用上完成,然后第三方应用拿着用户同意的凭证信息去认证服务器申请令牌的话,不够安全,因为第三方应用可以伪造凭证信息。认证服务器无法确定用户是否真正的授权了。

  更多了解请到OAuth 2.0官网,地址:https://oauth.net/2/

原文地址:https://www.cnblogs.com/javasl/p/13054133.html