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

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

OpenAPI를 호출하기 위해선, 발급 받은 access keysecret keyjwt 형태의 토큰을 만듭니다.

생성한 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);
    });