diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 45a1d4a2..dab6d4da 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -52,6 +52,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0 ##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记 token.key testim +##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题 +##token.expire_time 2592000000 + ##首次登录,是否接收之前的历史消息。0 不接收;1接收。 message.roaming 0 diff --git a/broker/src/main/java/io/moquette/BrokerConstants.java b/broker/src/main/java/io/moquette/BrokerConstants.java index df6c7bb5..e8c40918 100755 --- a/broker/src/main/java/io/moquette/BrokerConstants.java +++ b/broker/src/main/java/io/moquette/BrokerConstants.java @@ -99,6 +99,7 @@ public final class BrokerConstants { public static final String CLIENT_PROTO_SECRET_KEY = "client.proto.secret_key"; public static final String TOKEN_SECRET_KEY = "token.key"; + public static final String TOKEN_EXPIRE_TIME = "token.expire_time"; public static final String EMBED_DB_PROPERTY_NAME = "embed.db"; diff --git a/broker/src/main/java/io/moquette/server/Server.java b/broker/src/main/java/io/moquette/server/Server.java index 1b353ecf..a545fbaa 100755 --- a/broker/src/main/java/io/moquette/server/Server.java +++ b/broker/src/main/java/io/moquette/server/Server.java @@ -35,11 +35,13 @@ import io.moquette.spi.IStore; import io.moquette.spi.impl.ProtocolProcessor; import io.moquette.spi.impl.ProtocolProcessorBootstrapper; import io.moquette.spi.impl.security.AES; +import io.moquette.spi.impl.subscriptions.Token; import io.moquette.spi.security.IAuthenticator; import io.moquette.spi.security.IAuthorizator; import io.moquette.spi.security.ISslContextCreator; import io.moquette.spi.security.Tokenor; import io.netty.util.ResourceLeakDetector; +import io.netty.util.internal.StringUtil; import win.liyufan.im.DBUtil; import org.slf4j.Logger; @@ -387,6 +389,14 @@ public class Server { hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId); hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp); Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY)); + String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME); + if (!StringUtil.isNullOrEmpty(expirTimeStr)) { + try { + Tokenor.setExpiredTime(Long.parseLong(expirTimeStr)); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } RPCCenter.getInstance().init(this); return true; } diff --git a/broker/src/main/java/io/moquette/spi/security/Tokenor.java b/broker/src/main/java/io/moquette/spi/security/Tokenor.java index 1922f5b4..16c5a037 100755 --- a/broker/src/main/java/io/moquette/spi/security/Tokenor.java +++ b/broker/src/main/java/io/moquette/spi/security/Tokenor.java @@ -6,6 +6,7 @@ import io.moquette.spi.impl.security.AES; public class Tokenor { private static String KEY = "testim"; + private static long expiredTime = Long.MAX_VALUE; public static void setKey(String key) { if (!StringUtil.isNullOrEmpty(key)) { @@ -13,6 +14,10 @@ public class Tokenor { } } + public static void setExpiredTime(long expiredTime) { + Tokenor.expiredTime = expiredTime; + } + public static String getUserId(byte[] password) { try { String signKey = @@ -21,8 +26,8 @@ public class Tokenor { if (signKey.startsWith(KEY + "|")) { signKey = signKey.substring(KEY.length() + 1); long timestamp = Long.parseLong(signKey.substring(0, signKey.indexOf('|'))); - if (System.currentTimeMillis() - timestamp > 7 * 24 * 60 *60 *1000) { - //return false; + if (expiredTime > 0 && System.currentTimeMillis() - timestamp > expiredTime) { + return null; } String id = signKey.substring(signKey.indexOf('|') + 1); return id; diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 96ed7a72..dec3fa65 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -43,6 +43,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0 ##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记 token.key testim +##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题 +##token.expire_time 2592000000 + ##首次登录,是否接收之前的历史消息。0 不接收;1接收。 message.roaming 0