springSecurity+oauth2认证记录(仅记录)
1 整体大致流程。
★★★★★端口8888为资源(认证服务器),端口8081为客户端。需要授权8081可以获取8888端口信息,通过授权码模式获取token进行获取。简而言之也是通过JWT(由头部,载荷,签名生成的取代session的跨域工具)实现单点登录。8081进入8888进行具体授权流程,8888返回code值到8081,在8081进行处理,通过code换取8888的JWT(即token信息)。8081拿到8888的token信息后可以携带token和scope(授权域)去获取认证服务器(8888)内资源。★★★★★
2 源码解读
认证过程
首先由客户端向服务端(授权服务器)获取code(直接由前端发送href请求即可),链接模版如下
host:8888/oauth/authorize?client_id=此客户端的唯一标识(存取在授权服务器数据库中)&scope=授权域(授权域和授权服务器内授权域匹配上才会返回code并在接下流程中返回的token内将相应scopo加密)&response_type=(返回授权类型,code等)&redirect_uri=http://localhost:8081/sss/sss/redirect(授权服务器生成code后重定向的url)。
其中部分源码解读如下图
★★★★★登录成功后,进入自定义的登录成功处理器★★★★★源码如下
此时重定向到获取code链接即:
host:8888/oauth/authorize?client_id=此客户端的唯一标识(存取在授权服务器数据库中)&scope=授权域(授权域和授权服务器内授权域匹配上才会返回code并在接下流程中返回的token内将相应scopo加密)&response_type=(返回授权类型,code等)&redirect_uri=http://localhost:8081/sss/sss/redirect(授权服务器生成code后重定向的url)。
源码如下:
默认从内存中加载!!!!!到这一路往下走就行。知道返回code到之前我们给的URL。此时我们可以自定义授权页面。接口是配合thymeleaf,自定义页面。我们写的接口和框架接口有重复会自动覆盖。!!!!
其次,客户端携带code去换取token。
问题!!!!
前后端分离情况下,由于前端并未发起请求,整体授权流程后台操作。生成的token前端获取不到!!!
解决!!!
将授权的回调url不写入security的放行路径。此时生成code认证服务器返回到客户端被拦截到前端。前端拿到code进行ajax请求,返回授权token。将此token存储到localstorage,请求后端时加入header即可。