google-apps-script - 每次调用gapi.auth.authorize的替代方法

标签 google-apps-script oauth-2.0 google-api google-oauth

我有一个单页网络应用程序,它使用 Google Apps 脚本执行 API 来调用返回我需要的数据的函数。我的项目基于 quick start sample code provided by Google .

这需要使用 OAuth,我通过使用 the client JavaScript library provided by Google 的函数来实现这一点.

第一次要求用户进行身份验证时,以下函数与immediate: false一起使用:

gapi.auth.authorize({client_id: CLIENT_ID, scope: SCOPES, immediate: false}, handler);

后续 API 请求还必须提供身份验证 token ,因此我调用相同的函数,但使用 immediate: true :

gapi.auth.authorize({'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': true}, handler);

每次,gapi.auth.authorize称为,一个新的 IFRAME添加到页面中,貌似是存储认证操作的结果/token等。

所以,是的,一切正常,但我认为必须有更好的方法来做到这一点。

在初始身份验证后,是否有另一种方法可以进行后续 API 调用,而无需使用 gapi.auth.authorize并添加另一个 IFRAME到页面?

根据谷歌的说法:

Notes

After the initial user authorization, calls to gapi.auth.authorize that use immediate:true mode will obtain an auth token without user interaction.

最佳答案

简而言之,除非您使用“离线”模式,否则您无法避免 iframe(或弹出窗口,这是较旧的方式)。交易如下:
有两种不同的方式来请求权限:“离线”或“非离线”。

离线中,oauth2 通过向您提供“刷新 token ”来为您提供永久权限(好吧,如果用户从 Google 帐户安全页面撤销权限,或者对于某些范围而言,这并不是真正的永久权限)如果用户更改密码)。

此特殊 token 允许您随时通过简单地对 API 进行“GET”调用来创建新的访问 token ,而无需任何用户干预。 就您而言,这就是您需要的模式,没有办法绕过它,这就是它存在的原因,您必须特别小心以安全地存储它等等。

非离线模式下,您仅获得临时权限(“访问 token ”将在1小时后过期),而不会获得“刷新 token ”。但这是如何运作的呢?某处必须有一些刷新 token 或存储的私有(private)内容。

Authentication using the Google APIs Client Library for JavaScript利用浏览器安全功能来做到这一点。特别是,浏览器会保护每个子域的存储和 cookie,一旦您登录到浏览器,google.com 将存储或使用 cookie 来保护发送给 google 的参数以验证您的身份。
那么,如何读取这些值呢?打开 google.com url 是让 javascript 读取值的唯一方法。 Google 允许使用特殊参数,以便它可以传回访问 token 。如何打开页面?通过“iframe”或“popup”是浏览器当前支持的唯一方式。

这使得谷歌页面可以像安全代理一样向谷歌请求信息。 iframe 或打开 Google 页面(作为弹出窗口)的页面无法伪造自己的 URL,因此该“代理”知道哪个页面正在请求数据。然后,代理可以通过谷歌服务器验证调用者拥有的范围,并返回一个新的访问 token 。黑客无法从服务器伪造此信息,因为它没有所需的 cookie(存储在每个用户浏览器的 google 子域下,这是“在线”模式工作的唯一地方。)

在浏览器保护 iframe 之前,“popup”是较旧的方式,但当弹出窗口打开并立即关闭时,它至少会导致“闪烁”(在上面的链接中搜索“jarring”)

因此,后来Google提供了“iframe”模式,提供了更流畅的体验。使用 iframe 就是上面链接提到的“立即”模式。

TLDR:必须使用“离线”或破解用户的浏览器。

关于google-apps-script - 每次调用gapi.auth.authorize的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34342113/

相关文章:

google-apps-script - 无法更改 Apps 脚本的 Cloud 项目

logging - 我无法再从 Google Apps 脚本中找到日志(由 Logger 创建)

google-apps-script - Drive.Files.Copy 和 "parents"不工作

java - 找不到 UsernamePasswordAuthenticationToken 的 AuthenticationProvider - Spring-boot + Oauth2 : Restful API

android - 将 Google API Java 客户端库和日历 API Java 库添加到 Maven 依赖项

javascript - 如何让按钮拾取功能

oauth-2.0 - Blazor 和 OAuth JWT 不记名 token 存储

oauth - 无法从 Thinktecture 授权服务器获取 token

android - 如何在多项 Activity 中正确使用 Google Plus 登录?

go - 使用 Golang 客户端库向 GCP Compute 批量请求