403 Код ответа - входы правильные? - PullRequest
0 голосов
/ 03 июня 2018

Не уверен, сколько из вас знакомо с API Bukkit / Mojang, однако, с этим я и работаю сегодня.Хотя я не верю, что это подойдет для решения этой проблемы, поскольку кажется, что она является собственной проблемой.

Я подключаюсь к службе аутентификации, следуя вики-аутентификации Mojang: http://wiki.vg/Authentication#Authenticate

InВ моем коде «MinecraftAccount» - это просто объект, представляющий полезную нагрузку в приведенной выше ссылке, которую я сериализирую с GSON.

Затем я хочу получить ответный ответ, полученный со свойствами, которые вы также можете найти вссылка выше.Я использую другой объект для хранения значений json и десериализации его с помощью Json (AuthResponse).

Кажется, я все делаю правильно, но получаю ошибку 403.Я не уверен почему, потому что после нескольких попыток сделать это правильно, это сработало, а затем спонтанно начало выплевывать 403 снова.Надеюсь, что вы, ребята, сможете увидеть проблему здесь.

public String getAuthToken(MinecraftAccount minecraftAccount) {
    try {
        HttpURLConnection httpURLConnection = Webs.getConnection("https://authserver.mojang.com/authenticate");
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setDoOutput(true);
        httpURLConnection.setDoInput(true);
        httpURLConnection.setInstanceFollowRedirects(false);
        httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8");
        httpURLConnection.setRequestProperty("Content-Type", "application/json");
        httpURLConnection.setUseCaches(false);

        httpURLConnection.addRequestProperty("User-Agent", "Mozilla/4.0");

        IOUtils.write(GsonProvider.standard().toJson(minecraftAccount), httpURLConnection.getOutputStream(), StandardCharsets.UTF_8);
        return GsonProvider.standard().fromJson(IOUtils.toString(httpURLConnection.getInputStream(), StandardCharsets.UTF_8), AuthResponse.class).getAccessToken();
    } catch (IOException exception) {
        exception.printStackTrace();
    }
    return null;
}

    public void uploadSkin(UUID uuid, String url, boolean normal) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(ImageIO.read(new URL(url)), "png", baos);

        String authenticityToken = this.getAuthToken(this.minecraftAccount);

        try {
            System.out.println("Token: " + authenticityToken);

            if (authenticityToken == null) {
                return;
            }

            HttpURLConnection httpURLConnection = Webs.getConnection(String.format(UPLOAD_SKIN_URL, UUIDTypeAdapter.fromUUID(uuid)));
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);

            httpURLConnection.addRequestProperty("Authorization", "Bearer " + authenticityToken);
            try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURLConnection.getOutputStream(), StandardCharsets.UTF_8))) {
                writer.write("model=");
                if (!normal) {
                    writer.write("slim");
                }

                writer.write("&url=" + UrlEscapers.urlPathSegmentEscaper().escape(url));
                System.out.println("status: " + httpURLConnection.getResponseMessage() + "(" + httpURLConnection.getResponseCode() + ")");
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }

    } catch (IOException exception) {
        exception.printStackTrace();
    }
}

Webs # getConnection - это просто (используя Proxy.NO_PROXY):

    public static HttpURLConnection getConnection(String url, Proxy proxy) throws IOException {
    HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection(proxy);

    httpConnection.setConnectTimeout(TIMEOUT);
    httpConnection.setReadTimeout(2 * TIMEOUT);

    httpConnection.setRequestProperty(HttpHeaders.CONTENT_TYPE, "application/json");
    httpConnection.setRequestProperty(HttpHeaders.USER_AGENT, "Mozilla/5.0");
    return httpConnection;
}

PS: Да, я посмотрел несколькодругие потоки 403, однако, их решения (такие как установка пользовательского агента в качестве исправления) не работают.

В конечном счете, при вызове #uploadSkin не возникает ошибка, он просто возвращает 403 и не даетна самом деле загрузить файл на сайт или что-нибудь.Метод просто выводит это:

Вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...