Marketplace Coop

Авторизация пользователя

Авторизация необходима для получения доступа к данным, которые относятся непосредственно к Вашей организации. Авторизация строится на взаимодействии с Coopenomics, где Вам необходимо предварительно зарегистрироваться и получить имя пользователя ACCOUNT_NAME и приватный ключ PRIVATE_KEY.

Существует два типа пользователя: частное лицо и организация. Вы можете получить ACCESS_TOKEN для любого типа пользователя. Нужно учесть, что некоторые операции, такие как создание организации, департаментов и назначение авторизованных лиц, требуют приватный ключ именно самой организации, а не частного лица.

Для того чтобы получить авторизационный токен необходимо подписать текущую метку времени в формате ISO 8601 для UTC зоны YYYY-MM-DDTHH:MM:SS.000Z. Подписание проводится с использованием приватного ключа организации. Подписание производится на стороне клиента и приватные ключи не передаются по сети.

КОПИРОВАТЬ
      
/* Используется библиотека eosjs_ecc */

/* корректировка для UTС даты (с +3:00 до 0:00) */
const addHours = 3;

const correctedDate = new Date(Date.now() - addHours * (60 * 60 * 1000) ).toISOString();
const signature = eosjs_ecc.sign(correctedDate, PRIVATE_KEY)
      
    
КОПИРОВАТЬ
      
import hashlib
from datetime import datetime, timedelta

#Используется библиотека aioeos
from aioeos.keys import EosKey

#корректировка для UTС даты (с +3:00 до 0:00)
date_utf = datetime.now() - timedelta(hours=3) 

corrected_date = date_utf.isoformat("T", "milliseconds") + 'Z'
priv = EosKey(private_key=PRIVATE_KEY)
digest = hashlib.sha256(corrected_date.encode('utf-8')).digest()
signature = priv.sign(digest)
      
    
Скорректируйте Ваше локальное время в GMT +0.00. Запрос на авторизацию должен быть осуществлен не позднее 60 секунд с момента подписания текущей метки времени.
POST
      
const response = await fetch(ENDPOINT_URL + '/v1/token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: "2024-12-31T23:59:59.000Z",
    public_key: "PUB_2vdgsd...",
    signature: "SIG_K1_KbiL3cwjAmw...",
    account: ACCOUNT_NAME,    
  })
});

const result = await response.json();
      
    
POST
    	
mutation TokenMutation {
  manageAccess(
    message: "2024-12-31T23:59:59.000Z"
    public_key: "PUB_2vdgsd..."
    signature: "SIG_K1_KbiL3cwjAmw..."
    account: ACCOUNT_NAME
  ) {
    data {
      expiration
      id
      token
    }
    ok
  }
}
    	
    

В результате запроса вы получите ACCESS_TOKEN c его сроком действия. Каждый токен содержит уникальный ID, который можно использовать для его удаления и прекращения действия прав доступа.

	
{
  "tokens": [
    "access": {
        "expires": "2025-12-31T23:59:59.000Z",
        "token": ACCESS_TOKEN
    },
    "refresh": {
        "expires": "2025-12-31T23:59:59.000Z",
        "token": REFRESH_TOKEN
    },
  ],
  "token_type": "bearer",
  "id": "GU8tqKBg_YdQTGpAM...",
  "expires_in": 34609347 /* Секунд до окончания срока действия */
}
	

REFRESH_TOKEN необходим для того чтобы обновить ACCESS_TOKEN, который больше не действителен. Таким образом проводится ротация прав доступа для усиления безопасности.

POST
      
const response = await fetch(ENDPOINT_URL + '/v1/token/refresh', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    token: REFRESH_TOKEN
  })
});

const result = await response.json();
      
    
POST
      
mutation TokenMutation {
  refreshAccess(
    token: REFRESH_TOKEN
  ) {
    data {
      expiration
      id
      token
    }
    ok
  }
}
      
    

Все последующие методы являются защищенными и необходимо использовать ACCESS_TOKEN в заголовке "Authorization" каждого запроса:

  
{"Authorization": "Bearer ACCESS_TOKEN"}
  

Информацию о текущем пользователе можно получить с помощью следующего метода:

GET
      
const response = await fetch(ENDPOINT_URL + '/v1/auth/me', {
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ACCESS_TOKEN',
  },
});

const result = await response.json();
      
    
POST
      
      
    

Другие методы, которые могут вам понадобиться указаны в документации Авторизация пользователя

Итак, начнем! Открываем новый магазин с помощью приватных методов.

Подробнее: Organization and Shop Setup