Невозможно войти в Agora RTM с помощью Django и Javascript

У меня возникли трудности с входом в клиент RTM, и я продолжаю получать код ошибки 3:

RTM:ERROR Error Code 3: login failed with args: {"UID":"l6T1ri6cqWCtEkmy","RTM_TOKEN":"006APP_IDIABVkygsLYuEGlBVKo+r7rsHsmQLZYt/gRZ4pezQayPmhJvA8okAAAAAEAAbLbcBPyeuYgEA6AM/J65i"}.
Uncaught (in promise) RtmInvalidArgumentError:  Error Code 3 - not a valid user id.

Пользователь вводит название комнаты на странице лобби, которая используется для генерации токенов RTC и RTM. Вот JS-код лобби:

     <script>
        let form = document.getElementById('lobby__form')

        let handleSubmit = async (e) => {
            e.preventDefault()
            let room = e.target.room.value.toUpperCase()
            let response = await fetch(`/get_token/?channel=${room}`)
            let data = await response.json()

            let UID = data.userAccount
            let token = data.token
            let rtmToken = data.rtmToken

            sessionStorage.setItem('UID', UID)
            sessionStorage.setItem('token', token)
            sessionStorage.setItem('rtmToken', rtmToken),
            sessionStorage.setItem('room', room)

            window.open('/room/', '_self')
            
        }

        form.addEventListener('submit', handleSubmit)
     </script>

Я генерирую случайную строку, которую использую в качестве UID в представлении Django, которое действует как моя конечная точка:

from django.http import JsonResponse
from agora_token_builder import RtcTokenBuilder
from agora_token_builder import RtmTokenBuilder
from django.utils.crypto import get_random_string
import time

def getToken(request):
    appId = 'APP_ID'
    appCertificate = 'APP_CERT'
    channelName = request.GET.get('channel')
    userAccount = get_random_string(length=16)
    role = 1
    expirationTimeInSeconds = 3600 * 24
    currentTimeStamp = time.time()
    privilegeExpiredTs = currentTimeStamp + expirationTimeInSeconds

    token = RtcTokenBuilder.buildTokenWithAccount(appId, appCertificate, channelName, userAccount, role, privilegeExpiredTs)
    rtmToken = RtmTokenBuilder.buildToken(appId, appCertificate, userAccount, role, privilegeExpiredTs)
    return JsonResponse({'token': token, 'rtmToken': rtmToken, 'userAccount': userAccount}, safe=False)

Здесь я инициализирую клиентов:

const APP_ID = 'APP_ID'
const CHANNEL = sessionStorage.getItem('room')
const TOKEN = sessionStorage.getItem('token')
let RTM_TOKEN = sessionStorage.getItem('rtmToken')
let UID = sessionStorage.getItem('UID')

let joinRoomInit = async () => {
    rtmClient = await AgoraRTM.createInstance(APP_ID)
    console.log(typeof(UID)) // returns string
    await rtmClient.login({UID, RTM_TOKEN})

    rtmChannel = await rtmClient.createChannel(CHANNEL)
    await rtmChannel.join()

    rtmChannel.on('MemberJoined', handleMemberJoined)// Outputs a success console message

    client = AgoraRTC.createClient({mode:'rtc', codec:'vp8'})
    await client.join(APP_ID, CHANNEL, TOKEN, UID)
    
    client.on('user-published', handleUserPublished)
    client.on('user-left', handleUserLeft)

    joinStream()
}

Здесь было предложено использовать более простую строку. Поскольку я начал с преобразования целочисленного UID в строку, я не знаю, насколько проще это может быть.

Вернуться на верх