我已经编写了一个在线转换器,并将Auth0集成到我的网站。我试图实现的是将转换后的文件自动上传到登录用户的谷歌硬盘上。我在Auth0中设置了GoogleOAuth,一切似乎都很好。
问题是,谷歌的access\u令牌
在60分钟后过期,我没有refresh\u令牌
。因此,用户需要再次通过Google登录页面登录。这不是我想要的,因为用户在我的网站上的登录时间实际上超过了60分钟,但谷歌拒绝API调用(因为谷歌令牌过期)。
我知道我可以通过设置access_type=离线
请求refresh_token
,但这将添加权限有离线访问
。我不想那样,我只是想上传数据到用户的驱动器,如果他点击了我的页面上的转换按钮。我不想向用户询问我不需要的权限。如果我(作为用户)将我的谷歌帐户链接到一个类似的页面上,并且该工具要求离线访问,老实说,我不会同意的——该权限听起来像是工具创建者可以随时对您的帐户做任何他想做的事情...有许多工具可以对用户的驱动器进行写访问,而无需请求脱机访问,只需一次登录,直到用户撤销权限。那是怎么做到的?
有没有一种方法可以在不要求离线访问的情况下调用Google API,也不强迫用户每60分钟一次又一次地批准应用程序(已经得到他的批准)?
提前谢谢你,菲洛
有没有一种方法可以在不要求离线访问的情况下调用Google API,也不强迫用户每60分钟一次又一次地批准应用程序(已经得到他的批准)?
是的,有很多方法,但这取决于你用例的细节。例如,你的代码是在Java /php/etc运行在服务器上,还是在浏览器中运行JavaScript?
在浏览器中运行auth可能是Google库中最简单的解决方案(https://developers.google.com/api-client-library/javascript/features/authentication)为你做所有的工作。
通过请求脱机访问,您正在请求刷新令牌。谷歌将告诉用户你正在请求离线访问。您可以在不告诉用户授权内容的情况下请求某些内容。
不,没有办法在不显示该消息的情况下请求刷新令牌。你也没有办法改变信息,这是谷歌的标准做法。
我找到解决办法了!
先决条件
>
使用Auth0而不是IdP在客户仪表板中进行单点登录
/sso
)加
$rootScope.$on("$locationChangeStart", function() {
if ($location.path().indexOf("sso") == -1) {
authService.relogin(); //this is your own service
}
});
在angularAuth0Provider中设置
到新的角度路线(callbackURL
。初始化()
重新加载时:
检查Auth0标记在authService中是否仍然有效。重新登录()
。否则,用户必须以任何方式再次登录。如果令牌有效且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
});
}
});
}
现在,您将为该用户找到一个新的Googleaccess\u令牌(无需离线访问)
资源: