Google apps script GMail加载项在授权操作完成后不重新加载
我有一个GMail插件,它使用OAuth2授权外部服务。启动插件时,我通过调用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
oauthService.hasAccess()
检查用户是否已经拥有访问令牌。如果用户没有令牌,那么我将显示一张卡片,上面写着“您需要授权服务”
该卡包含以下链接:
section.addWidget(CardService.newTextButton()
.setText("Authorize MyService")
.setAuthorizationAction(
CardService.newAuthorizationAction()
.setAuthorizationUrl(authorizationUrl)
));
当用户点击“授权MyService”按钮时,会出现一个弹出窗口,旧卡中会出现一个微调器。然后用户登录MyService,授权访问,然后使用令牌调用myAuthorizeCallback
。我存储令牌,并返回一个仅关闭自身的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登录URLgetLoginStepsCard
将返回包含某些信息的卡。在我的例子中,我展示了登录所需的步骤,显示您想要的任何内容
在授权回调函数中,保存您的令牌,不要立即关闭弹出窗口。关闭弹出窗口在我测试时起作用(使用HEAD
),但对版本化部署不起作用。问题是PropertiesService
需要几秒钟才能保存令牌。只需等待几秒钟(我使用5秒的设置超时),然后关闭弹出窗口或要求用户关闭它。加载项将重新加载,PropertiesService将拥有您的令牌
我希望这有帮助。它适合我,我已经发布了我的插件;) 正如@AKT的回答中提到的,这里的核心问题是授权回调将令牌保存到属性,而属性不会立即复制到所有应用程序脚本后端。因此,尽管auth流已经完成,但当加载项重新加载时,它仍然会看到过时的属性,这表明它没有完成 解决这一问题的一种方法是在关闭弹出窗口(并刷新附加工具栏)之前等待更长时间。更好的选择似乎是确保在OAuth服务上设置缓存:
.setCache(CacheService.getUserCache())
这增加了一个额外的缓存层,可以更快地复制,这似乎解决了这个问题。您解决了吗?有相同的问题。但对我来说,addon会间歇性地重新加载。相关问题:我们如何知道登录是否成功?