Chuyển tới nội dung chính

Phương thức xác thực user

Việc xác thực user được thực hiện thông qua việc gọi getSessionInfo. Khi đó, hệ thống trả về response như sau:

{
"data": {
"admin_id": "2610657154291697119",
"oa_id": "937065556130162365",
"timestamp": 1726111886460,
"user_id": "2610657154291697119"
},
"hmac": "53d2db4972303a9a92e2632f329dc5afc8cae0835f360010e1311665b7171366"
}

Trong đó:

  • data: Đây là dữ liệu chính mà hệ thống trả về, bao gồm các thông tin như oa_id, admin_id, timestamp...
  • hmac: Đây là chuỗi hash mà hệ thống tạo ra dựa trên data và thông tin secretKey của extension. hmac được sử dụng để đảm bảo rằng dữ liệu không bị thay đổi trong quá trình truyền tải.

Phương thức xác thực dữ liệu

Hệ thống tạo ra hmac theo công thức:

hmac = sha256(extensionId + data + secretKey)

Trong đó:

  • extensionId: ID của ứng dụng.
  • data: Dữ liệu data hệ thống trả về. Lưu ý: data cần được sắp xếp theo thứ tự tên trường tăng dần trước khi đưa vào hàm hash.
  • secretKey: Khóa bí mật chỉ của ứng dụng.

Hướng dẫn xác thực dữ liệu

Các bước thực hiện

  1. Sắp xếp các trường trong data
  2. Tạo HMAC, sử dụng công thức sau:
hmac = sha256(extensionId + jsonData + secretKey)
  1. So sánh hmac Sau khi tạo ra hmac, so sánh nó với giá trị hmac mà hệ thống trả về. Nếu hai giá trị này khớp nhau, dữ liệu là hợp lệ và không bị chỉnh sửa.

Code ví dụ (Java)

public class HMACValidator {

public static String sortJsonByField(String jsonData) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
JsonNode objectNode = mapper.readTree(jsonData);

TreeMap<String, Object> sortedMap = new TreeMap<>();
objectNode.fields().forEachRemaining(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

return mapper.writeValueAsString(sortedMap);
}

public static String calculateHMAC(String extensionId, String jsonData, String secretKey) throws Exception {
jsonData = sortJsonByField(jsonData);
String message = extensionId + jsonData + secretKey;

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(message.getBytes(StandardCharsets.UTF_8));

StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}

return hexString.toString();
}
}