diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/CheckTokenAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/CheckTokenAction.java new file mode 100755 index 00000000..837c3432 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/CheckTokenAction.java @@ -0,0 +1,75 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package com.xiaoleilu.loServer.action; + +import com.google.gson.Gson; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.moquette.persistence.MemorySessionStore; +import io.moquette.spi.security.Tokenor; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; +import win.liyufan.im.GitRepositoryState; +import win.liyufan.im.RateLimiter; +import win.liyufan.im.Utility; + +import java.io.IOException; + +@Route("/api/verify_token") +@HttpMethod("GET") +public class CheckTokenAction extends Action { + private final RateLimiter mLimitCounter = new RateLimiter(10, 1); + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + response.setStatus(HttpResponseStatus.OK); + String userId = request.getParam("userId"); + String clientId = request.getParam("clientId"); + String token = request.getParam("token"); + + String result = "这是个检查token有效性的接口,如果客户端无法连接成功,可以使用这个接口检查token是否正确。\n"; + result += "使用方法是在浏览器中输入http://imserverip/api/verify_token?userId=${userId}&clientId=${clientId}&token=${token}。\n"; + result += "例如:http://localhost/api/verify_token?userId=123&clientId=456&token=789。\n"; + result += "特别注意的是:必须使用正确的clientId,clientId必须是在测试手机上调用im接口获取。不用手机上获取到的clientId也都是不同的,一定不能用错!!!\n\n\n"; + + if (StringUtil.isNullOrEmpty(userId)) { + result += "错误,userId为空"; + } else if (StringUtil.isNullOrEmpty(clientId)) { + result += "错误,clientId为空"; + } else if (StringUtil.isNullOrEmpty(token)) { + result += "错误,token为空"; + } else if(!mLimitCounter.isGranted("verify_token")) { + result += "接口请求超频!接口限制每10秒只能验证一次!"; + } else { + MemorySessionStore.Session session = sessionsStore.getSession(clientId); + if (session == null) { + result += "错误,session不存在。请确认token是从本服务通过getToken接口获取的,另外请确认clientId是否正确"; + } else if (session.getDeleted() == 1) { + result += "错误,session已经被清除,请确认当前客户没有多端登录或者主动退出"; + } else if(!session.getUsername().equals(userId)) { + result += "错误,当前客户端的登录用户不是" + userId + "。这一般发生在当前clientId又为其它用户获取过token"; + } else { + String id = Tokenor.getUserId(token.getBytes()); + if (id == null) { + result += "错误,无效的token"; + } else if(!id.equals(userId)) { + result += "错误,改token是用户" + id + "的"; + } else { + result += "恭喜,您的信息是正确的"; + } + } + } + response.setContent(result); + } + return true; + } +}