ข้ามไปที่เนื้อหา

การตรวจสอบสิทธิ์แอปและบัญชี

กระบวนการตรวจสอบสิทธิ์ของ cTrader Open API ใช้มาตรฐาน OAuth 2.0

เฟรมเวิร์กนี้ช่วยให้แอปพลิเคชันของบุคคลที่สามสามารถเข้าถึงบริการได้อย่างจำกัด โดยการประสานงานระหว่างเจ้าของทรัพยากรและบริการ หรือโดยอนุญาตให้แอปพลิเคชันของบุคคลที่สามเข้าถึงได้ด้วยตนเอง

ขั้นตอนการตรวจสอบสิทธิ์

ตามมาตรฐาน OAuth 2.0 การตรวจสอบสิทธิ์บัญชีต้องใช้ทั้งรหัสอนุญาตและโทเค็นการเข้าถึง

กำหนดโทเค็น

รหัสอนุญาตคือโทเค็นระยะสั้นที่ออกให้สำหรับ cTID แต่ละรายการ ระยะเวลาหมดอายุคือหนึ่งนาที โทเค็นการเข้าถึงคือโทเค็นระยะยาวที่อนุญาตให้แอปพลิเคชันส่งและรับข้อความไปยังและจาก backend ของ cTrader หลังจากได้รับแล้ว รหัสอนุญาตต้องถูกแลกเปลี่ยนเป็นโทเค็นการเข้าถึงอย่างรวดเร็ว หลังจากนั้นข้อความทั้งหมดที่ส่งไปยัง backend ของ cTrader จะต้องลงนามด้วยโทเค็นการเข้าถึงที่ได้รับเพื่อตรวจสอบสิทธิ์แอปพลิเคชันของคุณ ระยะเวลาหมดอายุของโทเค็นการเข้าถึงคือ 2,628,000 วินาที (ประมาณ 30 วัน) หลังจากหมดอายุแล้ว สามารถสร้างโทเค็นการเข้าถึงใหม่ได้โดยใช้โทเค็นรีเฟรช โทเค็นรีเฟรชไม่มีระยะเวลาหมดอายุ

โดยทั่วไป กระบวนการที่ผู้ใช้ใหม่เริ่มใช้แอปพลิเคชันของคุณเป็นครั้งแรกมีลักษณะดังนี้:

1. ผู้ใช้ที่มี cTID หนึ่งเข้าถึงแอปพลิเคชันของคุณไม่ว่าจะถูกใช้งานที่ใด ผู้ใช้จะโต้ตอบกับปุ่มดำเนินการหรือสิ่งที่เทียบเท่า

2. แอปพลิเคชันใช้เบราว์เซอร์ที่ฝังไว้ (หรือวิธีการอื่นที่เหมาะสม) เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยัง URI เฉพาะที่พวกเขาจะให้สิทธิ์ที่จำเป็นแก่แอป

สร้างความไว้วางใจ

ก่อนเปลี่ยนเส้นทางผู้ใช้ไปยัง URI นี้ ตรวจสอบให้แน่ใจว่าผู้ใช้ไว้วางใจแอปพลิเคชันของคุณและทราบว่าพวกเขาจะต้องให้สิทธิ์เพิ่มเติม

3. ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยัง URL ที่กำหนดไว้ล่วงหน้า URL นี้มีโทเค็นการเข้าถึงเป็นค่าของพารามิเตอร์ code

4. ผู้ใช้จะถูกเปลี่ยนเส้นทางกลับไปยังแอปพลิเคชันด้วยตนเองหรือโดยอัตโนมัติ แอปพลิเคชันจะได้รับทราบค่าของพารามิเตอร์ code

5. แอปพลิเคชันส่งคำขอเพื่อแลกเปลี่ยนรหัสอนุญาตกับโทเค็นการเข้าถึงไปยัง endpoint เฉพาะ

6. แอปพลิเคชันได้รับคำตอบที่มีโทเค็นการเข้าถึงเป็นค่าของคีย์ accessToken

7. แอปพลิเคชันส่งข้อความ ProtoOAApplicationAuthReq ที่มีฟิลด์ clientId และ clientSecret

