深入理解OAuth2协议和使用场景

OAuth2协议概述

生活中,当我们使用滴滴出行或者美团app进行登录时,如果选择微信授权登录,则可以使用微信的头像,昵称,地区和性别信息登录,如图:

在滴滴出行和美团app的系统中,是没有存储微信的用户信息,但是授权过后就可以使用到微信的部分权限。这操作过程就是基于OAuth2协议实现的。OAuth2是当前授权的行业标准,OAuth2中有4种角色

  • Resource Owner,资源所有者,对受保护的资源拥有访问权限的实体,通常是指一个用户。
  • Resource Server,资源服务器,拥有受保护的资源,允许持有访问令牌(access token)访问资源。
  • Client,客户端,通常是指第三方应用程序。
  • Authorization Server,授权服务器,对用户认证,认证通过后向客户端发送访问令牌(access token)

在上面的例子中,微信用户是资源所有者;微信的头像,昵称,地区和性别信息登录API就是资源服务器;滴滴出行或者美团app是客户端,第三方应用程序;授权服务器是微信开放平台提供,例子中未体现。详细的OAuth2概念可以参考(转阮一峰)深入理解OAuth 2.0。一般客户端直接访问访问资源服务时,会抛出没有权限的错误,需要客户端经常授权服务器的认证,拿到访问令牌以后,才能成功的访问。OAuth2主要包含如下步骤:

  1. 客户端请求资源所有者的授权。
  2. 资源所有者同意授权,返回授权凭证(Authorizaiton Grant)。
  3. 客户端携带授权凭证,向授权服务器请求访问令牌(access token)。
  4. 授权服务器对客户端进行身份认证,认证授权,认证通过则返回访问令牌(access token)。
  5. 客户端携带访问令牌,请求资源服务器。
  6. 资源服务器验证访问令牌,有效则返回资源。
  7. 如果访问令牌失效(access token),客户端使用刷新令牌(refresh token)再次请求访问令牌。

OAuth2默认定义了4种授权类型,分别如下:

  • Authorization Code:授权码类型
  • Implicit:简化类型,也称为隐式类型
  • Resource Owner Password Credentials:密码类型
  • Client Credential:客户端类型

OAuth2使用场景

在实际开发中,主要是授权码类型和密码类型。

密码模式

是客户端向授权服务器获取访问令牌时,直接带上客户端信息和用户信息,认证通过后就直接返回访问令牌。通常,密码类型一般适用于公司内部服务的相互访问,知道资源所有者的认证信息。例如,公司的管理后端,需要访问自己的订单服务,商品服务,用户服务等等,这些都是公司内部服务,在授权时,直接带上管理后端的用户信息也无妨。

授权码类型

是功能最完整,流程最严密的授权类型。通常,客户端访问资源服务服务器进行认证时,客户端不保存用户的姓名和密码信息,在进行认证时,一般在浏览器输入用户姓名和密码框进行用户授权,成功后访问一个授权码。客户端再次带上授权码访问授权服务器,认证通过就可以得到访问令牌。微信开发平台中的微信登录功能就是基于授权码类型实现的,具体可以参考微信官方文档-开放平台。以下,以微信开放平台和获取微信用户基本开放信息讲解OAuth2协议和授权码类型的流程。

在进行微信 OAuth2.0 授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用(OAuth2的客户端),并获得相应的 AppID 和 AppSecret,申请微信登录且通过审核后,可开始接入流程。微信 OAuth2.0 授权登录让微信用户(资源所有者)使用微信身份安全登录第三方应用或网站(客户端),在微信用户授权登录已接入微信 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口访问令牌(access_token),通过 access_token 可以进行微信开放平台授权关系接口(资源服务器)调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。授权码类型整体流程为:

  1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数。
  2. 通过code参数加上AppID和AppSecret等,通过API换取access_token。
  3.  通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

在微信开发平台在中 ,访问令牌access_token 有效期为 2 个小时,当 access_token 超时后,可以使用刷新令牌refresh_token进行刷新,refresh_token的有效期为30 天;当 refresh_token 失效的后,需要用户重新授权再次获取access_token。用户获取access_token的时序图如下:

发布了37 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/new_com/article/details/104886605
今日推荐