我希望重复 Google Apps脚本项目的OAuth2客户端密码,以代表此脚本访问Google API(例如,通过Sheets API读取脚本可访问的电子表格)。拥有Google帐户的用户授予该脚本必要的范围。现在,我想用新的应用程序替换脚本,而无需再次询问用户用户同意。通常,当脚本(或应用程序)运行时,用户将处于脱机状态。
我的第一个问题是,如果此方案是受支持的OAuth2用例与Google API授权,如果是,那么实施它的最佳方法是什么,尤其是为了防止出现安全问题?
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"]
}}
该文件将使用应用代码(App Engine)进行部署。但是可以使用云存储等备用位置。
如果没有用户,我想使用最初授予脚本的相同作用域的客户端ID和机密,以便从Google授权服务器获取访问令牌,如下所示:
HTTP 200 OK
Content-type: application/json
{
"access_token": "987tghjkiu6trfghjuytrghj",
"scope": "foo bar",
"token_type": "Bearer"
}
我想使用HTTP Bearer标头中的访问令牌代表旧脚本对Sheets API的请求。
我(有限)的理解是,我可以使用grant-type client_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
结合使用和不使用Authorization标头,但都具有相同的错误。
答案 0 :(得分:1)
首先让我首先说我不是应用程序脚本或工作表的专家,我已经使用了几次,但我不认为自己是这个主题的专家。
当您根据项目中的客户端ID验证某人的身份验证时。他们授予您访问其数据和批准凭据请求的权限。可以把它想象成谷歌数据库的某个地方。
用户321已同意客户123访问其工作表数据。
所以你有一个项目超级脚本应用程序,它有客户端ID 123,你要求访问编辑表。如果我批准它我给超级脚本应用程序与客户端ID 123访问我的工作表。当我坐在我的机器上时,您的应用程序将运行访问我的数据。现在,当我使用客户端ID 123注销超级脚本应用程序时,除非您具有脱机访问权限并具有刷新令牌,否则无法访问我的数据。使用该刷新令牌,当我不在时,您可以通过请求新的访问令牌来访问我的数据。
现在你想制作一款新应用。如果您使用客户端ID 123并在新应用程序中使用它,我将不得不登录到我的谷歌帐户,但它不会弹出并请求我授予您访问我的数据的权限我已授予客户端ID 123访问权限我的床单。除非你有刷新令牌,否则我将无法访问这些数据。
如果您在任何时候要求额外的范围,我将不得不批准。
现在来了有趣的部分。我有一段时间没试过这个。如果您转到Google Developer控制台并在与客户端ID 123相同的项目下创建客户端ID 321,然后在新的Super Script App V2中使用它,我仍然必须授予它访问我的数据的权限吗?我可能会倾向于倾斜。请注意,使用客户端ID 123创建的刷新令牌不能与客户端ID 321一起使用,它们将被锁定到客户端,除非它是移动设备并且有一些魔法。
我不完全确定您在使用第二个应用程序时正在做什么,所以我希望这有助于清理问题。