8. แอปพลิเคชันส่งข้อความ ProtoOAGetAccountListByAccessTokenReq ที่มีฟิลด์ accessToken คำตอบ (ProtoOAGetAccountListByAccessTokenRes) มีฟิลด์ ctidTraderAccountId ที่ซ้ำกัน

9. หลังจากได้รับคำตอบ แอปพลิเคชันส่งข้อความ ProtoOAAccountAuthReq ที่มีฟิลด์ ctidTraderAccountId และ accessToken

หลังจากนั้น ผู้ใช้ควรได้รับการตรวจสอบสิทธิ์ภายใต้บัญชีที่ ctidTraderAccountId ตรงกับ ctidTraderAccountId ที่ให้ไว้ในขั้นตอนที่ 8

แผนภาพด้านล่างอธิบายว่าขั้นตอนพื้นฐานของการตรวจสอบสิทธิ์ทำงานอย่างไรจากมุมมองของแอปพลิเคชัน Open API ของคุณ

graph TB
  A([เปลี่ยนเส้นทางผู้ใช้ไปยัง <br/> URI เฉพาะ]) ==> B([รับรหัสการอนุญาต <br/> ]);
  B ==> C([ส่งคำขอเพื่อรับ <br/> รหัสการเข้าถึง]);
  C ==> D([ส่ง ข้อความ <br/> ProOAApplicationAuthReq <br/> ]);
  D ==> E([ส่ง ข้อความ <br/> ProtoOAAccountAuthReq <br/> ]);

ในส่วนย่อยด้านล่าง เราจะอธิบายขั้นตอนสำคัญของกระบวนการตรวจสอบสิทธิ์อย่างละเอียด

เพิ่ม URI ที่เปลี่ยนเส้นทาง

ดังที่แสดงไว้ก่อนหน้านี้ แอปพลิเคชันของคุณต้องได้รับรหัสอนุญาตหลังจากผู้ใช้ถูกส่งไปยัง URI ที่เปลี่ยนเส้นทางเฉพาะ URI นี้จะรวมรหัสอนุญาตเป็นค่าของพารามิเตอร์ code

เพื่อเพิ่ม URI ที่เปลี่ยนเส้นทางใหม่ ให้ทำดังนี้:

1. เปิดหน้า Applications ในพอร์ทัล Open API

2. เลือกปุ่ม Edit ในแถวที่มีแอปพลิเคชันที่คุณต้องการเพิ่ม URL ที่เปลี่ยนเส้นทาง

3. ในหน้าจอที่ปรากฏขึ้นใหม่ เลื่อนลงไปที่ส่วน Redirect URIs

4. เพิ่ม URL ที่เปลี่ยนเส้นทางในช่องข้อความว่างที่พร้อมใช้งาน หากไม่มีช่องว่างแสดงขึ้น ให้เลือกปุ่ม Add redirect URI

5. เลือกปุ่ม Save ที่ด้านล่างของหน้าเพื่อบันทึกการเปลี่ยนแปลงของคุณ

จัดการ URI ที่เปลี่ยนเส้นทาง

URI ที่เปลี่ยนเส้นทางแรกสุดคือสำหรับบริการ Playground ที่อนุญาตให้คุณทดสอบแอปพลิเคชันของคุณก่อนให้ผู้ใช้ทั่วไปเข้าถึง ห้ามใช้สำหรับแอปพลิเคชันที่ใช้งานจริง คุณสามารถเพิ่ม URI ที่เปลี่ยนเส้นทางได้ไม่จำกัดหากจำเป็น

รับรหัสอนุญาต

เพื่อรับรหัสอนุญาตสำหรับ cTID เฉพาะ แอปพลิเคชันของคุณจะต้องส่งผู้ใช้ไปยัง URI ต่อไปนี้

https://id.ctrader.com/my/settings/openapi/grantingaccess/?client_id={clientId}&redirect_uri={your_redirectURI}&scope={scope}&product=web

หมายเหตุ

