我想重用Google Apps脚本项目的OAuth2客户端-秘密,以代表该脚本访问Google API(例如,通过Sheets API读取脚本具有访问权限的电子表格)。拥有Google帐户的用户被授予脚本所需的范围。现在我想用一个新的应用程序替换这个脚本,而不需要再次征求用户的同意。通常,当脚本(或应用程序)运行时,用户将处于脱机状态。
我的第一个问题是,如果这个场景是一个支持的带有Google API授权的OAuth2用例,如果是这样的话,实现它的最佳方法是什么,特别是防止安全问题?
client-secrets.json如下所示:
{"web":{
"client_id": "57...1t.apps.googleusercontent.com",
"project_id": "project-id-95...70",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_secret": "K2...y1",
"redirect_uris": ["https://script.google.com/oauthcallback"]
}}
该文件将与应用程序代码(应用程序引擎)一起部署。但另一个位置(如云存储)也是可能的。
在没有用户的情况下,我希望使用客户端ID和secret的作用域与最初授予脚本的作用域相同,以便从Google授权服务器获取访问令牌,如下所示:
HTTP 200 OK
Content-type: application/json
{
"access_token": "987tghjkiu6trfghjuytrghj",
"scope": "foo bar",
"token_type": "Bearer"
}
我希望使用HTTP承载头中的访问令牌来代表旧脚本对Sheets API进行请求。
我(有限)的理解是,我可以使用grant-typeclient_credentials
从授权服务器获取访问令牌。请求如下所示:
POST /o/oauth2/token
Host: https://accounts.google.com
Content-Type: application/x-www-form-urlencoded
Accept: application/json
Authorization: Basic Base_64_string
grant_type=client_credentials&
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets
其中,基本的HTTP授权是client_id:client_secret
值,由冒号分隔,编码为base64。
如果我将grant_type
或scope
丢弃在正文中,就会得到相应的错误。
上述版本导致:{\n“error”:“invalid_request”\n}
响应,未提供详细信息。我尝试在主体中使用client_id
和client_secret
,同时使用和不使用授权头,但都出现了相同的错误。
首先,让我开始说,我不是一个应用程序脚本或工作表的专家,我已经使用了几次,但我不认为自己是一个专家在这方面的主题。
当您对某人进行身份验证时,他们的身份验证是基于项目中的客户端id授予的。它们将授予您对其数据的访问权限并批准凭据请求。把它想象成谷歌数据库中某个地方的一个记录。
用户321已向客户机123授予了访问其纸张数据的同意。
因此,您有一个project Super Script应用程序,它的客户端id为123,您需要访问编辑表单。如果我批准了它,我将给超级脚本应用程序与客户端id 123访问我的工作表。当我坐在我的机器上时,你的应用程序会运行,访问我的数据。现在,当我注销时,客户端id为123的超级脚本应用程序不能访问我的数据,除非您有脱机访问和刷新令牌。有了刷新令牌,当我不在那里时,您可以通过请求新的访问令牌来访问我的数据。
现在你想做一个新的应用程序。如果你拿着客户端id 123并在你的新应用程序中使用它,我将不得不登录到我的谷歌帐户,但它不会弹出并请求我给你权限访问我的数据,我已经授予客户端id 123访问我的表单。除非您有一个刷新令牌,否则您将无法访问此数据没有我在那里。
如果你在任何时候要求一个额外的范围,我将不得不批准。
现在是有趣的部分。我很久没试过了。如果你进入Google开发者控制台,在同一个项目下创建客户端ID321和客户端ID123,然后在你的新超级脚本应用程序V2中使用它,我是否还必须授予它访问我的数据的权限?我会倾向于可能不是。注意,用客户端id 123创建的刷新令牌将不能与客户端id 321一起工作,它们被锁定到客户端,除非它是移动的,并且有一些魔术他们。
我不是很确定你的第二个应用程序是做什么的,所以我希望这能帮你弄清楚事情。