JwtUtiles 生成token工具类

本文介绍了如何使用Spring Boot和JWT实现用户认证,包括创建和检验JWT token,以及关键操作如获取用户ID和手机。着重于安全性和有效期设置。
package com.sense.fircloud.common.util;

import com.sense.fircloud.common.exception.BusinessException;
import com.sense.fircloud.common.result.RespCode;
import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;

public class JwtUtils {

    //一天
    private static long tokenExpiration = 24*60*60*1000;
    private static String tokenSignKey = "com1sense2fircloud3";

    private static Key getKeyInstance(){
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        byte[] bytes = DatatypeConverter.parseBase64Binary(tokenSignKey);
        return new SecretKeySpec(bytes,signatureAlgorithm.getJcaName());
    }

    public static String createToken(String userId, String mobile) {
        String token = Jwts.builder()
                .setSubject("SRB-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                .claim("userId", userId)
                .claim("mobile", mobile)
                .signWith(SignatureAlgorithm.HS512, getKeyInstance())
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }

    /**
     * 判断token是否有效
     * @param token
     * @return
     */
    public static boolean checkToken(String token) {
        if(StringUtils.isEmpty(token)) {
            return false;
        }
        try {
            Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }


    public static String getUserId(String token) {
        Claims claims = getClaims(token);
        String userId = (String)claims.get("userId");
        return userId;
    }

    public static String getMobile(String token) {
        Claims claims = getClaims(token);
        return (String)claims.get("mobile");
    }

    public static void removeToken(String token) {
        //jwttoken无需删除,客户端扔掉即可。
    }

    /**
     * 校验token并返回Claims
     * @param token
     * @return
     */
    private static Claims getClaims(String token) {
        if(StringUtils.isEmpty(token)) {
            // LOGIN_AUTH_ERROR(-211, "未登录"),
            throw new BusinessException(RespCode.TOKEN_FAILURE);
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(token);
            Claims claims = claimsJws.getBody();
            return claims;
        } catch (Exception e) {
            throw new BusinessException(RespCode.TOKEN_FAILURE);
        }
    }
}

在OneNet平台上,Token是用于设备身份认证和安全连接的重要凭证。为了生成符合OneNet要求的Token,通常需要基于特定的算法(如HMAC-SHA1)结合产品ID、设备名称、密钥以及过期时间等参数进行计算。 以下是一个用于生成OneNet MQTT TokenJava工具类示例,该类使用了HMAC-SHA1签名算法来生成Token: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; public class OneNetTokenGenerator { private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; private static final long EXPIRE_TIME = System.currentTimeMillis() / 1000 + 24 * 60 * 60; // 默认Token有效期为24小时 /** * 生成OneNet MQTT连接所需的Token * * @param productId 产品ID * @param deviceName 设备名称 * @param deviceSecret 设备密钥 * @param expireTime 过期时间(单位:秒) * @return 生成Token */ public static String generateToken(String productId, String deviceName, String deviceSecret, Long expireTime) { try { if (expireTime == null) { expireTime = EXPIRE_TIME; } // 构建待签名字符串 StringBuilder toSign = new StringBuilder(); toSign.append("productId=").append(productId) .append("&deviceName=").append(deviceName) .append("&et=").append(expireTime); Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); SecretKeySpec keySpec = new SecretKeySpec(deviceSecret.getBytes(), "HmacSHA1"); mac.init(keySpec); byte[] rawHmac = mac.doFinal(toSign.toString().getBytes()); // 对签名结果进行Base64编码 String signature = Base64.getEncoder().encodeToString(rawHmac); // 构建最终Token Map<String, String> tokenMap = new HashMap<>(); tokenMap.put("sign", signature); tokenMap.put("productId", productId); tokenMap.put("deviceName", deviceName); tokenMap.put("et", String.valueOf(expireTime)); tokenMap.put("version", "2018-10-31"); StringBuilder tokenBuilder = new StringBuilder(); for (Map.Entry<String, String> entry : tokenMap.entrySet()) { if (tokenBuilder.length() > 0) { tokenBuilder.append("&"); } tokenBuilder.append(entry.getKey()).append("=").append(entry.getValue()); } return tokenBuilder.toString(); } catch (Exception e) { throw new RuntimeException("Failed to generate token", e); } } // 示例用法 public static void main(String[] args) { String productId = "your_product_id"; String deviceName = "your_device_name"; String deviceSecret = "your_device_secret"; String token = generateToken(productId, deviceName, deviceSecret, null); System.out.println("Generated Token: " + token); } } ``` ### 说明: 1. **参数解释**: - `productId`:产品ID,由OneNet平台分配。 - `deviceName`:设备名称,通常由开发者自定义。 - `deviceSecret`:设备密钥,用于签名计算,应保密[^1]。 - `expireTime`:Token的过期时间,以秒为单位。如果未指定,则默认设置为当前时间+24小时。 2. **签名过程**: - 使用HMAC-SHA1算法对包含`productId`、`deviceName`和`et`(过期时间)的字符串进行签名。 - 签名结果通过Base64编码转换为字符串形式,并作为`sign`参数加入最终的Token中。 3. **Token格式**: - 最终的Token是一个键值对字符串,包含`sign`、`productId`、`deviceName`、`et`和`version`等字段,各字段之间用`&`分隔。 4. **注意事项**: - 确保`deviceSecret`的安全性,不应硬编码在代码中或暴露给外部。 - 在实际部署中,建议将密钥存储在安全的地方,例如配置文件或环境变量中。 ### 相关问题: - 如何在Node.js中实现OneNet Token生成? - OneNet MQTT连接时Token的有效期如何设置? - 使用Python如何生成OneNet设备Token? - 如何验证生成的OneNet Token是否有效? - 在OneNet平台中,User Token与Device Token有何区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值