# POST /v1/oauth2/token
Возвращает токен доступа и токен обновления.
После того как срок действия токена истек, вы можете получить новый токен, как описано в подразделе Перевыпуск токена доступа ниже.
В запросе необходимо указать HTTP-заголовок Content-type: application/x-www-form-urlencoded
.
# Первоначальное получение токена
POST /v1/oauth2/token
Content-type: application/x-www-form-urlencoded
{
"grant_type": "password",
"scope": "general",
"username": "(string)",
"password" "(string)",
"client_id": "waves.exchange"
}
# Параметры запроса
Имя параметра | Описание |
---|---|
grant_type | Для получения токена в первый раз укажите password |
scope | Укажите general |
username | Публичный ключ пользователя (opens new window) |
password | Сгенерируйте пароль следующим образом: 1. Объедините символ chain ID (opens new window) со строкой client_id и с Unix-временем окончания срока действия токена (в секундах), используя разделитель ':'. Например, W:waves.exchange:1584651600 .2. Преобразуйте полученную строку в последовательность байтов. 3. Добавьте префикс [255, 255, 255, 1]. Сгенерируйте Curve25519 (opens new window)-подпись байтов, используя приватный ключ (opens new window) пользователя. 4. Объедините Unix-время окончания срока действия токена в секундах с подписью в кодировке base58, используя разделитель ':'. Например, 1584651600:3BU36da1h6Bzhs4tKcfkCsXWi4vEgP8eQD7rkGWJdxbRfNpky6p3p7mUJWEL9ejDsasS8nWu1g6tZpsX4 .⚠️ Срок действия токена не должен превышать неделю. См. также подраздел Пример JavaScript ниже. |
client_id | Для Gateway API укажите waves.exchange |
# Пример ответа
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWduYXR1cmUiOiI2MUppRFBQWUZya2pw...",
"token_type": "bearer",
"expires_in": 1584651600,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWduYXR1cmUiOiI2MUppRFBQWUZya2pw..."
}
# Параметры ответа
Имя параметра | Описание |
---|---|
access_token | Токен доступа для использования в запросах к API |
token_type | Тип токена, всегда bearer |
expires_in | Время окончания срока действия токена: Unix-время в секундах |
refresh_token | Токен обновления. После истечения срока действия токена доступа вы можете перевыпустить токен доступа с помощью токена обновления, см. подраздел Перевыпуск токена доступа ниже. Срок действия токена обновления по умолчанию 1 месяц. |
После истечения срока действия токена доступа вы можете обменять токен обновления на новый токен доступа, см. подраздел Обмен токена обновления на новый токен доступа ниже. |
# Пример JavaScript
В этом примере используется библиотека waves-transactions
. См. документацию библиотеки (opens new window) на Github.
import { libs } from "@waves/waves-transactions";
const seed = "insert your seed here";
const chain_code = "W"; // "T" для Testnet
const client_id = "waves.exchange";
const seconds = Math.round((Date.now() + 1000 * 60 * 60 * 24 * 7) / 1000); // Токен на неделю
const bytes = [255, 255, 255, 1, ...libs.crypto.stringToBytes(`${chain_code}:${client_id}:${seconds}`)];
const signature = libs.crypto.signBytes(seed, bytes);
fetch('https://api.waves.exchange/v1/oauth2/token', {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded'
},
body: [
"grant_type=password",
"scope=general",
`username=${encodeURIComponent(libs.crypto.publicKey(seed))}`,
"password=" + encodeURIComponent(`${seconds}:${signature}`),
`client_id=${client_id}`
].join('&')
});
# Пример получения токена через Signer
import { Signer } from '@waves/signer';
import { ProviderWeb } from '@waves.exchange/provider-web';
async function getToken() {
const provider = new ProviderWeb(url, true);
const signer = new Signer({ NODE_URL: node });
signer.setProvider(provider);
const client_id = "waves.exchange";
const chain_code = "W";
const seconds = Math.round((Date.now() + 1000 * 60 * 60 * 24 * 7) / 1000);
const message = `${chain_code}:${client_id}:${seconds}`;
const { publicKey } = await signer.login();
const signature = await signer.signMessage(message);
const url = `https://api.waves.exchange/v1/oauth2/token`;
const data = await fetch(url, {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded'
},
body: [
"grant_type=password",
"scope=general",
`username=${encodeURIComponent(publicKey)}`,
"password=" + encodeURIComponent(`${seconds}:${signature}`),
`client_id=${client_id}`
].join('&')
}).then(result => result.json());
return data.access_token;
}
const token = await getToken();
# Пример получения токена через Metamask Provider
import { Signer } from '@waves/signer';
import { ProviderMetamask } from '@waves/provider-metamask';
import { wavesAddress2eth } from '@waves/node-api-js';
async function getToken() {
const chain_code = "W";
const node = "https://nodes.wavesnodes.com";
const provider = new ProviderMetamask({
wavesConfig: {
nodeUrl: node,
chainId: chain_code.charCodeAt(0)
}
});
const signer = new Signer({ NODE_URL: node });
signer.setProvider(provider);
const client_id = "waves.exchange";
const seconds = Math.round((Date.now() + 1000 * 60 * 60 * 24 * 7) / 1000);
const message = `${chain_code}:${client_id}:${seconds}`;
const user = await signer.login();
const ethereumAddress = wavesAddress2eth(user.address);
const signature = await signer.signMessage(message);
const url = `https://api.waves.exchange/v1/oauth2/token`;
const data = await fetch(url, {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded'
},
body: [
"grant_type=password",
"scope=general",
`username=${encodeURIComponent(ethereumAddress)}`,
"password=" + encodeURIComponent(`${seconds}:${signature}`),
`client_id=${client_id}`
].join('&')
}).then(result => result.json());
return data.access_token;
}
const token = await getToken();
# Перевыпуск токена доступа
POST /v1/oauth2/token
Content-type: application/x-www-form-urlencoded
{
"grant_type": "refresh_token",
"scope": "general",
"client_id": "waves.exchange",
"refresh_token": "(string)"
}
# Параметры запроса
Имя параметра | Описание |
---|---|
grant_type | Для обмена токена обновления на токен доступа укажите refresh_token |
scope | Укажите general |
client_id | Для Gateway API укажите waves.exchange |
refresh_token | Токен обновления. После истечения срока действия токена доступа вы можете обменять токен обновления на новый токен доступа |
# Пример ответа
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWduYXR1cmUiOiI2MUppRFBQWUZya2pw...",
"token_type": "bearer",
"expires_in": 1584109637,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWduYXR1cmUiOiI2MUppRFBQWUZya2pw..."
}
Параметры ответа такие же, как описано в подразделе Первоначальное получение токена выше.
# Пример JavaScript
const refresh_token = "insert your refresh token here";
const client_id = "waves.exchange";
fetch('https://api.waves.exchange/v1/oauth2/token', {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded'
},
body: [
"grant_type=refresh_token",
"scope=general",
`refresh_token=${refresh_token}`,
`client_id=${client_id}`
].join('&')
});