Files
IM-server-new/VerifyAdminSecretTool.java
T

115 lines
4.4 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Scanner;
/**
* 此工具为验证IM服务管理密钥是否正确的工具。
* 通过手机号查询 Wildfire IM 用户信息,如果能够返回正确信息或者未找到表示密钥正确。
*
* 编译:放到IM服务运行服务器上,执行 javac VerifyAdminSecretTool.java 编译得到 VerifyAdminSecretTool.class,
* 用法:执行 java VerifyAdminSecretTool 按提示输入 IM 服务地址、管理员密钥、电话号码。
* 程序会调用 /admin/user/get_info 接口并打印返回的 JSON。
*/
public class VerifyAdminSecretTool {
private static final SecureRandom RANDOM = new SecureRandom();
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入 IM 服务地址(如 http://192.168.1.100:18080): ");
String serverUrl = scanner.nextLine().trim();
System.out.print("请输入管理员密钥(admin secret): ");
String secret = scanner.nextLine().trim();
System.out.print("请输入电话号码: ");
String mobile = scanner.nextLine().trim();
scanner.close();
if (serverUrl.isEmpty() || secret.isEmpty() || mobile.isEmpty()) {
System.err.println("错误:服务地址、密钥和电话号码均不能为空");
System.exit(1);
}
// 构建请求 URL(去掉末尾可能的 /)
if (serverUrl.endsWith("/")) {
serverUrl = serverUrl.substring(0, serverUrl.length() - 1);
}
String urlStr = serverUrl + "/admin/user/get_info";
// 构建请求体
String jsonBody = "{\"mobile\":\"" + mobile + "\",\"includeDeleted\":false}";
// 生成认证签名
int nonce = RANDOM.nextInt(1000000) + 1;
long timestamp = System.currentTimeMillis();
String signStr = nonce + "|" + secret + "|" + timestamp;
String sign = sha1Hex(signStr);
// 发送 HTTP POST 请求
String response = doPost(urlStr, jsonBody, nonce, timestamp, sign);
// 输出结果
System.out.println("\n===== 返回结果 =====");
System.out.println(response);
}
private static String doPost(String urlStr, String body, int nonce, long timestamp, String sign) throws Exception {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
try {
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("nonce", String.valueOf(nonce));
conn.setRequestProperty("timestamp", String.valueOf(timestamp));
conn.setRequestProperty("sign", sign);
conn.setDoOutput(true);
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
// 写入请求体
try (OutputStream os = conn.getOutputStream()) {
os.write(body.getBytes(StandardCharsets.UTF_8));
os.flush();
}
int responseCode = conn.getResponseCode();
// 读取响应
InputStream is = (responseCode >= 200 && responseCode < 300)
? conn.getInputStream()
: conn.getErrorStream();
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
}
return sb.toString();
} finally {
conn.disconnect();
}
}
private static String sha1Hex(String input) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
}