Auth0 和 Google API,访问令牌已过期,如何将文件写入 Google 驱动器

Auth0 and Google API, access token expired, howto write files to Google Drive

我已经编写了一个在线转换器并将 Auth0 集成到我的网站。我想要实现的是将转换后的文件自动上传到登录用户的 Google 驱动器。我在 Auth0 中设置了 Google oauth,一切似乎都正常。

问题是,Google 的 access_token 会在 60 分钟后过期,而我没有 refresh_token。因此,用户需要通过 Google 登录页面再次登录。这不是我想要的,因为用户实际上在我的网站上登录的时间超过 60 分钟,但 Google 拒绝 API-调用(因为 Google 令牌已过期) .

我知道我可以通过设置 access_type=offline 来请求 refresh_token,但这会添加权限 Have offline access。我不想那样,我只想将数据上传到用户的云端硬盘,如果他单击我页面上的转换按钮。我不想向用户询问我不需要的权限。如果我(作为用户)将 link 我的 Google 帐户放在类似的页面上,并且该工具要求离线访问,老实说,我不会批准 - 该许可听起来像工具创建者可以做的他想什么时候用你的帐户做什么...有很多工具可以对用户的驱动器进行写访问,而无需请求离线访问,并且只需一次登录,直到用户撤销权限。这是怎么做到的?

有没有办法让 Google API 调用 而无需 请求离线访问并且 无需 强制用户每 60 分钟一次又一次地批准该应用程序(已被他批准)?

提前致谢, phlo

请求离线访问即表示您请求刷新令牌。 Google 将告诉用户您正在请求离线访问。您可以在不告诉用户他们授权什么的情况下请求某些东西。

不,如果不显示该消息,就无法请求刷新令牌。您也没有办法更改消息,这是标准 Google 的事情。

有没有办法进行 Google API 调用而不要求离线访问并且不强制用户再次批准应用程序(已经被他批准)然后每 60 分钟一次?

是的,有很多方法,但这取决于您的用例的具体情况。比如你的代码是在服务器上Java/php/etc运行,还是在浏览器里JavaScript运行?

运行 您在浏览器中的身份验证可能是最简单的解决方案,因为 Google 库 (https://developers.google.com/api-client-library/javascript/features/authentication) 会为您完成所有工作。

我找到了解决方案!

先决条件

  1. 在您客户的仪表板中启用 Use Auth0 instead of the IdP to do Single Sign On
  2. 创建一个新的 Angular-route 来处理静默登录回调(例如 /sso
  3. 添加

    $rootScope.$on("$locationChangeStart", function() {
        if ($location.path().indexOf("sso") == -1) {
            authService.relogin(); //this is your own service
        }
    });
    

    到您的 run-function 并将 angularAuth0Provider.init() 中的 callbackURL 设置为新的 Angular-route (<YOUR_DOMAIN>/sso)。将此 URL 添加到您在 Auth0 仪表板中接受的回调 - 这不会以无限循环结束,因为 locationChangeStart-事件不会为此路线调用 authService.relogin()[=26] =]

  4. $window.close(); 添加到 Angular-route 的控制器 (/sso) 到 auto-close 弹出
  5. 通过 Auth0 验证用户并将时间戳和 Auth0-access_token 保存在某处

重新加载时:

检查 Auth0 令牌在 authService.relogin() 中是否仍然有效。如果没有,用户必须以任何一种方式重新登录。如果令牌有效并且 Google 令牌即将过期(使用保存的时间戳检查以防止不必要的 API 调用)检查 SSO-data 并静默登录,如果存在

    /* ... */
    if (validToken && googleExpired) {
        angularAuth0.getSSOData(function (err, data) {
            var lastUsedConnection = data.lastUsedConnection;
            var connectionName = (_.isUndefined(lastUsedConnection) ? undefined : lastUsedConnection.name);
            var isGoogle = (_.isUndefined(connectionName) ? false : connectionName == "google-oauth2");
            if (!err && data.sso && isGoogle) {
                authManager.authenticate();
                localStorage.setItem("last-relogin", new Date().getTime());
                angularAuth0.signin({
                    popup: true,
                    connection: data.lastUsedConnection.name
                });
            }
        });
    }

现在您将为该用户找到一个新的 Google access_token(无需离线访问)


资源: