从 Flex 插件调用 Twilio 函数时处理过期的 ssoTokenPayload

问题描述 投票:0回答:1

我们实现了一个 Twilio Flex 插件,基本上允许每个用户在完成任务时提供一些附加信息(以表单的形式)。因此,插件必须在显示该表单之前获取一些与任务相关的数据。

我们为此使用 Twilio 函数,并使用令牌验证器对其进行保护,如此处所述。插件代码(调用此函数)如下所示:

export const getCallDuration = async (callSid, token) => {
  const response = await axios.post(FUNCTION_URL, {
    WorkspaceSid: WORKSPACE_SID,
    CallSid: callSid,
    Token: token,
  });
  return response.data.callInfo.duration;
};

// and here's the usage part:
const callDuration = await getCallDuration(
  task.attributes.call_sid,
  flexState.session.ssoTokenPayload.token,
);

...其中 flexState 基本上是插件组件的一个 prop,它的值在插件初始化时设置为

manager.store.getState().flex

现在,大部分时间都运行顺利。问题是,接近工作日结束时,我们开始定期收到“访问令牌已过期或过期日期无效”错误 - 因为用户往往会打开浏览器几个小时,并且不会重新进行身份验证。

虽然 Twilio Flex 确实知道会话状态

...它似乎基本上没有做任何事情,允许插件使用过期的令牌。

更令人担忧的是,文档似乎没有提到在令牌过期时手动更新 ssoTokenPayload 的任何方法。所有相关部分似乎都是关于不同的东西,不适用于 Flex。

我在这里进行了一些搜索,最接近的似乎是这个thread,它描述了相同的错误,但针对不同的用例。那里提到的 AccessManager 库似乎不是一个选项,因为它基本上已被弃用:

AccessManager 一直使用到 2016 年中期,然后被删除(并且 对话已被弃用)。 AccessManager 在以下情况下很有用: 有一个长期存在的视频客户端,现在你只需调用 connect 即可 每次您想加入房间时都会有新的令牌。

在这种情况下我们有什么选择?

twilio twilio-functions twilio-flex
1个回答
0
投票

看起来* Twilio Flex 2.x 尝试自动更新其访问令牌。这样做的好处是,该过程的所有复杂性都对开发人员隐藏,他们现在甚至不应该关心 AccessManager。

然而,不太明显的事情是,这个过程似乎会导致典型的 Redux Store 更新 - 这对我来说没有多大意义,因为令牌更新不应该触发重新渲染......但无论如何。因此,如果您不小心传入 props 的内容,您的组件最终将使用过时的数据。

最直接的方法似乎是使用“快捷方式”来获取访问令牌,如本期中提到的。在我们的例子中,我们开始将

manager
作为组件 prop 传递,如下使用:

const callDuration = await getCallDuration(
  task.attributes.call_sid,
  manager.user.token,
);

manager.store.getState().flex.session.ssoTokenPayload.token
的这种替代方案似乎没有记录,但似乎*可以公平地假设它将保持活跃状态。

*如果能够用 Twilio Flex 文档的直接链接替换本文中的所有“看起来”,那就太好了。至少,

manager.user.token
的“快捷方式”值得在Twilio功能使用指南这一部分中提及。

© www.soinside.com 2019 - 2024. All rights reserved.