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