Android WebRTC无法连接到coTURN服务器:错误401:未经授权

问题描述

我已使用lt-cred-mech选项设置了coTURN服务器(使用TURN REST API)。我生成用户如下:

  • 用户1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4
  • 通过:doSnY8s16/vK6ynnALMkbl0DcLo=

我已经通过trickle-ice进行了测试,并且我的浏览器可以连接到我的服务器:

enter image description here

从coTURN服务器登录

240848: session 001000000000000929: realm <> user <>: incoming packet BINDING processed,success
240849: session 001000000000000928: realm <> user <>: incoming packet BINDING processed,success
240851: IPv4. Local relay addr: 172.30.0.9:49063
240851: session 000000000000000589: new,realm=<>,username=<1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4>,lifetime=3600
240851: session 000000000000000589: realm <> user <1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4>: incoming packet ALLOCATE processed,success
240851: IPv4. Local relay addr: 172.30.0.9:49021
240851: session 000000000000000590: new,lifetime=3600
240851: session 000000000000000590: realm <> user <1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4>: incoming packet ALLOCATE processed,success
240851: session 000000000000000589: refreshed,lifetime=0
240851: session 000000000000000589: realm <> user <1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4>: incoming packet REFRESH processed,success
240851: session 000000000000000589: TCP socket closed remotely x.x.x.x:44301
240851: session 000000000000000589: usage: realm=<>,rp=3,rb=324,sp=3,sb=312
240851: session 000000000000000589: peer usage: realm=<>,rp=0,rb=0,sp=0,sb=0
240851: session 000000000000000589: closed (2nd stage),user <1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4> realm <> origin <>,local 172.30.0.9:3478,remote x.x.x.x:44301,reason: TCP connection closed by client (callback)
240851: session 000000000000000589: delete: realm=<>,username=<1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4>

但是当我使用Android应用拨打电话时,应用无法连接。

我的android代码

PeerConnection.IceServer iceServer = PeerConnection.IceServer
        .builder("turn:x.x.x.x:3478")
        .setUsername("1601871288:4e4d54c1-7b69-40a2-b355-ff2b40e003c4")
        .setPassword("doSnY8s16/vK6ynnALMkbl0DcLo=")
        .setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK)
        .createIceServer();

iceServers.add(iceServer);

PeerConnection.RTCConfiguration rtcConfig = new PeerConnection.RTCConfiguration(iceServers);

// TCP candidates are only useful when connecting to a server that supports
// ICE-TCP.
rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.disABLED;
rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE;
rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE;
rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY;
rtcConfig.iceTransportsType = PeerConnection.IceTransportsType.ALL;
// Use ECDSA encryption.
 rtcConfig.keyType = PeerConnection.KeyType.ECDSA;

// disable when use loopback
rtcConfig.enableDtlsSrtp = true;
rtcConfig.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN;

peerConnection = factory.createPeerConnection(rtcConfig,pcObserver);

但是我从服务器error 401: Unauthorized

收到错误消息

从服务器登录

241236: session 001000000000000943: realm <> user <>: incoming packet message processed,error 401: Unauthorized
241236: session 001000000000000944: realm <> user <>: incoming packet message processed,error 401: Unauthorized
241236: session 001000000000000943: realm <> user <>: incoming packet message processed,error 401: Unauthorized
241236: session 000000000000000591: realm <> user <>: incoming packet message processed,error 401: Unauthorized

有人可以告诉我我的错误在哪里吗?

谢谢。

解决方法

也许它将帮助您找到一些线索,基本上发生的是您的STUN / TURN服务器未对iceCandidates进行身份验证。 取自RFC docs

case $age in
  *[!0-9]*) echo "Age must not contain non-numeric digits";;
esac