是否可以使用Google Apps脚本项目的客户端密码文件从Google检索OAuth2访问令牌?

时间:2018-04-08 18:51:22

标签: oauth-2.0 google-api google-sheets-api google-oauth2 google-identity

我希望重复 Google Apps脚本项目的OAuth2客户端密码,以代表此脚本访问Google API(例如,通过Sheets API读取脚本可访问的电子表格)。拥有Google帐户的用户授予该脚本必要的范围。现在,我想用新的应用程序替换脚本,而无需再次询问用户用户同意。通常,当脚本(或应用程序)运行时,用户将处于脱机状态。

我的第一个问题是,如果此方案是受支持的OAuth2用例与Google API授权,如果是,那么实施它的最佳方法是什么,尤其是为了防止出现安全问题?

脚本

的客户机密
  1. 来自Google API Console, under Credentials的脚本的OAuth2客户机密钥文件。另请参阅Credentials, access, security, and identitySetting up OAuth 2.0
  2. 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)进行部署。但是可以使用云存储等备用位置。

    OAuth2访问令牌

    如果没有用户,我想使用最初授予脚本的相同作用域的客户端ID和机密,以便从Google授权服务器获取访问令牌,如下所示:

    HTTP 200 OK
    Content-type: application/json
    {
    "access_token": "987tghjkiu6trfghjuytrghj",
    "scope": "foo bar",
    "token_type": "Bearer"
    }
    

    我想使用HTTP Bearer标头中的访问令牌代表旧脚本对Sheets API的请求。

    Client_credentials请求授权服务器

    我(有限)的理解是,我可以使用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_typescope身体,我会收到相应的错误。

    上述版本导致:{\n "error" : "invalid_request"\n}响应,未提供任何细节。我已尝试使用client_idclient_secret结合使用和不使用Authorization标头,但都具有相同的错误。

1 个答案:

答案 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一起使用,它们将被锁定到客户端,除非它是移动设备并且有一些魔法

我不完全确定您在使用第二个应用程序时正在做什么,所以我希望这有助于清理问题。