Невозможно войти в 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 в строку, я не знаю, насколько проще это может быть.