使用Googlesheets4通过Shiny应用授权非交互式使用googlesheets4

问题描述

我知道SO周围还有其他一些类似的问题(例如herehere),但我想我会再试一次,因为其他人没有得到很多答案。 / p>

我有一个Shiny应用程序,它的用户可以通过该应用程序提供输入,但是这些用户需要跳过身份验证步骤。在googlesheets的先前版本中,我将该工作表公开(向具有链接的任何人公开),并避免了某些身份验证过程。在更新为googlesheets4时,我遇到了将更新后的应用程序部署到shinyapps.io的权限问题。这是我尝试过的内容以及获得的结果的摘要。任何指针将不胜感激。

首先,根据this gargle article中的建议,我创建了一个服务帐户,下载了一个JSON服务帐户令牌(格式为“ project-name-12345678abc1.json”),并将其保存(目前)在父应用程序文件夹(假设需要与应用程序捆绑包一起上传)。然后,我启用了Google Sheets API。

我已将以下命令放在应用程序的前面,而不是任何重要的地方:

  1. gs4_deauth(),因为具有链接的任何人都可以使用google sheet,因此可能不需要令牌。

  2. Following this articlegs4_auth(path = "project-name-12345678abc1.json")。我还添加scopes参数(如下所示)和use_oob=TRUE

  3. credentials_service_account(scopes = "https://www.googleapis.com/auth/spreadsheets",path = "project-name-12345678abc1.json")

  4. credentials_app_default(path = "project-name-12345678abc1.json")

结果

大多数组合都会给我错误提示:“无法获取Google凭据”,然后建议我查看gargle网站上的非交互式文章一个例外是尝试3,它提供了以下错误消息-奇怪的是:

警告:错误:客户端错误:(403)PERMISSION_DENIED

  • 客户端没有足够的权限。发生这种情况是因为OAuth 令牌没有正确的范围,客户端没有 权限,或者尚未为客户端项目启用API。

关于我可能会缺少的任何想法吗?该应用程序在本地可以正常运行。

感谢您的帮助。谢谢!

解决方法

已使用this (closed) Github issue中确定的方法解决了此问题。

关键是要严格按照以下步骤操作:

  1. 致电gs4_auth(cache = ".secrets") 一次,在浏览器中本地运行应用程序。
  2. gs4_auth(cache = ".secrets",email = TRUE,use_oob = TRUE)替换上面的行。
  3. 将应用程序部署到Shinyapps。

我还清除了以前保存的令牌,这些令牌可能很重要,尽管很难知道。

如Github讨论中所述,可能不需要包含use_oob = TRUE。另外,该方法在gargle网站上的non-interactive auth文章中有详细介绍。