ในขั้นตอนนี้ ผู้ใช้จะต้องอนุญาตให้แอปพลิเคชันหรือบริการของคุณเข้าถึงบัญชีเทรดของพวกเขา ดังนั้น จึงจำเป็นอย่างยิ่งที่คุณต้องให้ผู้ใช้เข้าใจอย่างเต็มที่ว่าการใช้แอปพลิเคชันหรือบริการของคุณจะต้องใช้สิทธิ์ใดบ้าง เกี่ยวกับการจัดเก็บข้อมูลและการประมวลผลข้อมูล

URI นี้มีพารามิเตอร์คำถามต่อไปนี้

พารามิเตอร์ จำเป็นหรือไม่? คำจำกัดความ
client_id ใช่ ตัวระบุเฉพาะของแอปพลิเคชัน Open API ของคุณ
redirect_uri ใช่ URI ที่เปลี่ยนเส้นทางที่ถูกต้องที่ระบุในการตั้งค่าของแอปพลิเคชันของคุณ
scope ใช่ ขอบเขตของสิทธิ์ที่คุณต้องการให้แอปพลิเคชันของคุณ ค่าต่อไปนี้ได้รับการยอมรับ:
accounts ให้สิทธิ์การเข้าถึงแบบอ่านอย่างเดียว แอปพลิเคชันของคุณจะสามารถเข้าถึงข้อมูลและสถิติของบัญชีได้ แต่จะไม่สามารถดำเนินการเทรดได้
trading. ให้สิทธิ์การเข้าถึงเต็มที่ทั้งข้อมูลและสถิติของบัญชีรวมถึงการดำเนินการเทรดที่ได้รับอนุญาตทั้งหมด
product ไม่ใช่ หากระบุพารามิเตอร์นี้และตั้งค่าเป็น web หน้าจอการอนุญาตจะไม่มีส่วนหัวและส่วนท้าย ซึ่งทำให้ดูดีขึ้นบนอุปกรณ์มือถือ แม้ว่าพารามิเตอร์นี้จะเป็นทางเลือก แต่เราขอแนะนำให้ตั้งค่าเป็น web

เพื่อดู client_id ของคุณ ไปที่หน้า Applications และเลือกปุ่ม View ในคอลัมน์ Credentials

หลังจากผู้ใช้ถูกส่งไปยัง URI ด้านบน (และตราบใดที่ทั้งสองพารามิเตอร์ถูกต้อง) พวกเขาควรเห็นหน้าจอเข้าสู่ระบบ/สมัครสมาชิกที่ขอให้พวกเขาอนุญาตภายใต้ cTID ของพวกเขา หลังจากนั้น ผู้ใช้จะเห็นกล่องโต้ตอบที่พวกเขาจะสามารถอนุญาตให้แอปพลิเคชันเข้าถึงบัญชีหนึ่งบัญชีหรือมากกว่าที่เชื่อมโยงกับ cTID ของพวกเขา

เมื่อผู้ใช้เลือกปุ่ม Allow access พวกเขาจะถูกเปลี่ยนเส้นทางกลับไปยัง redirect_uri ที่คุณระบุไว้เดิม ดังที่แสดงในตัวอย่างด้านล่าง รหัสอนุญาตจะถูกเพิ่มเข้าไปใน URI นี้เป็นพารามิเตอร์คำถาม

https://my-redirect-uri.com/?code=123ASDASffdg_as234_GCllkoq14adRB7_tvN

ณ จุดนี้ แอปพลิเคชันของคุณจะต้องเข้าถึงและเก็บค่าของพารามิเตอร์ code จะต้องถูกแลกเปลี่ยนเป็นโทเค็นการเข้าถึงอย่างรวดเร็วก่อนที่รหัสอนุญาตจะหมดอายุ

บัญชีเพิ่มเติม

หากผู้ใช้สร้างบัญชีเพิ่มเติมหลังจากดำเนินการตามขั้นตอนที่อธิบายไว้ข้างต้น บัญชีเหล่านี้จะไม่ได้รับการตรวจสอบสิทธิ์ภายในแอปพลิเคชัน แทนที่ ผู้ใช้จะต้องถูกเปลี่ยนเส้นทางกลับไปยัง URL ที่ให้ไว้ด้านบนเพื่อให้พวกเขาสามารถให้แอปพลิเคชันเข้าถึงบัญชีเพิ่มเติมใดๆ ที่พวกเขาได้สร้างขึ้นตั้งแต่เข้าสู่ระบบครั้งล่าสุด

