自己写SSO-基于JWT验证机制(四)

思考与回顾

前面三个文章,分别介绍了SSO的原理,基于Cookie和Session简单的实现。仔细看前面的内容,其实有不严谨,甚至不合理的地方。

再看一下sso-client的Filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;

User user = (User)request.getSession().getAttribute( USER_SESSION_KEY );
if (null != user) {
filterChain.doFilter( servletRequest, servletResponse );
return;
}
String authToken = request.getParameter( "token" );
if (StringUtils.isEmpty( authToken )) {
redirctSSO( request, response );
return;
}
AuthInfo authInfo = requestSSOValidateToken( authToken );
if (null == authInfo || !authInfo.isPass()) {
redirctSSO( request, response );
return;
}
request.getSession().setAttribute( USER_SESSION_KEY, authInfo.getUser() );
}

filterChain.doFilter( servletRequest, servletResponse );
}

不难看出,我们首先通过客户端session去判断用户是否登录,问题是什么?不容易扩展,需要客户端进行session共享,这显然并不合理,而且,token是存在sso.xxx.com域下的cookie,是所有子系统共用这一token,问题在那么怎么解决这个问题?

我们可以把sso看做是token分发的机器,然后客户端只要把token各自存放到域下的cookie中,请求时带着token,验证token,由于JWT中的payload会包含一些用户信息,验证token是否有效有两种:

  • 客户端自己验证,这种方式适用于token长时间有效,但是类似sso,如果用户退出,怎么通知所有客户端中验证token失效呢?(未过期)
  • 服务端验证,这种方式适合sso。
坚持技术分享,您的支持将鼓励我继续创作!