本文如有不对之处,欢迎各位在评论区指出
目录
1.OAuth2 的常见使用场景
- 三方登录:当你自己开发的系统需要引入微信、qq、支付宝、钉钉等第三方登录的时候
- 开放平台:当你自己开发的系统需要开放一些接口,用来给第三方应用去查询使用相关的信息
- sso单点登录:当你自己开发的系统是在微服务环境下使用sso相关的场景
第一种就可以把自己开发的系统理解为Gitee,用户可以使用微信、QQ等第三方登录进行登录;
第二种就可以把自己开发的系统理解为微信、QQ,用户可以在第三方应用Gitee中调用微信、QQ进行授权,然后通过gitee使用微信开放的功能;
第三种就可以把自己开发的系统理解为一个大系统(仅做举例),这个大系统提供CRM系统、ERP系统、OA协同系统,普通的使用时,用户在使用前需要在各个系统进行登录,然后才能使用;而使用sso单点登录后,用户只需要在一个系统中登录,之后使用其他系统时就可以直接访问,无需再次登录;
2.OAuth2四种授权模式的使用场景
1. 授权码模式:安全性高,使用率高,流程复杂。适用于有自己的服务器的应用(前端服务或者后端服务),它是一个一次性的临时凭证,用来换取 access_token
和 refresh_token
。一旦换取成功, code
立即作废,不能再使用第二次。对安全性要求较高,web项目中一般使用授权码模式;
2. 简化模式:流程简单,简化模式适用于纯静态页面应用,该模式下, access_token
容易泄露且不可刷新,不安全;
3. 密码模式:用户向客户端提供自己的用户名和密码,客户端再向 "服务商提供商" 换取 access_token
,极度不安全,需要高度信任第三方应用;适用于其他授权模式都无法采用的情况;原生APP可以使用,web不建议使用
4. 客户端模式:授权维度为应用维度,而不是用户维度。因此有可能多个用户共用一个Token的情况。适用于应用维度的共享资源。适用于服务器之间交互,不需要用户参与。
3.OAuth2各模式涉及到的流程
我们结合着sso单点登录、三方登录和开放平台来进行说明,其中会包括各个系统的前后端分离架构模式。
1.授权码模式
一般用于web系统,那么授权用户的操作,可以理解为浏览器,由浏览器代替用户操作。
操作比较复杂
1.sso单点登录
sso单点登录系统中是不需要资源服务器这个角色的,系统是需要提供有授权服务器和客户端的。授权服务器是用来做统一认证的,客户端就是各个应用系统,我们只需要登录成功后拿到用户信息以及用户所拥有的权限即可;
其中客户端和授权服务端对应的用户信息是一致的!
(1)授权服务端、客户端都是前后端不分离情况
1.用户向客户端发起使用授权服务端登录授权请求;
2.客户端收到使用授权服务端登录授权请求后,返回一个向授权服务端发起登录授权的请求链接(该链接会携带客户端id、登录授权类型、登录授权范围、登录授权回调地址等);
3.用户拿着上面的链接向授权服务端发起登录授权请求;
4.授权服务端校验到该用户没有登陆,就返回登录页面;
5.用户填写登录信息向授权服务端发起登录;
6.授权服务端校验登录信息成功后,会再次返回给用户登录授权的请求链接,让用户再次重定向;
7.用户再次拿着上面的链接向授权服务端发起登录授权请求;
8.授权服务端根据请求,若判断用户已授权的权限<客户端持有的权限(这一块逻辑可自定义),就返回授权确认页面;
9.用户进行授权确认后,将授权的信息返回给授权服务端;
10.授权服务端校验无误后,会将code拼接到登录授权回调地址,然后返回给用户;
11.用户拿着上面的链接会向客户端发起请求;
12.客户端拿着code向授权服务端获取token;
13.授权服务端校验code成功后向客户端返回token;
14.客户端获取到token,经过一系列处理,返回给用户一个默认页面(或用户一开始请求的页面)
15.用户携带着token向客户端发起业务功能请求;
16.客户端携带着token向授权服务端发起token校验请求;
17.授权服务端确认token有效后返回信息以及用户信息;
18.客户端保存用户信息,执行业务功能,并返回给用户;
客户端前后端不分离情况下,客户端返回给用户的都是页面信息,页面里面会包含着各个数据。
授权服务端需要有:
1.登录的请求页面
2.授权确认页面,确认授权请求;
3.获取token的接口;
4.校验token的接口;
客户端需要有:
1.向授权服务器发起授权请求的页面操作或接口;
2.接收code并携带code向授权服务端获取token,然后处理用户认证登录的回调地址;
3.发起校验token的功能;
(2)授权服务端前后端不分离,客户端前后端分离;
前10部分逻辑与1.一样,后面逻辑会有些变化;
1.用户向客户端前端发起使用授权服务端登录授权请求;
2.客户端前端收到使用授权服务端登录授权请求后,返回一个向授权服务端发起登录授权的请求链接(该链接会携带客户端id、登录授权类型、登录授权范围、登录授权回调地址等)【此处可以直接在前端保存链接的参数但是不安全,也可以调用客户端后端拿到参数】;
3.用户拿着上面的链接向授权服务端发起登录授权请求;
4.授权服务端校验到该用户没有登陆,就返回登录页面;
5.用户填写登录信息向授权服务端发起登录;
6.授权服务端校验登录信息成功后,会再次返回给用户登录授权的请求链接,让用户再次重定向;
7.用户再次拿着上面的链接向授权服务端发起登录授权请求;
8.授权服务端根据请求,若判断用户已授权的权限<客户端持有的权限(这一块逻辑可自定义),就返回授权确认页面;
9.用户进行授权确认后,将授权的信息返回给授权服务端;
10.授权服务端校验无误后,会将code拼接到登录授权回调地址,然后返回给用户;
11.用户拿着上面的链接会向客户端前端发起请求;
12.客户端前端拿着code调用客户端后端;
13.客户端后端拿到code,向授权服务端获取token;
14.授权服务端校验code成功后向客户端后端返回token;
15.客户端后端获取到token,经过一系列处理,返回给客户端前端token等信息;
16.客户端前端拿到token进行一系列保存后,返回给用户一个默认页面(或用户一开始请求的页面)
17.用户携带着token向客户端前端发起业务功能请求;
18.客户端前端携带着token向客户端后端发起业务功能请求;
19.客户端后端携带着token向授权服务端发起token校验请求;
20.授权服务端返回确认token有效后返回信息以及用户信息;
21.客户端后端保存用户信息,执行业务功能,并返回给客户端前端;
22.客户端前端根据返回的信息,打开指定页面;
客户端前后端分离情况下,客户端后端只返回数据,客户端前端根据其后端返回的数据呈现页面。
授权服务端需要有:
1.登录的请求页面
2.授权确认页面,确认授权请求;
3.获取token的接口;
4.校验token的接口;
客户端前端需要有:
1.向授权服务器发起授权请求的页面操作;
2.接收code的回调地址;
3.携带code向客户端后端发起认证的请求;
客户端后端需要有:
1.接收客户端前端code并携带code向授权服务端获取token,然后处理用户认证登录并返回token的接口/拦截器
2.发起校验token的功能;
2.三方登录和开放平台
这两个是可以对照着理解的,开放平台是提供第三方登录,需要第三方应用进行使用;三方登录是提供第三方应用,需要使用第三方登录进行认证授权,同时还会有自己的用户信息管理,用户信息可以是和第三方登录的用户信息一致或者进行绑定;
其中三方登录是有自己的一套用户信息的,只不过用户信息会绑定开放平台的用户信息,即可以通过自己的登录逻辑进行登录,又可以使用开放平台的登录逻辑进行登录;
(1)授权服务端、客户端都是前后端不分离情况;
这个与sso里面的1.的逻辑类似,但是其中会涉及到客户端用户绑定。
1.用户向客户端发起使用授权服务端登录授权请求;
2.客户端收到使用授权服务端登录授权请求后,返回一个向授权服务端发起登录授权的请求链接(该链接会携带客户端id、登录授权类型、登录授权范围、登录授权回调地址等);
3.用户拿着上面的链接向授权服务端发起登录授权请求;
4.授权服务端校验到该用户没有登陆,就返回登录页面;
5.用户填写登录信息向授权服务端发起登录;
6.授权服务端校验登录信息成功后,会再次返回给用户登录授权的请求链接,让用户再次重定向;
7.用户再次拿着上面的链接向授权服务端发起登录授权请求;
8.授权服务端根据请求,若判断用户已授权的权限<客户端持有的权限(这一块逻辑可自定义),就返回授权确认页面;
9.用户进行授权确认后,将授权的信息返回给授权服务端;
10.授权服务端校验无误后,会将code拼接到登录授权回调地址,然后返回给用户;
11.用户拿着上面的链接会向客户端发起请求;
12.客户端拿着code向授权服务端获取token;
13.授权服务端校验code成功后向客户端返回token;
14.客户端获取到token,去数据库中获取绑定账号信息;
15.数据库将绑定信息返回给客户端,客户端发现该授权服务端的用户没有绑定到自己库中的账号;
16客户端返回给用户一个绑定账号页面;
17.用户输入绑定账号需要的信息,发给客户端;
18.客户端将账号信息与授权服务端的用户信息绑定,并保存到库中;
19.数据库返回执行语句的返回信息给客户端;
20.客户端将用户信息进行一系列登录认证保存后,返回给用户一个默认页面(或用户一开始请求的页面),并且给用户一个客户端token;
21.用户携带着客户端token向客户端发起业务功能请求;
22.客户端会进行校验客户端token,如果是自己的业务功能,则直接执行完毕后返回,如果是授权服务端的公开接口则到步骤23;
23.客户端会从客户端token中拿到授权服务端的token,然后端携带着token向授权服务端发起业务功能请求;
24.授权服务端返回确认token有效后返回信息以及用户信息;
25.客户端保存用户信息,执行业务功能,并返回给用户;
授权服务端需要有:
1.登录的请求页面
2.授权确认页面,确认授权请求;
3.获取token的接口;
4.校验token的接口;
客户端需要有:
1.向授权服务器发起授权请求的页面操作或接口;
2.接收code并携带code向授权服务端获取token,然后处理用户认证登录的回调地址;
3.发起校验token的功能;
(2)授权服务端前后端不分离,客户端前后端分离;
这个类似于sso2.和上面1.的结合体。
1.用户向客户端前端发起使用授权服务端登录授权请求;
2.客户端前端收到使用授权服务端登录授权请求后,返回一个向授权服务端发起登录授权的请求链接(该链接会携带客户端id、登录授权类型、登录授权范围、登录授权回调地址等)【此处可以直接在前端保存链接的参数但是不安全,也可以调用客户端后端拿到参数】;
3.用户拿着上面的链接向授权服务端发起登录授权请求;
4.授权服务端校验到该用户没有登陆,就返回登录页面;
5.用户填写登录信息向授权服务端发起登录;
6.授权服务端校验登录信息成功后,会再次返回给用户登录授权的请求链接,让用户再次重定向;
7.用户再次拿着上面的链接向授权服务端发起登录授权请求;
8.授权服务端根据请求,若判断用户已授权的权限<客户端持有的权限(这一块逻辑可自定义),就返回授权确认页面;
9.用户进行授权确认后,将授权的信息返回给授权服务端;
10.授权服务端校验无误后,会将code拼接到登录授权回调地址,然后返回给用户;
11.用户拿着上面的链接会向客户端前端发起请求;
12.客户端前端拿着code调用客户端后端;
13.客户端后端拿到code,向授权服务端获取token;
14.授权服务端校验code成功后向客户端后端返回token;
15.客户端后端获取到token,去数据库中获取绑定账号信息;
16.数据库将绑定信息返回给客户端后端,客户端后端发现该授权服务端的用户没有绑定到自己库中的账号;
17.客户端后端返回客户端前端一个信号;
18.客户端前端返回给用户一个绑定账号页面;
19.用户输入绑定账号需要的信息,发给客户端前端;
20.客户端前端将信息发给客户端后端;
21.客户端后端将账号信息与授权服务端的用户信息绑定,并保存到库中;
22.数据库返回执行语句的返回信息给客户端后端;
23.客户端后端将用户信息进行一系列登录认证保存后,返回给客户端前端token等信息;
24.客户端前端拿到token进行一系列保存后,返回给用户一个默认页面(或用户一开始请求的页面)
25.用户携带着客户端token向客户端前端发起业务功能请求;
26.客户端前端携带着token向客户端后端发起业务功能请求;
27.客户端后端会进行校验客户端token,如果是自己的业务功能,则直接返回给客户端前端;
28.客户端前端根据返回的信息,打开指定页面;
29.如果是授权服务端的公开接口则客户端后端会从客户端token中拿到授权服务端的token,然后端携带着token向授权服务端发起业务功能请求;
30.授权服务端返回给客户端后端确认token有效后返回信息以及用户信息;
31.客户端后端保存用户信息,执行业务功能,并返回给客户端前端;
32.客户端前端根据返回的信息,打开指定页面;
授权服务端需要有:
1.登录的请求页面
2.授权确认页面,确认授权请求;
3.获取token的接口;
4.校验token的接口;
客户端前端需要有:
1.向授权服务器发起授权请求的页面操作;
2.接收code的回调地址;
3.携带code向客户端后端发起认证的请求;
客户端后端需要有:
1.接收客户端前端code并携带code向授权服务端获取token,然后处理用户认证登录并返回token的接口/拦截器
2.发起校验token的功能;
2.密码模式
1.sso单点登录
(1)授权服务端、客户端都是前后端不分离情况
1.用户携带着授权服务端认可的账户信息(即在授权服务端可以认证登录的账号),向客户端发起使用授权服务端登录授权请求;
2.客户端接到请求后,携带着客户端信息和用户账号信息,向授权服务端发起登录授权请求;
3.授权服务端接收到信息校验无误后,会生成token返回给客户端;
4.客户端获取到token,经过一系列处理,返回给用户一个默认页面(或用户一开始请求的页面)
5.用户携带着token向客户端发起业务功能请求;
6.客户端先拿着token向授权服务端确认;
7.授权服务端确认token有效后返回信息以及用户信息;
8.客户端保存用户信息,执行业务功能,并返回给用户;
(2)授权服务端前后端不分离,客户端前后端分离;
1.用户携带着授权服务端认可的账户信息(即在授权服务端可以认证登录的账号),向客户端前端发起使用授权服务端登录授权请求;
2.客户端前端携带着用户信息向客户端后端发起使用授权服务端登录授权请求;
3.客户端后端接到请求后,携带着客户端信息和用户账号信息,向授权服务端发起登录授权请求;
4.授权服务端接收到信息校验无误后,会生成token返回给客户端后端;
5.客户端后端获取到token,经过一系列处理,返回给客户端前端token等信息;
6.客户端前端拿到token进行一系列保存后,返回给用户一个默认页面(或用户一开始请求的页面)
7.用户携带着token向客户端前端发起业务功能请求;
8.客户端前端携带着token向客户端后端发起业务功能请求;
9.客户端后端携带着token向授权服务端发起token校验请求;
10.授权服务端返回确认token有效后返回信息以及用户信息;
11.客户端后端保存用户信息,执行业务功能,并返回给客户端前端;
12.客户端前端根据返回的信息,打开指定页面;
2.三方登录和开放平台
(1)授权服务端、客户端都是前后端不分离情况
1.用户携带着授权服务端认可的账户信息(即在授权服务端可以认证登录的账号),向客户端发起使用授权服务端登录授权请求;
2.客户端接到请求后,携带着客户端信息和用户账号信息,向授权服务端发起登录授权请求;
3.授权服务端接收到信息校验无误后,会生成token返回给客户端;
4.客户端获取到token,去数据库中获取绑定账号信息;
5.数据库将绑定信息返回给客户端,客户端发现该授权服务端的用户没有绑定到自己库中的账号;
6客户端返回给用户一个绑定账号页面;
7.用户输入绑定账号需要的信息,发给客户端;
8.客户端将账号信息与授权服务端的用户信息绑定,并保存到库中;
9.数据库返回执行语句的返回信息给客户端;
10.客户端将用户信息进行一系列登录认证保存后,返回给用户一个默认页面(或用户一开始请求的页面),并且给用户一个客户端token;
11.用户携带着客户端token向客户端发起业务功能请求;
12.客户端会进行校验客户端token,如果是自己的业务功能,则跳到步骤14;如果是授权服务端的公开接口,客户端会从客户端token中拿到授权服务端的token,然后客户端携带着token向授权服务端发起业务功能请求;
13.授权服务端返回确认token有效后返回信息以及用户信息;
14.客户端保存用户信息,执行业务功能,并返回给用户;
(2)授权服务端前后端不分离,客户端前后端分离;
1.用户携带着授权服务端认可的账户信息(即在授权服务端可以认证登录的账号),向客户端前端发起使用授权服务端登录授权请求;
2.客户端前端携带着用户信息向客户端后端发起使用授权服务端登录授权请求;
3.客户端后端接到请求后,携带着客户端信息和用户账号信息,向授权服务端发起登录授权请求;
4.授权服务端接收到信息校验无误后,会生成token返回给客户端后端;
5.客户端获取到token,去数据库中获取绑定账号信息;
6.数据库将绑定信息返回给客户端后端,客户端后端发现该授权服务端的用户没有绑定到自己库中的账号;
7.客户端后端返回客户端前端一个信号;
8.客户端前端返回给用户一个绑定账号页面;
9.用户输入绑定账号需要的信息,发给客户端前端;
10.客户端前端将信息发给客户端后端;
11.客户端后端将账号信息与授权服务端的用户信息绑定,并保存到库中;
12.数据库返回执行语句的返回信息给客户端后端;
13.客户端后端将用户信息进行一系列登录认证保存后,返回给客户端前端token等信息;
14.客户端前端拿到token进行一系列保存后,返回给用户一个默认页面(或用户一开始请求的页面)
15.用户携带着客户端token向客户端前端发起业务功能请求;
16.客户端前端携带着token向客户端后端发起业务功能请求;
17.客户端后端会进行校验客户端token,如果是自己的业务功能,则直接返回给客户端前端;
18.客户端前端根据返回的信息,打开指定页面;
19.如果是授权服务端的公开接口则客户端后端会从客户端token中拿到授权服务端的token,然后端携带着token向授权服务端发起业务功能请求;
20.授权服务端返回给客户端后端确认token有效后返回信息以及用户信息;
21.客户端后端保存用户信息,执行业务功能,并返回给客户端前端;
22.客户端前端根据返回的信息,打开指定页面;