การตรวจสอบสิทธิ์ผ่าน Google

หาก URI ด้านบนถูกเปิดผ่าน WebView และผู้ใช้เลือก Google เพื่อเข้าสู่ระบบ Google จะแสดงหน้า Access blocked ซึ่งป้องกันไม่ให้ผู้ใช้ดำเนินการต่อไป

เพื่อป้องกันสิ่งนี้ ตรวจสอบให้แน่ใจว่าลายเซ็น user-agent ของอุปกรณ์ที่เปิดหน้าดูเหมือนดังนี้

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'

รับโทเค็นการเข้าถึง

เพื่อรับโทเค็นการเข้าถึง ให้ทำการเรียก REST API ต่อไปนี้

URL ที่เกี่ยวข้อง

URL คำขอเกี่ยวข้องกับ https://openapi.ctrader.com

วิธีการ URL
GET apps/token

คำขอนี้รวมพารามิเตอร์คำถามต่อไปนี้

พารามิเตอร์ จำเป็นหรือไม่? คำจำกัดความ
grant_type ใช่ ประเภทของโทเค็นที่ส่งไปยัง endpoint นี้ ค่าต่อไปนี้ได้รับการยอมรับ.
authorization_code. ส่งรหัสอนุญาตไปยัง endpoint เพื่อแลกเปลี่ยนเป็นโทเค็นการเข้าถึง.
refresh_token. ส่งโทเค็นรีเฟรชไปยัง endpoint เพื่อรีเฟรชโทเค็นการเข้าถึงที่มีอยู่
code ไม่ใช่ โทเค็นที่ส่งไปยัง endpoint พารามิเตอร์นี้จำเป็นหาก grant_type=authorization_code
redirect_uri ไม่ใช่ URI ที่เปลี่ยนเส้นทางที่ถูกต้องที่ระบุในการตั้งค่าของแอปพลิเคชันของคุณ พารามิเตอร์นี้จำเป็นหาก grant_type=authorization_code
client_id ใช่ ตัวระบุเฉพาะของแอปพลิเคชัน Open API ของคุณ
client_secret ใช่ คีย์ลับที่กำหนดให้กับแอปพลิเคชัน Open API ของคุณ

ตัวอย่างคำขอสามารถพบได้ด้านล่าง

curl -X GET 'https://openapi.ctrader.com/apps/token?grant_type=authorization_code&code=0ssdgds98as9_QSF56FVC_22dfdf&redirect_uri=https://spotware.com&client_id=5430012&client_secret=012sds23dlkjQsd' -H 'Accept: application/json' -H 'Content-Type: application/json'

เพื่อดู client_secret ของคุณ กลับไปที่หน้า Applications และเลือกปุ่ม View ในคอลัมน์ Credentials

เมื่อคำขอสำเร็จ คุณควรได้รับคำตอบที่มีคีย์ต่อไปนี้

คีย์ ประเภทค่า คำจำกัดความ
"accessToken" สตริง โทเค็นการเข้าถึงที่แอปพลิเคชันของคุณจะใช้เพื่อตรวจสอบสิทธิ์ข้อความที่ส่งไปยัง cTrader Open API
"tokenType" สตริง ประเภทของโทเค็นการเข้าถึง (bearer"" ควรเป็นค่าของคีย์นี้เนื่องจากใช้มาตรฐาน REST เพื่อทำคำขอ)
"expiresIn" integer จำนวนวินาทีที่ต้องผ่านไปก่อนที่โทเค็นการเข้าถึงจะหมดอายุ (โดยค่าเริ่มต้น ค่าของคีย์นี้เท่ากับ 2628000)
"refreshToken" สตริง โทเค็นรีเฟรชที่ต้องใช้สำหรับการต่ออายุโทเค็นการเข้าถึงเมื่อหมดอายุ โทเค็นรีเฟรชไม่มีเวลาหมดอายุเอง
"errorCode" string/null รหัสข้อผิดพลาดที่อธิบายสาเหตุที่คำขอไม่สำเร็จ สำหรับคำขอที่สำเร็จ ค่าของคีย์นี้ควรเป็น null
"description" string/null คำอธิบายของข้อผิดพลาดที่เกิดขึ้นระหว่างคำขอที่ไม่สำเร็จ สำหรับคำขอที่สำเร็จ ค่าของคีย์นี้ควรเป็น null

