인증 토큰 만들고 요청하기(JWT)

OpenAPI를 사용하기 위해서는 API Key(access key, secret key)를 발급받아야 합니다.

OpenAPI를 호출하기 위해선, 발급 받은 access key와 secret key로 jwt 형태의 토큰을 만듭니다.

생성한 jwt를 헤더에 실어 전송합니다.

authorization: Bearer {jwt}

jwt header

{
  "alg": "HS256",
  "typ": "JWT"
}

jwt payload

{
  "access_key": "발급 받은 acccess key (필수)",
  "nonce": "중복 되지 않는 UUID 문자열 (필수)",
  "query_hash": "해싱된 query string (파라미터가 있을 경우 필수)",
  "query_hash_alg": "query_hash를 생성하는 데에 사용한 알고리즘 (기본값 : SHA512)"
}

jwt verify signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  발급 받은 secret key(256-bit-secret)  
) 

예시) 파라미터가 없는 경우 (전체 종목 현재가 조회)

public class GetInexAccount {

  public static void main(String[] args) {
    final String accessKey = "발급 받은 access key";
    final String secretKey = "발급 받은 secret key";
    final String serverUrl = "https://api.inexcoin.com";



    Key key = Keys.hmacShaKeyFor(secretKey.getBytes());
    String jwtToken = Jwts.builder()
        .addClaims(Map.of("access_key", accessKey, "nonce", UUID.randomUUID().toString()))
        .signWith(key)
        .compact();

    try {
      HttpClient client = HttpClientBuilder.create().build();
      HttpGet request = new HttpGet(serverUrl + "/v1/tickers");
      request.setHeader("Content-Type", "application/json");
      request.addHeader("Authorization", String.format("%s %s", "Bearer", jwtToken));

      String responseString = client.execute(request, new BasicHttpClientResponseHandler());
      System.out.println("responseString = " + responseString);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
import requests
import jwt
import uuid
from datetime import datetime, timedelta

access_key = "발급 받은 access key"
secret_key = "발급 받은 secret key"
server_url = "https://api.inexcoin.com"

# Generate a JWT token
payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
}

token = jwt.encode(payload, secret_key, algorithm='HS256')

# Make the request
headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {token}',
}

response = requests.get(f'{server_url}/v1/tickers', headers=headers)

# Print the response
print(f'responseString = {response.text}')
const axios = require('axios');
const jwt = require('jsonwebtoken');
const uuid = require('uuid');

const accessKey = "발급 받은 access key";
const secretKey = "발급 받은 secret key";
const serverUrl = "https://api.inexcoin.com";

// Generate a JWT token
const payload = {
    access_key: accessKey,
    nonce: uuid.v4(),
};

const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });

// Make the request
const headers = {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`,
};

axios.get(`${serverUrl}/v1/tickers`, { headers })
    .then(response => {
        console.log(`responseString = ${response.data}`);
    })
    .catch(error => {
        console.error(error);
    });

예시) 파라미터가 있는 경우

public class GetInexAccount {

  public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    final String accessKey = "발급 받은 access key";
    final String secretKey = "발급 받은 secret key";
    final String serverUrl = "https://api.inexcoin.com?market=BTC&userId=1";


    String queryString = "market=BTC&userId=1";

    MessageDigest md = MessageDigest.getInstance("SHA-512");
    md.update(queryString.getBytes("utf8"));

    String queryHash = String.format("%0128x", new BigInteger(1, md.digest()));

    Key key = Keys.hmacShaKeyFor(secretKey.getBytes());
    String jwtToken = Jwts.builder()
        .addClaims(Map.of("access_key", accessKey, "nonce", UUID.randomUUID().toString()
        , "query_hash", queryHash, "query_hash_alg", "SHA512"))
        .signWith(key)
        .compact();

    try {
      HttpClient client = HttpClientBuilder.create().build();
      HttpGet request = new HttpGet(serverUrl;
      request.setHeader("Content-Type", "application/json");
      request.addHeader("Authorization", String.format("%s %s", "Bearer", jwtToken));

      String responseString = client.execute(request, new BasicHttpClientResponseHandler());
      System.out.println("responseString = " + responseString);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
import hashlib
import jwt
import uuid
import requests
import base64
from jwt.contrib.algorithms.pycrypto import RSAAlgorithm

# Register the RSA algorithm for pyjwt
jwt.register_algorithm('RS512', RSAAlgorithm(RSAAlgorithm.SHA512))

access_key = "발급 받은 access key"
secret_key = "발급 받은 secret key"
server_url = "https://api.inexcoin.com?market=BTC&userId=1"

queryString = "market=BTC&userId=1"

# Generate SHA-512 hash of the query string
query_hash = hashlib.sha512(queryString.encode('utf-8')).hexdigest()

# Prepare the JWT token
payload = {
    'access_key': access_key,
    'nonce': str(uuid.uuid4()),
    'query_hash': query_hash,
    'query_hash_alg': 'SHA512'
}

# Note: This assumes HMAC SHA256 for signing. Adjust accordingly if using a different algorithm.
token = jwt.encode(payload, secret_key, algorithm='HS256')

headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {token}',
}

try:
    response = requests.get(f'{server_url}', headers=headers)
    print(f'responseString = {response.text}')
except Exception as e:
    print(e)
const axios = require('axios');
const jwt = require('jsonwebtoken');
const crypto = require('crypto');
const uuid = require('uuid');

const accessKey = "발급 받은 access key";
const secretKey = "발급 받은 secret key";
const serverUrl = "https://api.inexcoin.com?market=BTC&userId=1";

const queryString = "market=BTC&userId=1";

// Generate SHA-512 hash of the query string
const queryHash = crypto.createHash('sha512').update(queryString).digest('hex');

// Prepare the JWT token
const payload = {
    access_key: accessKey,
    nonce: uuid.v4(),
    query_hash: queryHash,
    query_hash_alg: 'SHA512',
};

const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });

const headers = {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`,
};

axios.get(`${serverUrl}/v1/accounts`, { headers })
    .then(response => {
        console.log(`responseString = ${JSON.stringify(response.data)}`);
    })
    .catch(error => {
        console.error(error);
    });