OAuth2.0介绍

6.1.1、什么是OAuth2.0?

OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。很大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
参考:https://baike.baidu.com/item/oAuth/7153134?fr=aladdin
Oauth协议:https://tools.ietf.org/html/rfc6749

6.2.2、OAuth2.0流程示例

  1. OAuth认证流程,简单理解,就是允许我们将之前实现的认证和授权的过程交由一个独立的第三方来进行担保。而OAuth协议就是用来定义如何让这个第三方的担保有效且双方可信。例如我们下面以用户访问百度登录后的资源为例:<br />2.1 用户希望登录百度,访问百度登录后的资源。而用户可以选择使用微信账号进行登录,实际是将授权认证的流程交由微信(独立第三方)来进行担保。<br />![oauth_baidudemo_1.png](https://cdn.nlark.com/yuque/0/2022/png/22260675/1641895988314-33d8bc0d-91a8-4f77-82fa-2f143fe6a3c4.png#clientId=u2b7661d2-02ac-4&from=ui&id=u884a218a&margin=%5Bobject%20Object%5D&name=oauth_baidudemo_1.png&originHeight=677&originWidth=1555&originalType=binary&ratio=1&size=141144&status=done&style=none&taskId=ufdf386ce-e2a8-40d9-b554-32fe7d39cfe)<br />2.2 用户以扫描二维码的方式,在微信完成登录认证。<br />![oauth_baidudemo_2.png](https://cdn.nlark.com/yuque/0/2022/png/22260675/1641896028024-d297072c-2acb-4dc8-9a0c-57a169a042ec.png#clientId=u2b7661d2-02ac-4&from=ui&id=ubde1a1cc&margin=%5Bobject%20Object%5D&name=oauth_baidudemo_2.png&originHeight=540&originWidth=387&originalType=binary&ratio=1&size=49234&status=done&style=none&taskId=u482248cc-868c-4945-9540-9749142ae66)<br />2.3 用户选择同意后,进入百度的流程。这时,百度会获取用户的微信身份信息,与百度自己的一个注册账号完成绑定。绑定完成了之后,就会用这个绑定后的账号完成自己的登录流程。<br />![oauth_baidudemo_3.png](https://cdn.nlark.com/yuque/0/2022/png/22260675/1641896060438-7a15c97a-5619-43e0-a20f-8cb43af9070c.png#clientId=u2b7661d2-02ac-4&from=ui&id=uf4f88098&margin=%5Bobject%20Object%5D&name=oauth_baidudemo_3.png&originHeight=467&originWidth=895&originalType=binary&ratio=1&size=36964&status=done&style=none&taskId=u6f8f122a-397a-450e-851f-9d3589bb122)<br />以上这个过程,实际上就是一个典型的OAuth2.0的认证流程。在这个登录认证的过程中,实际上是只有用户和百度之间有资源访问的关系,而微信就是作为一个独立的第三方,使用用户在微信里的身份信息,来对用户的身份进行了一次担保认证。认证完成后,百度就可以获取到用户的微信身份信息,进入自己的后续流程,与百度内部的一个用户信息完成绑定及登录。整个流程大致是这样<br />![oauth_baidudemo_4.png](https://cdn.nlark.com/yuque/0/2022/png/22260675/1641896109584-649d9637-772c-4b7b-88a1-bb5c47746fc6.png#clientId=u2b7661d2-02ac-4&from=ui&id=uaa0c0a64&margin=%5Bobject%20Object%5D&name=oauth_baidudemo_4.png&originHeight=626&originWidth=590&originalType=binary&ratio=1&size=44587&status=done&style=none&taskId=u435cbe3c-faf5-411c-889b-30416782373)<br />我们来分析这整个过程,其中最重要的问题,显然是如何让用户、百度和微信这三方实现权限认证的共信。这其中涉及到非常多的细节问题,而OAuth2.0协议就是用来定义这个过程中,各方的行为标准。

6.3.3、OAuth2.0协议

接下来,我们引用OAuth2.0的官方图,来深入了解下OAuth2.0协议:
oauth_flow.png
OAuth2.0协议包含以下几个角色:
1、客户端 - 示例中的浏览器、微信客户端
本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源。
2、资源拥有者 - 示例中的用户(拥有微信账号)
通常是用户,也可以是应用程序,即该资源的拥有者。
3、授权服务器(也称为认证服务器) - 示例中的微信
用于服务提供者对资源拥有的身份进行认证,对访问资源进行授权,认证成功后会给客户端发放令牌(access_token),作为客户端访问资源服务器的凭据。
4、资源服务器 - 示例中的微信 和 百度
存储资源的服务器。本示例中,微信 通过OAuth协议让百度可以获取到自己存储的用户信息,而百度则通过OAuth协议,让用户可以访问自己的受保护资源。
这其中还有几个重要的概念:
clientDetails(client_id):客户信息。代表百度 在微信中的唯一索引。 在微信中用appid区分
secret:秘钥。代表百度获取微信信息需要提供的一个加密字段。这跟微信采用的加密算法有关。
scope:授权作用域。代表百度可以获取到的微信的信息范围。例如登录范围的凭证无法获取用户信息范围的信息。
access_token:授权码。百度获取微信用户信息的凭证。微信中叫做接口调用凭证。
grant_type: 授权类型。例如微信目前仅支持基于授权码的 authorization_code 模式。而OAuth2.0还可以有其他的授权方式,例如输入微信的用户名和密码的方式。
userDetails(user_id):授权用户标识。在示例中代表用户的微信号。 在微信中用openid区分.
然后,关于微信登录的功能介绍,可以查看微信的官方文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html。