繁体   English   中英

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 我不想那样,我只想将数据上传到用户的云端硬盘,如果他点击了我页面上的转换按钮。 我不想要求用户提供我不需要的权限。 如果我(作为用户)将我的Google帐户链接到类似的页面上并且该工具要求离线访问我不会批准,说实话 - 权限听起来像工具创建者可以随时随地使用您的帐户执行任何操作想要...有很多工具可以对用户的驱动器进行写访问,而无需离线访问,只需一次登录,直到用户撤销权限。 怎么做的?

有没有办法在要求离线访问的情况下进行Google API调用,并且没有强制用户每隔60分钟一次又一次地强制批准应用程序(已经获得他批准)?

在此先感谢,phlo

通过要求离线访问,您正在请求刷新令牌。 谷歌将告诉用户您正在请求离线访问。 您可以在不告诉用户他们授权的内容的情况下请求某些内容。

没有办法在没有显示该消息的情况下请求刷新令牌。 也没有办法让你改变它是一个标准谷歌的消息。

有没有办法在不要求离线访问的情况下进行Google API调用,并且没有强制用户每隔60分钟一次又一次地强制批准应用程序(已经获得他批准)?

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

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

我找到了解决方案!

Prerequirements

  1. 启用Use Auth0 instead of the IdP to do Single Sign On在客户端的仪表板中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 -event不会为此路由调用authService.relogin()

  4. 添加$window.close(); 到Angular-route( /sso )的控制器自动关闭弹出窗口
  5. 通过Auth0对用户进行身份验证,并在某处保存时间戳和Auth0- access_token

重装时:

如果Auth0-token在authService.relogin()仍然有效,请authService.relogin() 如果没有,用户必须再次登录。 如果令牌有效且Google令牌即将过期(请使用保存的时间戳检查以防止不必要的API调用)检查SSO数据并以静默方式登录(如果存在)

    /* ... */
    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 (无需离线访问)


资源:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM