问题描述
我知道SO周围还有其他一些类似的问题(例如here和here),但我想我会再试一次,因为其他人没有得到很多答案。 / p>
我有一个Shiny应用程序,它的用户可以通过该应用程序提供输入,但是这些用户需要跳过身份验证步骤。在googlesheets
的先前版本中,我将该工作表公开(向具有链接的任何人公开),并避免了某些身份验证过程。在更新为googlesheets4
时,我遇到了将更新后的应用程序部署到shinyapps.io的权限问题。这是我尝试过的内容以及获得的结果的摘要。任何指针将不胜感激。
首先,根据this gargle
article中的建议,我创建了一个服务帐户,下载了一个JSON服务帐户令牌(格式为“ project-name-12345678abc1.json”),并将其保存(目前)在父应用程序文件夹(假设需要与应用程序捆绑包一起上传)。然后,我启用了Google Sheets API。
我已将以下命令放在应用程序的前面,而不是任何重要的地方:
-
gs4_deauth()
,因为具有链接的任何人都可以使用google sheet,因此可能不需要令牌。 -
Following this article,
gs4_auth(path = "project-name-12345678abc1.json")
。我还添加了scopes
参数(如下所示)和use_oob=TRUE
。 -
credentials_service_account(scopes = "https://www.googleapis.com/auth/spreadsheets",path = "project-name-12345678abc1.json")
。 -
credentials_app_default(path = "project-name-12345678abc1.json")
结果
大多数组合都会给我错误提示:“无法获取Google凭据”,然后建议我查看gargle网站上的非交互式文章。一个例外是尝试3,它提供了以下错误消息-奇怪的是:
警告:错误:客户端错误:(403)PERMISSION_DENIED
- 客户端没有足够的权限。发生这种情况是因为OAuth 令牌没有正确的范围,客户端没有 权限,或者尚未为客户端项目启用API。
关于我可能会缺少的任何想法吗?该应用程序在本地可以正常运行。
感谢您的帮助。谢谢!
解决方法
已使用this (closed) Github issue中确定的方法解决了此问题。
关键是要严格按照以下步骤操作:
- 致电
gs4_auth(cache = ".secrets")
一次,在浏览器中本地运行应用程序。 - 用
gs4_auth(cache = ".secrets",email = TRUE,use_oob = TRUE)
替换上面的行。 - 将应用程序部署到Shinyapps。
我还清除了以前保存的令牌,这些令牌可能很重要,尽管很难知道。
如Github讨论中所述,可能不需要包含use_oob = TRUE
。另外,该方法在gargle网站上的non-interactive auth文章中有详细介绍。