使用Twilio官方tutorial code here,我可以正常运行一个电话号码和一个TwiML应用程序,并启动flask
服务器和ngrok
转发过程。操作系统和浏览器是Chrome 53.0.2785.143 (64-bit) on Mac OSX
。
不幸的是,它失败了,并给出了以下错误:Twilio.Device Error: JWT signature validation failed
如屏幕截图所示:
我尝试将{debug : true}
提交给调用,如下所示:
Twilio.Device.setup(data.token, { debug: true });
并得到以下输出:
但是仍然不清楚发生了什么。如果我尝试将返回的实际兼容性 token 扔到Python控制台中(使用JWT encoder/decoder),并尝试使用Twilio secret 身份验证 token 和HS256 algorithm对其进行解码:
from jose import jwt
token = "xxxxx" # compatibility token from above in browser
print jwt.decode(token, TWILIO_AUTH_TOKEN, algorithms=['HS256'])
我收到以下错误:
/Users/me/.virtualenvs/myenv/lib/python2.7/site-packages/jose/jwt.pyc in decode(token, key, algorithms, options, audience, issuer, subject, access_token)
132 payload = jws.verify(token, key, algorithms, verify=verify_signature)
133 except JWSError as e:
--> 134 raise JWTError(e)
135
136 # Needed for at_hash verification
JWTError: Signature verification failed.
因此,也许他们没有将其用作编码解码的秘诀,所以不知道能证明多少。
有什么想法吗?
最佳答案
有几件事情可以尝试。
第一:确保您使用的是实际的AccountSID和AuthToken,不要尝试使用“测试凭据”。如果您使用的是试用帐户,那么一切正常,twilio只会在语音 call 之前打招呼。
第二:确保已创建TwiML应用程序,并且在“allowClientOutgoing”方法期间将关联的AppID用于“applicationId”。
这样可以使您完成JWT签名过程。如果您的服务器似乎无法正常工作。我刚刚构建了一个位于here的Google Apps脚本版本。只需按照代码中的注释进行复制,以放置您的凭据和appId,然后您就可以查看服务器中是否包含该内容。
要使用它,只需向已发布的应用程序脚本URL发出GET请求,它将重新调整 token 。
确保JWT签名正确后的其他步骤。
对于传出,您将需要对服务器进行回调,以发送一些TwiML,并下达命令以拨打传出号码。随附的Google Apps脚本上还有一种设置。将脚本url添加到您注册的twilio号码上的语音回叫部分,并将其设置为POST请求。
TwiML发送示例
<Response><Dial callerId="+//enter your registered phonenumber here////">'+tocall+'</Dial></Response>'
对于传入连接,您将需要使用一些代码设置TwiML Bin,以拨打在“allowIncoming(clientName)”方法期间使用的用户名。
TwiML示例传入
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial>
<Client>//client name or id registered during token generation here\\</Client>
</Dial>
</Response>
然后,将TwiML Bin分配给控制台内已注册电话号码的传入侧。