【问题标题】:GMail Add-On not reloading after AuthorizationAction completesAuthorizationAction 完成后未重新加载 GMail 插件
【发布时间】:2019-01-06 09:31:59
【问题描述】:

我有一个使用 OAuth2 授权外部服务的 GMail 插件。启动 AddOn 时,我通过调用 oauthService.hasAccess() 检查用户是否已经拥有访问令牌。如果用户没有令牌,我会出示一张卡片,上面写着“您需要授权服务”。

卡片包含一个这样构建的链接:

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

当用户单击“Authorize MyService”按钮时,会出现一个弹出窗口,并且旧卡中会出现一个微调器。然后用户登录到 MyService,授权访问,然后我的 AuthorizeCallback 被使用令牌调用。我存储了令牌,然后返回一个自己关闭的 HtmlPage。

原始卡片中的旋转器停止旋转。但是,AddOn 不会重新加载。这表明当授权完成时,有一些东西阻止了 AuthorizationAction 卡重新加载。有什么建议吗?

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

感谢您的帮助!

【问题讨论】:

标签: google-apps-script gmail-addons


【解决方案1】:

可能有更好的方法来做到这一点,但我就是这样解决的。

首先,不要使用setAuthorizationAction,而是使用setOnClickAction 并设置函数名称。

section.addWidget(CardService.newTextButton()
.setText("Authorize MyService")
.setOnClickAction(CardService.newAction().setFunctionName('loginAction'));

loginFunction 将返回一个ActionResponse。它将有一个 NavigationOpenLink 与之关联。

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();
}

这将打开登录弹出窗口。 getLoginUrl 将返回 OAuth 登录 URL。 getLoginStepsCard 将返回一张包含一些信息的卡片。在我的例子中,我展示了登录所需的步骤,展示你想要的任何东西。

在授权回调函数中,保存你的令牌并且不要立即关闭弹出窗口。在我测试时关闭弹出窗口有效(使用HEAD),但它不适用于版本化部署。问题是PropertiesService 需要几秒钟来保存令牌。只需等待几秒钟(我使用 5s 的setTimeout)并关闭弹出窗口或要求用户关闭它。加载项将重新加载,PropertiesService 将拥有您的令牌。

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

【讨论】:

  • 请问我们如何知道登录是否成功?
【解决方案2】:

正如@AKT 的回答中提到的,这里的核心问题是授权回调将令牌保存到属性中,这些属性不会立即复制到所有 Apps 脚本后端。因此,虽然身份验证流程已经完成,但当插件重新加载时,它仍然会看到陈旧的属性,表明它还没有。

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

.setCache(CacheService.getUserCache())

这增加了一个复制速度更快的额外缓存层,这似乎可以解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多