首页 > 解决方案 > Session.getActiveUser() 的随机权限/授权错误

问题描述

在过去的一周里,我的 google 应用程序脚本遇到了一个令人讨厌的问题,该脚本已经运行了好几年,至少有 500 个用户。

当我试图以这种方式获取当前用户的登录信息时:

var email_act = Session.getActiveUser().getEmail();

服务器抛出异常:

例外:您无权调用 Session.getActiveUser。所需权限:https ://www.googleapis.com/auth/userinfo.email at getUserInfo(UserFunctions:46:27)

在我的情况下,有效用户与活动用户不同,但在尝试调用 Session.getEffectiveUser() 时我也遇到了同样的错误。

这是随机发生的,大约 30% 的调用,到目前为止,我的解决方案只是重试直到成功。请注意,当我在后端代码中进行重试时,它并没有解决问题,可能是因为“会话”本身有问题。如果它失败了一次,它也会失败所有后续调用。因此,我在前端代码中实现了重试循环(假设每次对后端的调用都被视为一个新会话)并且这有所帮助 - 在几次(最坏的情况 5)重试之后它可以工作。后端现在有一个简单的 try-catch 错误处理程序,它会在失败的情况下将状态 (-1) 返回给 FE。

有什么想法可能是根本原因吗?我的解决方案太丑陋了,无法忍受......

提前致谢!

标签: google-apps-script

解决方案


我今天刚遇到同样的错误。对我来说,Session.getActiveUser().getEmail() 位于我使用脚本创建的动态网页上的脚本中,该脚本使用 code.gs 中定义的函数“include”,如下所示:

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

似乎将其更改为

function include(filename) {
  return HtmlService.createTemplateFromFile(filename).evaluate().getContent();
}

已经把事情弄清楚了。我相信当我将代码切换到 GAS 中的新 V8 引擎时,错误开始发生。

编辑:哎呀,它第一次工作,但在那之后失败了。所以我不得不在 code.gs 中移动 Session.getActiveUser().getEmail()

function getUserEmail() {
  return Session.getActiveUser().getEmail()
}

在网页上的 javascript 中,我不得不使用回调:

google.script.run.withSuccessHandler(function (email) {
  document.getElementById("yourIDhere").innerHTML = email;
}).getUserEmail();

一点也不漂亮,但它现在可以可靠地工作。


推荐阅读