สำหรับตัวอย่างการตอบกลับที่สำเร็จ โปรดดูตัวอย่างด้านล่าง

{
    "accessToken":"mos8Bw3D4EG0fRPd4Eqq0JxaFT4zjd8e4YijNezh_ag",
    "tokenType":"bearer",
    "expiresIn":2628000,
    "refreshToken":"VCuafFhy81AFZjsWkbuEzdOhhRj5YTWz8fWUwHam7KM",
    "errorCode":null,
    "description":null,
}

ส่งข้อความ ProtoBuf ที่จำเป็น

หลังจากได้รับรหัสการเข้าถึงที่ถูกต้อง แอปพลิเคชันของคุณจะต้องส่งข้อความ ProtoOAApplicationAuthReq, ProtoOAGetAccountListByAccessTokenReq และ ProtoOAAccountAuthReq สามารถทำได้ดังนี้

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private static RepeatedField<ProtoOACtidTraderAccount> _ctidTraderAccounts;

List<IDisposable> _disposables = new();
_disposables.Add(_client.OfType<ProtoOAGetAccountListByAccessTokenRes>().Subscribe(OnAccountIdReceived));

private static void OnAccountIdReceived(ProtoOAGetAccountListByAccessTokenRes response)
{

    Console.WriteLine($"\nMessage Received:\n{response}");

    _ctidTraderAccounts = response.CtidTraderAccount;

    var accountAuthReq = new ProtoOAAccountAuthReq
    {
        CtidTraderAccountId = (long)_ctidTraderAccounts[0].CtidTraderAccountId,
        AccessToken = _token.AccessToken,
    };

    _client.SendMessage(accountAuthReq);

}

var _client = new OpenClient(host, ApiInfo.Port, TimeSpan.FromSeconds(10), useWebSocket: false);
var applicationAuthReq = new ProtoOAApplicationAuthReq
{
    ClientId = {your_client_id}, // Add your client ID here
    ClientSecret = {your_app_secret}, // Add your app secret here
};
await _client.SendMessage(applicationAuthReq);
await Task.Delay(5000);
var getAccountListByAccessToken = new ProtoOAGetAccountListByAccessTokenReq 
{
    AccessToken = {access_token} // Add your access token here
}
var accountAuthReq = new ProtoOAAccountAuthReq 
{
    ctidTraderAccountId = {account_id}, // Add the ctidTraderAccountId of the account you want to authorize here
    AccessToken = {access_token} // Add your access token here
};
await _client.SendMessage(accountAuthReq);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
currentAccountId = None
client = Client(EndPoints.PROTOBUF_LIVE_HOST if hostType.lower() == "live" else EndPoints.PROTOBUF_DEMO_HOST, EndPoints.PROTOBUF_PORT, TcpProtocol)

def connected(client): # Callback for client connection
    print("\nConnected")
    request = ProtoOAApplicationAuthReq()
    request.clientId = appClientId
    request.clientSecret = appClientSecret
    deferred = client.send(request)



def disconnected(client, reason): # Callback for client disconnection
    print("\nDisconnected: ", reason)

def onMessageReceived(client, message): # Callback for receiving all messages
    global currentAccountId
    if message.payloadType in [ProtoOASubscribeSpotsRes().payloadType, ProtoOAAccountLogoutRes().payloadType, ProtoHeartbeatEvent().payloadType]:
        return
    elif message.payloadType == ProtoOAApplicationAuthRes().payloadType:
        print("API Application authorized\n")
        if currentAccountId is not None:
            sendProtoOAAccountAuthReq()
            return
        accountListReq = ProtoOAGetAccountListByAccessTokenReq()
        accountListReq.accessToken = accessToken
        deferred = client.send(accountListReq)
    elif message.payloadType == ProtoOAGetAccountListByAccessTokenRes().payloadType:
        protoOAGetAccountListByAccessTokenRes = Protobuf.extract(message)
        currentAccountId = int(protoOAGetAccountListByAccessTokenRes.ctidTraderAccount[0].ctidTraderAccountId)
        accountAuthReq = ProtoOAAccountAuthReq()
        accountAuthReq.ctidTraderAccountId = currentAccountId
        accountAuthReq.accessToken = accessToken
        deferred = client.send(accountAuthReq)
    elif message.payloadType == ProtoOAAccountAuthRes().payloadType:
        protoOAAccountAuthRes = Protobuf.extract(message)
        print(f"Account {protoOAAccountAuthRes.ctidTraderAccountId} has been authorized\n")
        print("This acccount will be used for all future requests\n")
    else:
        print("Message received: \n", Protobuf.extract(message))
    reactor.callLater(3, callable=executeUserCommand)

