---
title: Membuat token otentikasi JWT untuk digunakan dengan API terbuka
slug: world-sdk-guide-id/membuat-token-otentikasi-jwt-untuk-digunakan-dengan-api-terbuka
docTags: 
createdAt: 2024-09-02T08:34:13.134Z
---

## Format permintaan API terbuka

API terbuka ZEPETO dipanggil melalui HTTP.

Jika ada body dalam permintaan, parameter harus dikirim dalam format JSON.
Contoh jenis konten yang valid ditunjukkan di bawah ini, dan mungkin ada sedikit perbedaan tergantung pada pustaka bahasa pemrograman masing-masing.

```http
Content-Type: application/json; charset=utf-8
```



## Dapatkan Kunci Akses, Kunci Rahasia dari ZEPETO Studio

Sebelum membuat token otentikasi JWT, Anda perlu mendapatkan kunci akses dan kunci rahasia dari konsol ZEPETO Studio.

:::hint{type="info"}
**📘&#x20;**&#x53;ilakan merujuk ke panduan berikut. [Mengelola API Terbuka](docId\:lxLOhF5Oe_q-BTtonuHIS)&#x20;
:::



## Membuat token otentikasi JWT

API terbuka ZEPETO menghasilkan token format JWT([https://jwt.io](https://jwt.io)) berdasarkan kunci akses dan kunci rahasia yang dikeluarkan untuk setiap permintaan dan mengirimkannya dalam header Otorisasi.

HS256 disarankan sebagai metode tanda tangan, dan rahasia yang digunakan untuk penandatanganan adalah kunci rahasia yang dikeluarkan.

Payload token JWT memiliki format berikut:

:::CodeblockTabs
Payload token JWT

```java
{
    "access_key": "kunci akses yang diterbitkan (diperlukan)",
    "nonce": "Nilai UUID yang diacak (diperlukan)",
    "uri_hash": "Nilai yang di-hash dari URI, termasuk parameter kueri, kecuali jalur dasar (diperlukan)",
    "body_hash": "nilai yang di-hash dari body permintaan"
}
```
:::



- uri\_hash adalah nilai yang di-hash dari uri termasuk parameter kueri kecuali jalur dasar.
- body\_hash adalah nilai yang dikonversi menjadi string json dan di-hash untuk dimasukkan ke dalam payload hanya ketika body permintaan ada; itu diabaikan jika tidak ada body permintaan.
  - Dalam hal ini, tidak boleh ada spasi antara kunci dan nilai string json.
- uri\_hash dan body\_hash harus di-hash ke nilai yang sama seperti parameter kueri dan body permintaan yang dikirim ke permintaan. (Urutan nilai juga harus identik.)

:::hint{type="danger"}
* Batas jumlah panggilan API: Hingga 300 panggilan tersedia dalam 1 menit.
:::



## Contoh ketika tidak ada body permintaan

Silakan masukkan kunci akses, kunci rahasia, worldld, uri, dan parameter kueri sesuai dengan API yang ingin Anda gunakan.

Kode contoh di bawah ini telah ditulis berdasarkan API Data Pemain dari kategori DataStorage.

### Java

```java
String accessKey = "accessKey";
String secretKey = "secretKey";
 
String worldId = "com.test.world";
String uri = "/datastorage/v1/worlds/" + worldId + "/player-data";
 
MessageDigest uriHash = MessageDigest.getInstance("SHA-256");
uriHash.update(uri.getBytes(StandardCharsets.UTF_8));
byte[] uriHashBytes = uriHash.digest();
 
ObjectMapper objectMapper = new ObjectMapper();
 
Map<String, Object> payload = new HashMap<>();
payload.put("access_key", accessKey);
payload.put("nonce", UUID.randomUUID().toString());
payload.put("uri_hash", new String(Base64.encodeBase64(uriHashBytes), StandardCharsets.UTF_8));
 
String jwtToken = Jwts.builder()
                    .setPayload(objectMapper.writeValueAsString(payload))
                    .signWith(SignatureAlgorithm.HS256, secretKey.getBytes(StandardCharsets.UTF_8))
                    .compact();
 
String authorization = "Bearer " + jwtToken;
```



### Python

```python
import jwt
import uuid
import hashlib
import base64
 
accessKey = 'accessKey'
secretKey = 'secretKey'
 
worldId = 'com.test.world'
uri = '/datastorage/v1/worlds/' + worldId + '/player-data?playerId=testplayerid&keys=test'
hash = hashlib.sha256()
hash.update(uri.encode())
 
payload = {
    'access_key': accessKey,
    'nonce': str(uuid.uuid4()),
    'uri_hash': base64.b64encode(hash.digest()).decode('utf8')
}
 
jwt_token = jwt.encode(payload, secretKey)
authorization = 'Bearer {}'.format(jwt_token)
```



### NodeJS

```typescript
import * as jwt from 'jsonwebtoken';
import * as uuid from 'uuid';
import * as crypto from 'crypto-js';
import { Buffer } from 'safe-buffer';

const accessKey = 'accessKey';
const secretKey = 'secretKey';
const worldId = 'com.test.world';
const uri = '/datastorage/v1/worlds/' + worldId + '/player-data?playerId=testplayerid&keys=test';
const hash = crypto.SHA256(uri);

const payload = {
  access_key: accessKey,
  nonce: uuid.v4(),
  uri_hash: Buffer.from(hash.toString(), 'hex').toString('base64')
};
const jwtToken = jwt.sign(payload, secretKey);
const authorization = `Bearer ${jwtToken}`;

```



## Contoh ketika ada Request Body

Silakan masukkan access key, secret key, worldId, uri, dan parameter body sesuai dengan API yang ingin Anda gunakan.

Kode contoh di bawah ini telah ditulis berdasarkan API Set Player Data dari kategori DataStorage.

### Java

```java
String accessKey = "accessKey";
String secretKey = "secretKey";
 
String worldId = "com.test.world";
String uri = "/datastorage/v1/worlds/" + worldId + "/player-data";
 
MessageDigest uriHash = MessageDigest.getInstance("SHA-256");
uriHash.update(uri.getBytes(StandardCharsets.UTF_8));
byte[] uriHashBytes = uriHash.digest();
 
ObjectMapper objectMapper = new ObjectMapper();
 
PlayerData dataMap = new PlayerData("test", "test value");
 
List<PlayerData> dataList = new ArrayList<>();
dataList.add(dataMap);
 
PlayerDataSetParam param = new PlayerDataSetParam(dataList, "testplayerid");
 
 
MessageDigest paramHash = MessageDigest.getInstance("SHA-256");
paramHash.update(objectMapper.writeValueAsString(param).getBytes(StandardCharsets.UTF_8));
byte[] paramHashBytes = paramHash.digest();
 
Map<String, Object> payload = new HashMap<>();
payload.put("access_key", accessKey);
payload.put("nonce", UUID.randomUUID().toString());
payload.put("uri_hash", new String(Base64.encodeBase64(uriHashBytes), StandardCharsets.UTF_8));
payload.put("body_hash", new String(Base64.encodeBase64(paramHashBytes), StandardCharsets.UTF_8));
 
String jwtToken = Jwts.builder()
                    .setPayload(objectMapper.writeValueAsString(payload))
                    .signWith(SignatureAlgorithm.HS256, secretKey.getBytes(StandardCharsets.UTF_8))
                    .compact();
 
String authorization = "Bearer " + jwtToken;
```



### Python

```python
import jwt
import uuid
import hashlib
import base64
import simplejson as json
 
accessKey = 'accessKey' secretKey = 'secretKey'
 
worldId = 'com.test.world'
uri = '/datastorage/v1/worlds/' + worldId + '/player-data'
hash = hashlib.sha256()
hash.update(uri.encode())
 
param = {
    'playerId': 'testplayerid',
    'data':[
        {
            'key': 'test',
            'value': 'test value'
        }
    ]
}
 
param_hash = hashlib.sha256()
param_hash.update(json.dumps(param, ensure_ascii=False, encoding='surrogatepass').encode())
 
payload = {
    'access_key': accessKey,
    'nonce': str(uuid.uuid4()),
    'uri_hash': base64.b64encode(hash.digest()).decode('utf8'),
    'body_hash': base64.b64encode(param_hash.digest()).decode('utf8')
}
 
jwt_token = jwt.encode(payload, secretKey)
authorization = 'Bearer {}'.format(jwt_token)
```



### NodeJS

```typescript
import * as jwt from 'jsonwebtoken';
import * as uuid from 'uuid';
import * as crypto from 'crypto-js';
import { Buffer } from 'safe-buffer';

const accessKey = 'accessKey';
const secretKey = 'secretKey';
const worldId = 'com.test.world';
const uri = '/datastorage/v1/worlds/' + worldId + '/player-data';
const hash = crypto.SHA256(uri);

const param = {
  playerId: 'testplayerid',
  data: [
    {
      value: 'test value',
      key: 'test'
    }
  ]
};
const paramHash = crypto.SHA256(JSON.stringify(param,null,0));

const payload = {
  access_key: accessKey,
  nonce: uuid.v4(),
  uri_hash: Buffer.from(hash.toString(), 'hex').toString('base64'),
  body_hash: Buffer.from(paramHash.toString(), 'hex').toString('base64')
};
const jwtToken = jwt.sign(payload, secretKey);
const authorization = `Bearer ${jwtToken}`;
```



##

:::hint{type="danger"}
❗️ **Perhatian**

- OpenAPI adalah fitur yang disediakan untuk digunakan di web atau aplikasi terpisah.
- Saat ini, skrip server ZEPETO tidak dapat melakukan panggilan ZEPETO Open API.
- Jika Anda ingin melakukan panggilan Open API di ZEPETO multiplayer, kami menyarankan metode berikut:
  - Siapkan server terpisah untuk melakukan logika bisnis yang diperlukan dengan berkomunikasi dengan Open API.
  - Gunakan paket httpService di server ZEPETO untuk berkomunikasi langsung dengan server yang telah Anda siapkan.
  - Terapkan metode otentikasi yang relatif sederhana antara server, seperti menggunakan header HTTP Authorize, untuk memungkinkan panggilan dalam fitur yang didukung oleh server ZEPETO.
:::

