努力在 shinyapps.io 中将我自己的 API 密钥与 googlesheets4 结合使用

Struggling to use my own API key with googlesheets4 in shinyapps.io

我使用以下代码在 shinyapps.io 中使用 googlesheets4:

  gs4_auth(
email = "me@email.com",
path = NULL,
scopes = "https://www.googleapis.com/auth/drive",
cache = "path_to_cache",
use_oob = FALSE,
token = NULL)

我在本地 运行 这需要初始浏览器身份验证并下载某种文件。

只要我将该文件与我的应用程序一起上传到 shinyapps.io,它就可以工作(即在需要时刷新令牌)。

但是,据我了解,这是使用 googlesheets4 自己的 Google API 设置,设置这些设置是为了方便大家使用。

缺点是,由于很多人都在共享这个 API,他们有时(包括我自己)达到数据限制并收到 429 资源耗尽错误。这是讨论here

好的,所以我按照说明 here and here 并在已提供的身份验证块之前添加了以下代码:

if (interactive()){
  # Desktop Client ID
  google_app <- httr::oauth_app(
    "my-awesome-google-api-wrapping-package",
    key = "mykey_for_desktop_app",
    secret = "mysecret"
  )
}else{
  # Web Client ID
  google_app <- httr::oauth_app(
    "my-awesome-google-api-wrapping-package",
    key = "mykey_for_web_app",
    secret = "mysecret"
  )
}

# API key
google_key <- "My-API-KEY"
gs4_auth_configure(app = google_app, api_key = google_key)
# Also configure google drive to use my API
drive_auth_configure(app = google_app, api_key = google_key)

所以这似乎在本地工作(例如在 RStudio 中),我可以在我的 Google 云 API 仪表板上看到 activity。

然而,虽然这在短时间内有效(例如 10 分钟),但即使上传到 shinyapps.io,自动刷新似乎也失败了,因为我很快就遇到了可怕的事情:

“无法获得 Google 凭据。您是否在非交互式会话中 运行ning googlesheets4?”

有谁能指出我做错了什么吗?

同样 - 只要我不尝试使用我自己的 API 设置(第二个代码块),它就可以正常工作。

好的,很确定我已经开始工作了...

是YouTube视频here that really helped, and made this更清晰。

我只需要一个服务帐户,它似乎可以生成一个 json 文件,我可以使用我的应用程序上传该文件。

即视频中 1:03 左右显示了创建此服务帐户,然后将该电子邮件地址(服务帐户的)添加到我要访问的 Google Sheet(s) ,这意味着我可以下载(使用 Google 驱动器)和写入(使用 GoogleSheets)。

疯狂的是,我需要在我的代码中输入以下内容:

drive_auth(path = ".secrets/client_secret.json")
gs4_auth(path = ".secrets/client_secret.json")

即这两行(加上为服务帐户下载的 json 文件)替换了我在 OP 中发布的所有代码!

如果有人正在阅读这篇文章,我正在为 Jimbo(出色的)答案的最后一步而苦苦挣扎,即如何将本地 json 文件上传到 shinyapps.io。

我的工作解决方案:我在 app.r 文件旁边的 shiny app 文件夹中创建了一个名为“secrets”的子文件夹。我把 json 文件放在那里。在本地测试所有内容时,我确保将我的工作目录设置为闪亮的应用程序。 (注意:不要在闪亮的应用程序代码中包含 setwd() 代码)。我不确定这是否会以某种方式公开 json 文件,但它必须这样做。

发布到 shinyapps 时,我勾选了 Rstudio 建议的所有复选框以上传文件夹的全部内容(app.r 文件、子文件夹 + json 子文件夹中的文件)。我在 app.r 文件中使用了以下路径:

drive_auth(path = "secret/clientsecret.json")
gs4_auth(path = "secret/clientsecret.json")