OAuth 2.0 原理、流程、使用及解释

2020-08-24 16:19

 

最近应客户的要求,我们公司对客户的原有系统,进行了升级,增加了 OAuth 2.0 的功能。 开发过程中,搜索了网上的资料,发现都解释不清。可能是相关作者,只熟悉前端、后端之一,说不清楚完整流程。我们边理解、边猜测、边开发调试,终于完成了此系统的改造。 之后,公司对本公司的软件产品:折桂打印平台系统/折桂上传平台系统、折桂单点登录系统,均增加了 OAuth 2.0 功能,也有机会,同时开发 OAuth 2.0 使用方的软件、 OAuth 2.0 服务提供方的软件,完成之后,决定写一遍这方面的流程文章,作为总结。

 

网上的 OAuth 2.0 介绍,也有一些交互流程图,但都比较简单、概要,难以理解。

这里整理一份详细的 OAuth 2.0 authorization_code 模式的交互流程图,如下:

oauth 2.0 flow chart

 

相关解释如下:

绿色宽箭头
,为用户在 IE 浏览器的主动操作;

蓝色宽箭头
,为IE浏览器的自动跳转,用户能看到,但不是用户的主动操作;

紫色宽箭头
,两个服务器之间的交互,用户看不到;

 

OAuth 详细流程的步骤如下:

1. 用户使用浏览器,输入网址,访问 server_a 的某个网址。

2.server_a 检查用户是否已登录,如果没有,则指示用户浏览器,自动跳转到 OAuth 登录服务器 server_oauth,网址参数中,带 redirect_uri ,也就是说,登录完成后,还得到我这里来。

3. OAuth 登录服务器 server_oauth, 检查用户是否已登录。请注意,同一个用户 IE ,在 server_a 、server_oauth 两台服务器处,登录状态可以不一样。

4. 如果用户未在登录服务器 server_oauth 处登录,则 server_oauth 显示登录页面(网页)。

5. 用户录入用户名、密码。此处可能有别的登录方式,比如,扫描登录,员工卡登录,等等。

6. 用户勾选“允许应用 server_a 使用我的基本用户信息(密码除外)”。此步骤,按理是不能略过的。但有的 OAuth 登录服务器 ,不显示此选择项,或者只以文字提示、用户不用去勾选。孰优孰劣,一时也难以评说。

7. 如果用户登录成功,则登录服务器 server_oauth 标记此用户为已登录状态,后台可能记录登录时间、远程 IP 地址等信息。

8. 登录服务器 server_oauth 指示用户浏览器,自动跳转到 server_a 服务器,此处网址为上述步骤 2 中的 redirect_uri 。

9. 服务器 server_a ,在 redirect_uri 网址对应的后台程序中,处理用户的 OAuth 登录过程。

9.1 服务器 server_a 获取网址参数中的 code, 这是 OAuth 技术中的"授权码"。这个授权码,有效期比较短。当然,不同的 OAuth 登录服务器,配置不同,可能是几秒钟,可能是10分钟。

9.2 服务器 server_a 以"授权码" 向 OAuth 登录服务器 server_oauth 索取 token ,即 OAuth 技术中的"令牌"。这一步骤,用户处 IE 浏览器看不到。令牌的有效期较长。同样的,不同的 OAuth 登录服务器,配置不同,可能是15分钟,可能是几天。这一步骤操作,一般是 HTTP GET 请求(request).

9.2.1 OAuth 登录服务器 server_oauth,以 json 字符串形式,返回 token 数据,作为 9.2 步骤的结果。这一步骤,是 HTTP GET 的结果(response)。

9.2.2 服务器 server_a 解析得到的 token json 字符串,获取 token 数值。

9.3 服务器 server_a 以"token 数值" 向 OAuth 登录服务器 server_oauth 索取用户资源,此处一般只有用户基本信息,比如登录账号、用户全名、电子邮件、电话等,不涉及密码。这一步骤操作,一般是 HTTP GET 请求(request).

9.3.1 OAuth 登录服务器 server_oauth,以 json 字符串形式,返回用户基本信息数据,作为 9.5 步骤的结果。这一步骤,是 HTTP GET 的结果(response)。

9.3.2 服务器 server_a 解析得到的 user info json 字符串,获取用户基本信息数据。

9.4 服务器 server_a 保存用户基本信息,并标记为已登录用户

9.4.1 一般来说,服务器 server_a 会检查此用户登录账号(qq 号,或电子邮件,或域账号...),是否为本地已存在的用户。如果不是,则创建本地用户。

9.4.2 服务器 server_a 保存当前远程 IE 用户对应的信息,一般是后端保存用户登录账号到 HTTP session。此步骤即标记当前用户为已登录状态、并记住当前登录用户是谁。

9.4.3 服务器 server_a 保存当前远程 IE 用户对应的 OAuth token,一般也是保存到 HTTP session。

10. 服务器 server_a 指示用户浏览器,自动跳转到本服务器的另一个网址。此处不同的系统,实现的功能不同。一般是跳转到“本系统里已登录用户的默认首页”,也有的系统,会跳转到以上步骤 1 的网址。

11. 服务器 server_a 后端检查用户在本系统的网页操作权限,各系统自行实现功能,此处不详细描述。

 

以上,即 OAuth 2.0 的完整交互过程。

 

 

欢迎转载,转载请注明出处: https://www.zheguisoft.com/staff_blogs/jacklondon_chen/2020, 及 https://www.cnblogs.com/jacklondon/p/oauth_2_workflow_in_authorization_code_mode.html

 

 

 


请选择网站语言: