Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script GMail加载项在授权操作完成后不重新加载_Google Apps Script_Gmail Addons - Fatal编程技术网

Google apps script GMail加载项在授权操作完成后不重新加载

Google apps script GMail加载项在授权操作完成后不重新加载,google-apps-script,gmail-addons,Google Apps Script,Gmail Addons,我有一个GMail插件,它使用OAuth2授权外部服务。启动插件时,我通过调用oauthService.hasAccess()检查用户是否已经拥有访问令牌。如果用户没有令牌,那么我将显示一张卡片,上面写着“您需要授权服务” 该卡包含以下链接: section.addWidget(CardService.newTextButton() .setText("Authorize MyService") .setAuthorizationAction( CardS

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

该卡包含以下链接:

section.addWidget(CardService.newTextButton()
      .setText("Authorize MyService")
      .setAuthorizationAction(
        CardService.newAuthorizationAction()
          .setAuthorizationUrl(authorizationUrl)
      ));
当用户点击“授权MyService”按钮时,会出现一个弹出窗口,旧卡中会出现一个微调器。然后用户登录MyService,授权访问,然后使用令牌调用my
AuthorizeCallback
。我存储令牌,并返回一个仅关闭自身的HtmlPage

原始卡中的旋转器停止旋转。但是,插件不会重新加载。这表明在授权完成时,存在阻止AuthorizationAction卡重新加载的因素。有什么建议吗

我希望加载项重新加载,因为这样entrypoint函数将发现现在
oauthService.hasAccess()
返回
true
,然后将显示正常的“您已授权”卡(并开始处理发送给MyService的电子邮件)


谢谢你的帮助

也许有更好的方法,但我就是这样解决的

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

section.addWidget(CardService.newTextButton()
.setText("Authorize MyService")
.setOnClickAction(CardService.newAction().setFunctionName('loginAction'));
loginFunction
将返回一个
ActionResponse
。它将有一个与之关联的
导航
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();
}
这将打开登录弹出窗口
getLoginUrl
将返回OAuth登录URL
getLoginStepsCard
将返回包含某些信息的卡。在我的例子中,我展示了登录所需的步骤,显示您想要的任何内容

在授权回调函数中,保存您的令牌,不要立即关闭弹出窗口。关闭弹出窗口在我测试时起作用(使用
HEAD
),但对版本化部署不起作用。问题是
PropertiesService
需要几秒钟才能保存令牌。只需等待几秒钟(我使用5秒的设置超时),然后关闭弹出窗口或要求用户关闭它。加载项将重新加载,PropertiesService将拥有您的令牌


我希望这有帮助。它适合我,我已经发布了我的插件;)

正如@AKT的回答中提到的,这里的核心问题是授权回调将令牌保存到属性,而属性不会立即复制到所有应用程序脚本后端。因此,尽管auth流已经完成,但当加载项重新加载时,它仍然会看到过时的属性,这表明它没有完成

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

.setCache(CacheService.getUserCache())

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

您解决了吗?有相同的问题。但对我来说,addon会间歇性地重新加载。相关问题:我们如何知道登录是否成功?