API bitzlato

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Всем ку.
Кто нибудь создавал через API чеки, суть в том что на сайте bitzlato нету в документации данного запроса, кидают в поддержке (и он на самом деле работает, как то же они своего бота сделали)
98629

Перепробовал разное:
98630
98631



И все в таком духе ответ пустота
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 566
Благодарностей
1 169
Баллы
113
Вроде в заголовках первой строкой всегда должен быть UA. Не знаю, в этом ли проблема, но, как минимум, его точно не хватает.
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Вроде в заголовках первой строкой всегда должен быть UA. Не знаю, в этом ли проблема, но, как минимум, его точно не хватает.
Уточните пожалуйста, чего не хватает и как его прописать?
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Вроде в заголовках первой строкой всегда должен быть UA. Не знаю, в этом ли проблема, но, как минимум, его точно не хватает.
Просто есть догатка, что токин выдаётся:
3 значения чего-то

И 3 токена, все они прописаны в секрет
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 566
Благодарностей
1 169
Баллы
113
Ну, обычно это как минимум вот так:

98662


Вообще, поэкспериментруй тут
Через Swagger UI. Авторизуешься там, проверяешь запрос, смотришь, что пишет. Там и заголовки будут понятны.
Ну и еще у тебя стоит загружать "только заголовки". Наверное, все-таки содержимое надо. Хотя, в заголовках все равно вряд ли пустота будет при правильном запросе.
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Ну, обычно это как минимум вот так:

Посмотреть вложение 98662

Вообще, поэкспериментруй тут
Через Swagger UI. Авторизуешься там, проверяешь запрос, смотришь, что пишет. Там и заголовки будут понятны.
Ну и еще у тебя стоит загружать "только заголовки". Наверное, все-таки содержимое надо. Хотя, в заголовках все равно вряд ли пустота будет при правильном запросе.
Так там же вроде нет этого запроса
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 566
Благодарностей
1 169
Баллы
113

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 566
Благодарностей
1 169
Баллы
113
Судя по тому, как выглядит секретный ключ, не исключаю, что его сперва куда-нить отправить надо для получение токена.
А токен уже потом передавать в заголовках через
Authorization: Bearer дальше_полученный_токен
Но это не точно...
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Судя по тому, как выглядит секретный ключ, не исключаю, что его сперва куда-нить отправить надо для получение токена.
А токен уже потом передавать в заголовках через
Authorization: Bearer дальше_полученный_токен
Но это не точно...
Мне тоже так показалось, ибо есть запрос где сначало получаешь токен а потом запрос, но и другой момент я на гитхабе чекал там целеком прописан этот секрет в коде
 

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Судя по тому, как выглядит секретный ключ, не исключаю, что его сперва куда-нить отправить надо для получение токена.
А токен уже потом передавать в заголовках через
Authorization: Bearer дальше_полученный_токен
Но это не точно...
API:
<?php

требуется один раз ('vendor/autoload.php ');

Хосе  использует \Component\Core \AlgorithmManager;
Хосе  использует \Component\Core \ JWK;
Хосе  использует \Component\Signature\Algorithm\ ES256;
Хосе  использует \Component\Signature\Algorithm\PS256;
Хосе  использует \ Easy \Build;

// secret user key | секретный ключ пользователя
$SecretKey = '
        {
 "kty": "EC", "alg": "ES256", "crv": "P-256",
 "x": "pSH0jvbtVZiseTpJZk0_yfudEIv86uwjeH_gr1qmOGA",
 "y": "eGdC9EIGmhCheM_T8vhS4Qwk7RfaPRBxF3W5omgBc_M",
 "d": "DuSjR5eZBp5S-9HNKA8kRQFA_3Akkept-dTbwFoq_3w"
        }
';

// create jwk instance from given secret user key | создаем экземпляр jwk из полученного секретного пользовательского ключа
$ es256 = новый  ES256();
$jwk = JWK::createFromJson($SecretKey);
$am = новый  AlgorithmManager([$es256]);

// We build token with user claims | Собираем токен с пользовательскими claim
$jws = Build::jws() // Мы создаем JWS
 -> iat(время ())
 ->jti(rand())
 -> alg($ es256)
 -> aud('usr')
    // идентификатор пользователя, один из: адрес электронной почты, uid (идентификатор пользователя), тема, tgid (идентификатор телеграммы)
    // идентификатор пользователя, одно из: email, uid (user id), subject, tgid (telegram id)
    // Email не будет работать, если у пользователя две учетные записи с одним и тем же адресом электронной почты, в таком случае предпочтительнее идентификатор пользователя (uid).
    // Email не будет работать в случае если у пользователя два аккаунта с один и тем же email (auth0 & google)
    // Используйте uid в таких случаях
 -> претензия ('email', '[email protected] ')
    // Вы опускаете этот заголовок, если у учетной записи есть один ключ
    // Этот заголовок можно не указывать, если у аккаунта единственный ключ
 -> заголовок ('kid', '2')
 ->подписать ($jwk) // Подписать токен с заданным JWK