def onError(failure): # Call back for errors
    print("Message Error: ", failure)
    reactor.callLater(3, callable=executeUserCommand)

รีเฟรชโทเค็นการเข้าถึง

หลังจากโทเค็นการเข้าถึงหมดอายุ คุณจะต้องต่ออายุโดยใช้ refreshToken ที่คุณได้รับก่อนหน้านี้ คุณสามารถดำเนินการนี้ได้ผ่านสองวิธีที่แตกต่างกัน

ส่งคำขอ HTTP

เพื่อรับโทเค็นการเข้าถึงใหม่ (และโทเค็นรีเฟรชใหม่ตามมา) คุณสามารถส่งคำขอ HTTP เดียวกัน ที่กล่าวถึงข้างต้น ดังที่แสดงในตัวอย่างด้านล่าง คุณจะต้องตั้งค่าพารามิเตอร์ grant_type เป็น refresh_token

curl -X POST 'https://openapi.ctrader.com/apps/token?grant_type=refresh_token&refresh_token=asdXCVCVAS_218kjashf_asdasd2ASD_223x&client_id=5430012&client_secret=012sds23dlkjQsd' -H 'Accept: application/json' -H 'Content-Type: application/json'

คุณจะได้รับคำตอบที่มีค่าใหม่ของคีย์ accessToken และ refreshToken คุณสามารถใช้ค่าใหม่เหล่านี้ได้อย่างปลอดภัย ในขณะที่ค่าเดิมของคีย์เดียวกันจะถูกยกเลิกโดยอัตโนมัติ

ส่งข้อความ Protobuf

หรือคุณสามารถส่งข้อความ ProtoOARefreshTokenReq และรับข้อความ ProtoOARefreshTokenRes ที่มีโทเค็นใหม่ที่ถูกต้อง

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
_disposables.Add(_client.OfType<ProtoOARefreshTokenRes>().Subscribe(OnRefreshTokenResponse));
private static void OnRefreshTokenResponse(ProtoOARefreshTokenRes response) 
{
    _token = new Token 
    {
        AccessToken = response.AccessToken,
        RefreshToken = response.RefreshToken,
        ExpiresIn = DateTimeOffset.FromUnixTimeMilliseconds(response.ExpiresIn),
        TokenType = response.TokenType,
    }
}
var refreshTokenReq = new ProtoOARefreshTokenReq
    {
        refreshToken = {your_refresh_token}, // Add your refresh token here
    };
await _client.SendMessage(applicationAuthReq);
1
newToken = auth.refreshToken("refresh_Token")

ใช้ Playground

Playground ให้วิธีการที่รวดเร็วในการรับโทเค็นการเข้าถึงสำหรับ cTID ของคุณเอง ช่วยให้คุณสามารถพัฒนาและทดสอบแอปพลิเคชันได้อย่างรวดเร็วและง่ายดายก่อนที่จะเผยแพร่ให้กับกลุ่มเป้าหมาย

เพื่อเข้าถึง Playground ให้ไปที่หน้า Applications และเลือกปุ่ม Playground ในหน้าต่างที่ปรากฏขึ้นใหม่ ให้เลือกขอบเขตของแอปพลิเคชันและคลิกปุ่ม Get token

หลังจากนั้น คุณควรเห็นหน้าต่อไปนี้

คุณสามารถใช้โทเค็นการเข้าถึงและโทเค็นรีเฟรชสำหรับการส่งข้อความไปยัง API ในขณะที่ได้รับการรับรองภายใต้ cTID ของคุณเอง