如何正确处理 Twilio 'Programmable video' JWT 访问令牌? (Android)
How to process Twilio 'Programmable video' JWT access token correctly? (Android)
我试图将 Twilio 的可编程视频嵌入到我的 Android 应用程序中。
我在 java 服务器上创建了一个端点,它使用 "com.twilio.sdk" % "twilio-java-sdk" % "6.3.0" 库通过以下代码获取访问令牌:
private static final String ACCOUNT_SID = "ACxxxxx";
private static final String API_KEY_SID = "SKxxxxx";
private static final String API_KEY_SECRET = "aa8xxxxx";
private static final String TWILIO_CONFIGURATION_SID = "VSxxxxx";
public Result token(String identity) {
return ok(Json.toJson(new ResponseMessage(createToken(identity))));
}
public static String createToken(String identity) {
ConversationsGrant grant = new ConversationsGrant();
grant.configurationProfileSid = TWILIO_CONFIGURATION_SID;
AccessToken token = new AccessToken.Builder(
ACCOUNT_SID,
API_KEY_SID,
API_KEY_SECRET
).identity(identity).grant(grant).ttl(86400).build();
return token.toJWT();
}
然后我从这个端点在我的 Android 应用程序中接收到一个令牌,并使用这个令牌实例化 AccessManager
new AccessManager(MyActivity.this,
videoToken,
new AccessManager.Listener() {
@Override
public void onTokenExpired(AccessManager twilioAccessManager) {
//Expired :(
}
@Override
public void onTokenUpdated(AccessManager twilioAccessManager) {
//Updated!
});
,并尝试在 accessManagerListener 中使用以下代码创建 TwilioConversationsClient:
TwilioConversationsClient.create(twilioAccessManager, new TwilioConversationsClient.Listener() {
@Override
public void onStartListeningForInvites(TwilioConversationsClient conversationsClient) {
Log.d(TAG, "TwilioConversationsClient.Listener: onStartListeningForInvites");
}
@Override
public void onStopListeningForInvites(TwilioConversationsClient conversationsClient) {
Log.d(TAG, "TwilioConversationsClient.Listener: onStopListeningForInvites");
}
@Override
public void onFailedToStartListening(TwilioConversationsClient conversationsClientd,
TwilioConversationsException e) {
Log.d(TAG, "TwilioConversationsClient.Listener: onFailedToStartListening");
});
每次我进入 'onFailedToStartListening' 回调并显示错误消息:
com.twilio.conversations.TwilioConversationsException: code:103, message: 31201 Authentication failed
最奇怪的是,如果我从“//已更新!”复制新令牌块(见上文),并将其手动粘贴到代码中
new AccessManager(MyActivity.this,
videoToken
取而代之的是 videoToken,我在几秒钟前从服务器收到它,一切正常,我进入了 onStartListeningForInvites 回调。当我尝试阅读答案时,服务器编码或编码可能有问题?我用了几天,还是没能解决这个问题
甚至更多,我尝试用 PHP 替换我的 java 服务器代码,但得到了相同的结果!如果我在控制台(终端)中生成一个令牌,然后将其粘贴到 Android 应用程序代码中,一切正常。但是如果我试图从远程服务器获取令牌,我会得到与 'code:103, message: 31201 Authentication failed' 相同的错误。
我还使用与 Twilio Voice 和 Ip-Messaging 的集成,而且我从未遇到过令牌问题。
如果我们解码 JWT 令牌(一个来自服务器,另一个在本地生成),我们将看到唯一的区别是创建时间和过期时间:
感谢任何建议!
最后,来自 Twilio 的人给了我们一个解决方法。 Ttl 86400 由于某种原因无法被 Twilio 服务器正确处理。此生命周期一半的 Ttl 工作正常。
我试图将 Twilio 的可编程视频嵌入到我的 Android 应用程序中。
我在 java 服务器上创建了一个端点,它使用 "com.twilio.sdk" % "twilio-java-sdk" % "6.3.0" 库通过以下代码获取访问令牌:
private static final String ACCOUNT_SID = "ACxxxxx";
private static final String API_KEY_SID = "SKxxxxx";
private static final String API_KEY_SECRET = "aa8xxxxx";
private static final String TWILIO_CONFIGURATION_SID = "VSxxxxx";
public Result token(String identity) {
return ok(Json.toJson(new ResponseMessage(createToken(identity))));
}
public static String createToken(String identity) {
ConversationsGrant grant = new ConversationsGrant();
grant.configurationProfileSid = TWILIO_CONFIGURATION_SID;
AccessToken token = new AccessToken.Builder(
ACCOUNT_SID,
API_KEY_SID,
API_KEY_SECRET
).identity(identity).grant(grant).ttl(86400).build();
return token.toJWT();
}
然后我从这个端点在我的 Android 应用程序中接收到一个令牌,并使用这个令牌实例化 AccessManager
new AccessManager(MyActivity.this,
videoToken,
new AccessManager.Listener() {
@Override
public void onTokenExpired(AccessManager twilioAccessManager) {
//Expired :(
}
@Override
public void onTokenUpdated(AccessManager twilioAccessManager) {
//Updated!
});
,并尝试在 accessManagerListener 中使用以下代码创建 TwilioConversationsClient:
TwilioConversationsClient.create(twilioAccessManager, new TwilioConversationsClient.Listener() {
@Override
public void onStartListeningForInvites(TwilioConversationsClient conversationsClient) {
Log.d(TAG, "TwilioConversationsClient.Listener: onStartListeningForInvites");
}
@Override
public void onStopListeningForInvites(TwilioConversationsClient conversationsClient) {
Log.d(TAG, "TwilioConversationsClient.Listener: onStopListeningForInvites");
}
@Override
public void onFailedToStartListening(TwilioConversationsClient conversationsClientd,
TwilioConversationsException e) {
Log.d(TAG, "TwilioConversationsClient.Listener: onFailedToStartListening");
});
每次我进入 'onFailedToStartListening' 回调并显示错误消息:
com.twilio.conversations.TwilioConversationsException: code:103, message: 31201 Authentication failed
最奇怪的是,如果我从“//已更新!”复制新令牌块(见上文),并将其手动粘贴到代码中
new AccessManager(MyActivity.this,
videoToken
取而代之的是 videoToken,我在几秒钟前从服务器收到它,一切正常,我进入了 onStartListeningForInvites 回调。当我尝试阅读答案时,服务器编码或编码可能有问题?我用了几天,还是没能解决这个问题
甚至更多,我尝试用 PHP 替换我的 java 服务器代码,但得到了相同的结果!如果我在控制台(终端)中生成一个令牌,然后将其粘贴到 Android 应用程序代码中,一切正常。但是如果我试图从远程服务器获取令牌,我会得到与 'code:103, message: 31201 Authentication failed' 相同的错误。
我还使用与 Twilio Voice 和 Ip-Messaging 的集成,而且我从未遇到过令牌问题。
如果我们解码 JWT 令牌(一个来自服务器,另一个在本地生成),我们将看到唯一的区别是创建时间和过期时间:
感谢任何建议!
最后,来自 Twilio 的人给了我们一个解决方法。 Ttl 86400 由于某种原因无法被 Twilio 服务器正确处理。此生命周期一半的 Ttl 工作正常。