前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安全|Java中使用JWT生成Token进行接口鉴权实现

安全|Java中使用JWT生成Token进行接口鉴权实现

作者头像
黄小怪
发布2018-12-21 14:31:04
3.4K0
发布2018-12-21 14:31:04
举报
文章被收录于专栏:小怪聊职场

先介绍下利用JWT进行鉴权的思路: 1、用户发起登录请求。 2、服务端创建一个加密后的JWT信息,作为Token返回。 3、在后续请求中JWT信息作为请求头,发给服务端。 4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

流程图如下:

网图

一、用户发起登录请求

欢迎大家访问www.fota.com

二、服务端创建一个加密后的JWT信息,作为Token返回

1、用户登录之后把生成的Token返回给前端

代码语言:javascript
复制
@Authorization
@ResponseBody
@GetMapping("user/auth")
public Result getUserSecurityInfo(HttpServletRequest request) {
   try {
       UserDTO userDTO = ...
       UserVO userVO = new UserVO();
       //这里调用创建JWT信息的方法
       userVO.setToken(TokenUtil.createJWT(String.valueOf(userDTO.getId())));
       return Result.success(userVO);
   } catch (Exception e) {
       return Result.fail(ErrorEnum.SYSTEM_ERROR);
   }
}

2、创建JWT,Generate Tokens

代码语言:javascript
复制
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import io.jsonwebtoken.*;
import java.util.Date;    
 
//Sample method to construct a JWT
private String createJWT(String id, String issuer, String subject, long ttlMillis) {
 
    //The JWT signature algorithm we will be using to sign the token
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
 
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);
 
    //We will sign our JWT with our ApiKey secret
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
 
    //Let's set the JWT Claims
    JwtBuilder builder = Jwts.builder().setId(id)
                                .setIssuedAt(now)
                                .setSubject(subject)
                                .setIssuer(issuer)
                                .signWith(signatureAlgorithm, signingKey);
 
    //if it has been specified, let's add the expiration
    if (ttlMillis >= 0) {
    long expMillis = nowMillis + ttlMillis;
        Date exp = new Date(expMillis);
        builder.setExpiration(exp);
    }
 
    //Builds the JWT and serializes it to a compact, URL-safe string
    return builder.compact();
}

3、作为Token返回

看后面有个Token

三、在后续请求中JWT信息作为请求头,发给服务端

缺一个图,马上补

四、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

1、在拦截器中读取这个Header里面的Token值

代码语言:javascript
复制
@Slf4j
@Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
    private boolean chechToken(HttpServletRequest request, HttpServletResponse response) throws IOException{
        Long userId = ...;

        if (!TokenUtil.parseJWT(request.getHeader("Authorization"), String.valueOf(userId))){
            response.setContentType("text/html;charset=GBK");
            response.setCharacterEncoding("GBK");
            response.setStatus(403);
            response.getWriter().print("<font size=6 color=red>对不起,您的请求非法,系统拒绝响应!</font>");
            return false;
        } else{
            return true;
        }
    }
}

2、拿到之后进行解密校验 Decode and Verify Tokens

代码语言:javascript
复制
import javax.xml.bind.DatatypeConverter;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.Claims;
 
//Sample method to validate and read the JWT
private void parseJWT(String jwt) {
    //This line will throw an exception if it is not a signed JWS (as expected)
    Claims claims = Jwts.parser()         
       .setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))
       .parseClaimsJws(jwt).getBody();
    System.out.println("ID: " + claims.getId());
    System.out.println("Subject: " + claims.getSubject());
    System.out.println("Issuer: " + claims.getIssuer());
    System.out.println("Expiration: " + claims.getExpiration());
}

五、总结

大家知道,我之前做过爬虫,实际这种思路在微博做反爬时也用过,看过我之前文章的同学应该知道。 好了,最后欢迎大家访问www.fota.com体验我们的产品。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、用户发起登录请求
  • 二、服务端创建一个加密后的JWT信息,作为Token返回
  • 三、在后续请求中JWT信息作为请求头,发给服务端
  • 四、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。
  • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档