- 以admin登录为例,首先用户访问admin页面,点击使用员工系统账号登录,前端调用admin项目的login接口,此接口无参数。(后端会往cookie中放一个随机session,并将该session和过期时间保存)
- admin的login接口拼接一个url,
这个url的地址是员工系统(staff)的登录页面
,参数是admin项目的client_id和一个随机的MD5值(state),后端拼接好返回给前端。这个链接长这个样子:
https://staff.xxxx.com/auth?client_id=j606-gPZa9E0&state=78ccec1fec1c7e47bbc94855e8fb5741
- 前端拿到这个链接,进行访问,跳转到员工系统的登录页。
- 用户输入用户名和密码,前端将用户名、密码、要登陆的系统的client_id(j606-gPZa9E0)和state(78ccec1fec1c7e47bbc94855e8fb5741)作为参数,请求
staff的/oauth/login接口
,该接口做以下几件事:
- 先校验用户名和密码,得到uid。
- 同时根据client_id,得到要登陆系统的client_secret(这里无用)和redirect_uri。
- 之后随机一个MD5(code,可能不需要32位),以这个MD5作为key,client_id和uid作为value保存下来。
- 拼接一个url,地址是redirect_uri,
这个地址是admin的授权页面
,参数是刚刚作为key的MD5,以及请求参数中的state,后端拼接好返回给前端。是这个链接长这个样子:
https://admin.xxxx.work/auth?code=0f2de7b4c750ad0c746929&state=78ccec1fec1c7e47bbc94855e8fb5741
- 前端跳转到这个页面后,请求
admin的/auth接口
。参数就是上面链接中的code和state
。该接口做以下几件事: - 取出自己的client_id,client_secret,以及参数中的code,这三个值作为参数,请求
staff的/oauth/token接口
。
- 该接口根据code可以得到client_id和uid(之前保存的对应关系)。校验client_id和client_secret。
- 校验通过后,为该uid生成个token,将token作为key,uid作为值保存。token有个默认过期时间。
- 根据uid查询该用户的姓名、手机号、邮箱等信息。
- 将token、过期时间、姓名、手机号、邮箱等信息返回(不返回uid)。
- 拿到返回值,根据返回值中的邮箱,找到用户在admin系统中uid,然后将uid作为session_id添加到session池中,这样通过最初的session,即可找到对应用户。