;

эхо "JWT:" . $ jws . "\n";

// initialize curl for future usage | инициализируем curl для последующего использования
$curl = curl_init();

// set options for curl connection | устанавлием параметры для curl соединения
curl_setopt_array($curl, [
    // включить отображение результатов
    CURLOPT_RETURNTRANSFER => 1,
    // url of request || url запроса
    CURLOPT_URL => 'https://www.bitzlato.com/api/auth/whoami ',
    // adding token to headers | добавляем токен в заголовки
    CURLOPT_HTTPHEADER => массив(
 "Авторизация: предъявитель $ jws"
    )
]);
// save response to value | сохраняем ответ в переменную
$response = curl_exec($curl);

// receive code of response | получаем код ответа
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

// close connection | закрываем соединение
curl_close($curl);

// displaying result | выводим результат
эхо-код $  httpcode . ' ' . $ответ;
 
Последнее редактирование:

_HEDELKA_

Client
Регистрация
20.02.2022
Сообщения
648
Благодарностей
170
Баллы
43
Кто знает java
Подскажите как составить запрос из секретного ключа получить токен, вообще не понимаю что в этом коде написано (кубик GET или POST)
Получение токена:
package com.bitzlato.auth.examples;

import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.crypto.ECDSASigner;
import com.nimbusds.jose.jwk.ECKey;
import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.SignedJWT;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.text.ParseException;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;

import static com.nimbusds.jose.JWSAlgorithm.ES256;
import static java.lang.Character.MAX_RADIX;
import static java.net.http.HttpClient.Version;
import static java.net.http.HttpClient.newBuilder;

public class Connect {

    static class TokenGenerator implements Supplier<String> {
        /**
         * This is your private key. This key has id = 1 (kid)
         */
        private final String jsonWebKey = "{" +
                "\"kty\":\"EC\",\"alg\":\"ES256\",\"crv\":\"P-256\"," +
                "\"x\":\"pSH0jvbtVZiseTpJZk0_yfudEIv86uwjeH_gr1qmOGA\"," +
                "\"y\":\"eGdC9EIGmhCheM_T8vhS4Qwk7RfaPRBxF3W5omgBc_M\"," +
                "\"d\":\"DuSjR5eZBp5S-9HNKA8kRQFA_3Akkept-dTbwFoq_3w\"" +
                "}";

        private final JWSHeader jwsHeader = new JWSHeader.Builder(ES256)
                // You must provide the correct kid if an account has more than one key
                // see https://tools.ietf.org/html/rfc7515#section-4.1.4
                .keyID("1")
                .build();

        private final ECDSASigner signer;

        {
            try {
                signer = new ECDSASigner(ECKey.parse(jsonWebKey));
            } catch (ParseException | JOSEException e) {
                throw new IllegalArgumentException(e);
            }
        }

        private final Random rnd = new Random();

        @Override
        public String get() {
            final var claims = new JWTClaimsSet.Builder()
                    .audience("usr")
                    .jwtID(Long.toString(rnd.nextLong(), MAX_RADIX))
                    .issueTime(Date.from(Instant.now()))
                    // choose one of methods of user identification

                    // By email
                    // Note: won't work if ones' has two accounts with the same email.
                    // .claim("email", uniqueEmail)

                    // always works: `User Id`
                    .claim("uid", 13491868)

                    // telegram id -- if you have it (and know),
                    // note that telegram and web accounts are not necessarily same
                    // (you should perform accounts merge, to accomplish that)
                    // .claim("tgid", 10004389385)
                    .build();


            try {
                final var jwt = new SignedJWT(jwsHeader, claims);
                jwt.sign(signer);
                final var jwtString = jwt.serialize();
                System.out.println("JWT=" + jwtString);
                return jwtString;
            } catch (JOSEException e) {
                throw new IllegalStateException(e);
            }
        }
    }


    private static final URI baseUrl = URI.create("https://www.bitzlato.com/api/p2p/");

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        final var tokenGen = new TokenGenerator();

        final var client = newBuilder().version(Version.HTTP_2).build();


        final var req = HttpRequest.newBuilder()
                .uri(baseUrl.resolve("wallets/v2/"))
                .timeout(Duration.ofSeconds(5))
                .header("Authorization", "Bearer " + tokenGen.get())
                .GET()
                .build();
        System.out.println("Request=" + req.toString());

        client.sendAsync(req, BodyHandlers.ofString())
                .thenApply(response -> {
                    System.out.println(response.statusCode());
                    return response;
                } )
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println)
        .get();
    }
}
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 328
Благодарностей
899
Баллы
113
Алгоритмом подписываются входные данные и полученное значение передаётся в заголовке Authorization.
В данном случае используется JWT аутентификация.

 
Последнее редактирование:

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)