在AuthorizationAction完成后,GMail Add-On不会重新加载

时间:2017-12-01 01:42:17

标签: google-apps-script gmail-addons

我有一个GMail AddOn,它使用OAuth2来授权外部服务。启动AddOn时,我通过调用oauthService.hasAccess()来检查用户是否已拥有访问令牌。如果用户没有令牌,那么我会显示一张卡片,上面写着"您需要授权该服务"。

该卡包含如下构建的链接:

section.addWidget(CardService.newTextButton()
      .setText("Authorize MyService")
      .setAuthorizationAction(
        CardService.newAuthorizationAction()
          .setAuthorizationUrl(authorizationUrl)
      ));

当用户点击"授权MyService"按钮,出现一个弹出窗口,旧卡片中出现一个微调器。然后,用户登录MyService,授权访问,并使用令牌调用AuthorizeCallback。我存储令牌,并返回一个只关闭自己的HtmlPage。

原卡中的微调器停止旋转。但是,AddOn不会重新加载。这表明在授权完成时存在阻止AuthorizationAction卡重新加载的内容。有什么建议吗?

我希望AddOn重新加载,因为入口点函数会发现现在oauthService.hasAccess()返回true,然后会显示正常的"您已被授权"卡(并开始处理电子邮件到MyService)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

也许有更好的方法可以做到这一点,但这就是我解决的方法。

首先,不要使用setAuthorizationAction并设置功能名称。{p>

setOnClickAction

section.addWidget(CardService.newTextButton() .setText("Authorize MyService") .setOnClickAction(CardService.newAction().setFunctionName('loginAction')); 将返回loginFunction。它将具有一个ActionResponseNavigation关联。

OpenLink

这将打开登录弹出窗口。 function loginAction(){ var nav = CardService.newNavigation().pushCard(getLoginStepsCard()); return CardService.newActionResponseBuilder() .setStateChanged(true) .setNavigation(nav) .setOpenLink( CardService.newOpenLink().setUrl(getLoginUrl() ) .setOnClose(CardService.OnClose.RELOAD_ADD_ON) .setOpenAs(CardService.OpenAs.OVERLAY)).build(); } 将返回OAuth登录URL。 getLoginUrl将返回包含某些信息的卡片。就我而言,我正在显示登录所需的步骤,并显示您想要的任何内容。

在授权回调函数内部,保存您的令牌并且不要立即关闭弹出窗口。在我进行测试时(使用getLoginStepsCard),关闭弹出窗口是可行的,但不适用于版本化部署。问题是HEAD花费了几秒钟来保存令牌。只需等待几秒钟(我使用的PropertiesService为5s),然后关闭弹出窗口或要求用户关闭弹出窗口。加载项将重新加载,PropertiesService将获得您的令牌。

我希望这会有所帮助。它对我有用,我已经发布了插件;)

答案 1 :(得分:0)

如@AKT的答案中所述,此处的核心问题是授权回调将令牌保存到属性中,这些属性不会立即复制到所有Apps脚本后端。因此,尽管身份验证流程已完成,但是在加载加载项时,它仍然会看到过时的属性,表明该属性尚未完成。

解决此问题的一种方法是在关闭弹出窗口(并刷新附加工具条)之前等待更长的时间。似乎更好的选择是确保您在OAuth服务上设置了缓存:

.setCache(CacheService.getUserCache())

这将添加一个额外的缓存层,该层可以更快地复制,这似乎可以解决此问题。