SpringBoot集成OAuth2框架(第三方授权认证)

OAuth2介绍

什么是OAuth2

OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),而在这个过程中无需将用户名和密码提供给第三方应用。实现这一功能是通过提供一个令牌(token),而不是用户名和密码来访问他们存放在特定服务提供者的数据。采用令牌(token)的方式可以让用户灵活的对第三方应用授权或者收回权限。

OAuth2 是 OAuth 协议的下一版本,但不向下兼容 OAuth 1.0。传统的 Web 开发登录认证一般都是基于 session 的,但是在前后端分离的架构中继续使用 session 就会有许多不便,因为移动端(Android、iOS、微信小程序等)要么不支持 cookie(微信小程序),要么使用非常不便,对于这些问题,使用 OAuth2 认证都能解决。

简单说就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

OAuth2基础概念

  • Authorization server:授权服务器,比如微信授权服务器
  • Resource server:资源服务器,和授权服务器可以是同一个服务器,也可以不是同一个
  • HTTP service:服务提供商,如微信
  • client:客户端,如网站“思否”
  • Resource Owner:资源所有者,如用户
  • User Agent:用户代理,如:浏览器

OAuth2授权流程

1)客户端向授权服务器请求访问资源所有者的资源->

2)资源所有者"同意"授权,授权服务器则返回code(授权码)给客户端->

3)客户端拿code去授权服务器请求token(一般在客户端后台实现)->

4)授权服务器验证code的真伪,若真则返回token->

5)客户端拿到token,就可以去资源服务器请求访问资源->

6)资源服务器验证token正确则返回资源

OAuth2四种授权模式

OAuth2定义了四种类型的授权模式:

  • 授权码模式
  • 密码模式
  • 简化模式
  • 客户端模式

授权码模式

流程最严密的验证模式,其步骤与上面所述的“OAuth2认证流程”基本一致:
 
1)第三方客户端向授权服务器请求访问资源所有者的资源:假如我正在访问“思否”,看到一篇文章不错,想要评论,但是评论就要先登录,我比较懒又不想注册“思否”,于是“思否”这个网站就提供
了微信登录,点击思否的“微信登录”后,会跳转到微信提供的页面向用户确认是否授权“思否”读取我的信息(微信提供的页面对应微信后台的授权服务器),如图:
2)资源所有者"同意"授权,授权服务器则返回code(授权码)给第三方客户端:我扫码登录微信,代表同意授权给“思否”读取我的微信个人信息去登录,此时微信授权服务器会重定向到一个事先指定的“重定向url”,并返回一个code(授权码),假如这个url是“思否”网站的网址,则会重定向回到“思否”,如图:
3)第三方客户端拿code去授权服务器请求token(一般在第三方客户端后台实现):“思否”拿到code(授权码)之后,带上“重定向的url”,继续去微信授权服务器请求token。

4)授权服务器验证code的真伪,若真则返回token:微信授权服务器拿到code(授权码)、“重定向的url”之后,验证code,并验证“重定向的url”是否就是事先指定的“重定向url”,若是则返回token给“重定向url”,即“思否”。

5)第三方客户端拿到token,就可以去资源服务器请求访问资源:“思否”拿到token后,就可以真正向微信请求访问我的个人信息。

6)资源服务器验证token正确则返回资源:微信服务器收到token后,验证成功后返回我的个人信息给“思否”。

简化模式

相比授权码模式,简化模式省去了code(授权码),它直接向授权服务器申请令牌,所有动作都在浏览器页面完成。

密码模式

用户直接把账号密码给第三方客户端,第三方客户端再拿账号密码去向服务方索要授权,这样第三方客户端就可以访问用户信息了,但是同时第三方客户端要遵守不存储密码的规则,这种一般用于用户对第三方客户端高度信赖的基础上。

客户端模式

服务方事先提供给第三方客户端一个client_id和client_secret,第三方客户端每次请求服务方访问用户的信息时,只需要提供事先拿到的client_id和client_secret给服务方,服务方拿到client_id和client_secret后验证无误就生成token给第三方客户端,此时第三方客户端就可以访问用户数据了。

SpringBoot使用OAuth2

 

posted @ 2022-04-29 13:10  残城碎梦  阅读(4357)  评论(0编辑  收藏  举报