2014-10-27 84 views
0

我的Google Docs插件在用户同时登录到多个Google帐户的Web应用程序中运行时出现问题,然后当他们尝试使用第三方应用程序的访问令牌将保存到错误的Google帐户中。Google Apps脚本:未找到端点

我的想法是通过在状态参数中传递授权用户的电子邮件来检查当前用户的电子邮件,然后重新构建重定向URL以包含具有正确帐户电子邮件的authuser参数,然后重定向到那个终点。不过,我在创建实际可用的新重定向网址时遇到了问题。

我经常使用的OAuth重定向将我带回/exec端点的脚本。在我的doGet()里面,我正在检查状态参数是否等于Session.getActiveUser().getEmail()的值。如果不是,那么我会构建一个指向我的/exec端点的新重定向URL,除了我还会添加一个authuser参数以及一个redir参数,该参数告诉该应用程序在下次通过doGet()时不尝试并建立新的重定向。然后,我输出一个名为userAuth的HTML页面。 userAuth页面包含一个用户点击使用包含authuser的新重定向的链接。问题是,当你点击这个链接时,你会看到一个“对不起,你请求的文件不存在”。错误信息。

我的/exec端点发生了什么事,使得它在第二次尝试请求时不存在?有更好的方法我应该去做这件事吗?

更新:我发现我的/exec端点没有发现只要我送从一个目前正在与谷歌不同的授权的authuser参数值。我误解了authuser参数的作用吗?我认为,既然用户登录了两个Google帐户,则authuser会指定哪个帐户使用该附加组件。我的doGet()代码如下。谢谢你的帮助!

function doGet(request) { 
    var HTMLToOutput; 
    if (request.parameters.state != Session.getActiveUser().getEmail() && 
     !request.parameters.redir) { 
    var authuser = request.parameters.state; 
    var newRedir = AUTH_REDIRECT_URI; 
    newRedir = newRedir + "?code="+ request.parameters.code + "&redir=true&authuser=" 
       + authuser; 
    setPrivateCache('newRedir', newRedir); 
    HTMLToOutput = HtmlService.createHtmlOutputFromFile("userAuth"); 
    } else if (request.parameters.code) { 
    HTMLToOutput = upgradeAuthCode(request.parameters.code + ""); 
    } else if (request.parameters.error == 'access_denied') { 
    HTMLToOutput = HtmlService.createHtmlOutputFromFile("accessDenied"); 
    } 
    return HTMLToOutput; 
} 
+1

生成404错误消息的第二个帐户是否可以访问该Web应用程序?例如,如果您正在使用/ dev端点,则只有该脚本的编辑者才能访问该webapp。 – 2014-11-10 21:36:32

回答

0

啊,就是这样。谢谢,埃里克!我正在开发并运行脚本,使其只能在域中访问Web应用程序。我用来测试的第二个帐户来自gmail。

我之所以没有考虑过最初无法访问网络应用程序的gmail帐户,是因为我成功点击了/exec端点,并显示了userAuth html页面。但是,当我点击链接回到/exec时,我被显示了404。

事后看来,这是显而易见的,因为我第一次碰到/exec,它是第一个访问网络应用程序的帐户。第二次,我点击/exec,这是第二个帐户无法访问网络应用程序。

将应用程序脚本移出测试域,并部署了网络应用程序以允许访问任何人后,重定向工作正常。