结合https://blog.csdn.net/qq_37636695/article/details/79265711谈一下如何在java中使用JWT
上述文章说明了在sso简单来说,单点登录SSO(Single SignOn)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录。也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性。以下是sso系统的框架图 在免登陆系统中我们做好token的产生和保存,可以简化整个系统的用户验证。
首先 token是一个String类型的变量,在我的项目中,主要通过JWTHelper.generateToken方法来生成token,
在获得token的时候 步骤如下
1.应用用户的username userid name 获取一个JWTInfo
IJWTUser jwtInfo = new JWTUser("hjt", "hjt", "hjt");
如此,便获得到了一个IJWTUser的类型,存储了用户的id和对象,
2.获得对象之后,应用----一个generateToken函数来获得toekn的具体值方法如下,通过一个IJWTInfo的类型来获得用户的id和对象,一个保存私钥的地址,还有过期的时间。。。。具体方法代码如下:60是过期的时间 ,"d:/pri.key"是私钥的地址
//获取token值
String token=generateToken(info,"d:/pri.key",60);
其具体方法细节如下:
/**
* 密钥加密token
* @param jwtInfo 包含有用户名称和id的用户对象
* @param priKeyPath 私钥地址 * @param expire 过期时间
* @return token 生成的token
* @throws Exception
*/
public static String generateToken(IJWTInfo jwtInfo, String priKeyPath, int expire) throws Exception {
String compactJws = Jwts.builder() .setSubject(jwtInfo.getUniqueName()) .claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()) .claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()) .setExpiration(DateTime.now().plusSeconds(expire).toDate()) .signWith(SignatureAlgorithm.RS256, KeyHelper.getPrivateKey(priKeyPath)) .compact();
return compactJws; }
首先,通过Builder来获得DefaultJWTbulider来完成后续的操作,setsubject把用户的唯一命名存入标题头,然后对ID、Name进行校验,校验后设置加密的算法和有效的时间,最后进行整合
这里主要是对http标题头的操作,对应的放入http的value值中,这个是以键值对的形式来进行存储的。就比如说.返回值中.clam()(校验)方法 最后是以put(key,value)的形成存入标题头的。而.signwith()中的参数依次代表了,加密的方法、存入的路径。compact就是对上述信息进行加密了。
进行compact加密后就变成了xxxxxxx.xxxxxxxxx.xxxxxxx