Проверка взаимодействий в Discord java

Я пытаюсь создать бессерверного бота раздора, используя java 11. Discord документация не дает никакого примера с точки зрения проверки в java. Я нашел Java-библиотека, который может здесь помочь, но у меня мало опыта в этой области, и мой код всегда приводит к ошибке проверки. Кто-нибудь укажет мне, что я делаю неправильно во время этой проверки?

SecretKey key = Crypto.authKey(fromHex("<MY APPLICATION PUBLIC KEY>"));
String message = x_signature_timestamp + event.get("body");
boolean verified = Crypto.authVerify(key,message.getBytes(),fromHex(x_signature_ed25519));

и

public static byte[] fromHex(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

я всегда получаю это при добавлении взаимодействий endopint urldiscord appication interactions endopint

ответ я посылаю:

if (!verified){
    response = ApiGatewayResponse.builder()
             .withHeaders(headers)
             .withBody("validation failed")
             .withStatusCode(401)
             .build();
} else {
    response = ApiGatewayResponse.builder()
            .withHeaders(headers)
            .withBody(event.get("body").toString())
            .withStatusCode(200)
            .build();
}
return response;
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С соленым кофе требуемая проверка Ed25519 может быть выполнена под Java (11)!

Со следующими тестовыми данными успешная проверка может быть выполнена с использованием твитнакл и кода NodeJS, который вы связали:

const nacl = require('tweetnacl');

const PUBLIC_KEY = "9c7d775851a98ceb09a80928c1f8ff56706a0f5d91d841c72850fcd92e065b8f"; // 'APPLICATION_PUBLIC_KEY'

const signature = "99c4903df0b00ac32ba158db956ee39586adf05fea6be714055ac79a80bfd9dff59399b7da01ced95d0a252daee6bdb07e5f59cc546322bb779fd749b04f170c"; // req.get('X-Signature-Ed25519')
const timestamp = '202204091535'; // req.get('X-Signature-Timestamp')
const body = 'testmessage'; // req.rawBody

const isVerified = nacl.sign.detached.verify(
  Buffer.from(timestamp + body),
  Buffer.from(signature, 'hex'),
  Buffer.from(PUBLIC_KEY, 'hex')
);

console.log(isVerified); // true

Аналоговый Java-код с соленый кофе, обеспечивающий успешную проверку:

import java.nio.charset.StandardCharsets;
import software.pando.crypto.nacl.Crypto;
...
String PUBLIC_KEY = "9c7d775851a98ceb09a80928c1f8ff56706a0f5d91d841c72850fcd92e065b8f";

String signature = "99c4903df0b00ac32ba158db956ee39586adf05fea6be714055ac79a80bfd9dff59399b7da01ced95d0a252daee6bdb07e5f59cc546322bb779fd749b04f170c";
String timestamp = "202204091535";
String body = "testmessage";

boolean isVerified = Crypto.signVerify(
      Crypto.signingPublicKey(fromHex(PUBLIC_KEY)), 
      (timestamp + body).getBytes(StandardCharsets.UTF_8), 
      fromHex(signature));

System.out.println(isVerified); // true

Обратите внимание, что проверка должна выполняться с Crypto.signVerify(), а не с Crypto.authVerify().

Другие вопросы по теме