关于使用R pins包的board_gdrive()时避免Google Drive手动身份验证的技术咨询
使用R pins包的board_gdrive()时避免Google Drive手动身份验证的技术咨询
你好!要解决Shiny应用中使用board_gdrive()时需要手动Google Drive认证的问题,核心是使用Google Cloud服务账号进行无交互认证,这样服务器就能自动完成身份验证,不需要手动干预。下面是具体的实现步骤和代码:
步骤1:创建并配置Google Cloud服务账号
- 登录Google Cloud控制台,创建一个新项目(或使用现有项目)。
- 在"IAM与管理" > "服务账号"页面,创建新的服务账号,记录下服务账号的邮箱地址(后续需要给这个邮箱共享Drive文件夹权限)。
- 点击服务账号的"密钥"选项卡,添加密钥 > 创建新密钥,选择JSON格式,下载密钥文件到本地(妥善保管,不要泄露)。
步骤2:给服务账号分配Drive文件夹权限
- 打开你的目标Google Drive文件夹,点击"共享"按钮,将步骤1中得到的服务账号邮箱添加为成员,根据需求赋予"查看者"或"编辑者"权限。
步骤3:修改R/Shiny代码实现无交互认证
你可以通过两种方式实现认证,任选其一即可:
方式一:通过环境变量指定密钥(推荐)
# 设置环境变量指向服务账号密钥文件(注意路径要正确,部署时需确保服务器能访问到该文件) Sys.setenv("GOOGLE_APPLICATION_CREDENTIALS" = "path/to/your/service-account-key.json") # 无交互初始化Google Drive认证 googledrive::drive_auth(service_account = TRUE) # 创建Google Drive board board <- pins::board_gdrive(googledrive::as_id("https://drive.google.com/drive/folders/my-folder-abc123"))
方式二:直接在board_gdrive中指定认证参数
board <- pins::board_gdrive( board_id = googledrive::as_id("https://drive.google.com/drive/folders/my-folder-abc123"), auth = googledrive::drive_auth( service_account = TRUE, path = "path/to/your/service-account-key.json" ) )
注意事项
- 密钥文件包含敏感信息,不要上传到公开版本控制系统(比如GitHub),可以将其添加到
.gitignore文件中。 - 如果部署到Shiny托管平台(比如shinyapps.io),需要将密钥文件一同上传到服务器,或者在平台的环境变量设置中配置
GOOGLE_APPLICATION_CREDENTIALS指向密钥文件的路径。 - 确保服务账号的权限与你的需求匹配:如果只需要读取pin数据,赋予"查看者"权限即可;如果需要写入数据,则需赋予"编辑者"权限。
备注:内容来源于stack exchange,提问作者Ryan Garnett




