基于JWT的Token认证机制实现(二)认证过程
登录
-
第一次认证:第一次登录,用户从浏览器输入用户名/密码,提交后到服务器的登录处理的Action层(Login Action);
-
Login Action调用认证服务进行用户名密码认证,如果认证通过,Login Action层调用用户信息服务获取用户信息(包括完整的用户信息及对应权限信息);
-
返回用户信息后,Login Action从配置文件中获取Token签名生成的秘钥信息,进行Token的生成;
-
生成Token的过程中可以调用第三方的JWT Lib生成签名后的JWT数据;
-
完成JWT数据签名后,将其设置到COOKIE对象中,并重定向到首页,完成登录过程;
请求认证
基于Token的认证机制会在每一次请求中都带上完成签名的Token信息,这个Token信息可能在COOKIE中,也可能在HTTP的Authorization头中;
-
客户端(APP客户端或浏览器)通过GET或POST请求访问资源(页面或调用API);
-
认证服务作为一个Middleware HOOK 对请求进行拦截,首先在cookie中查找Token信息,如果没有找到,则在HTTP Authorization Head中查找;
-
如果找到Token信息,则根据配置文件中的签名加密秘钥,调用JWT Lib对Token信息进行解密和解码;
-
完成解码并验证签名通过后,对Token中的exp、nbf、aud等信息进行验证;
-
全部通过后,根据获取的用户的角色权限信息,进行对请求的资源的权限逻辑判断;
-
如果权限逻辑判断通过则通过Response对象返回;否则则返回HTTP 401;
对Token认证的几点认识
-
一个Token就是一些信息的集合;
-
在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;
-
服务端需要对cookie和HTTP Authrorization Header进行Token信息的检查;
-
基于上一点,可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;
-
因为token是被签名的,所以我们可以认为一个可以解码认证通过的token是由我们系统发放的,其中带的信息是合法有效的;