Gmailr在Shiny Server中无法验证存储令牌问题求助
解决方案:Shiny Server下gmailr更换邮箱后授权失败问题
1. 确认Google Cloud项目配置正确性
- 新邮箱需加入Gmail API的授权用户列表(若为谷歌工作区账号,需管理员完成域内授权)
- 确保OAuth客户端ID类型为Desktop app(非交互式环境适配性更强)
- 检查客户端密钥文件(
new_my.json)是否为新邮箱对应的配置文件,而非旧文件复用
2. 重新生成非交互式环境适配的令牌
在本地RStudio(交互式环境)中执行以下代码,生成适配服务器的缓存:
library(gmailr) # 加载新的客户端密钥文件 gm_auth_configure(path = "new_my.json") # 生成新缓存文件夹 options( gargle_oauth_cache = ".secret_new", gargle_oauth_email = "new_email@myorg.io" ) # 启用离线授权模式,完成新邮箱授权 gm_auth(email = "new_email@myorg.io", use_oob = TRUE)
授权完成后,将.secret_new文件夹完整复制到Shiny Server的应用目录,并设置权限:
# 服务器端执行,确保Shiny进程可读取缓存 chmod -R 755 /srv/shiny-server/your_app/.secret_new
3. 修改Shiny应用授权代码
避免依赖全局选项,直接在代码中明确指定参数,路径建议使用绝对路径:
library(gmailr) # 配置客户端密钥 gm_auth_configure(path = "/srv/shiny-server/your_app/new_my.json") # 非交互式环境强制指定授权参数 gm_auth( email = "new_email@myorg.io", cache = "/srv/shiny-server/your_app/.secret_new", use_oob = TRUE )
4. 环境与权限排查
- 更新依赖包至最新版本,避免OAuth兼容性问题:
install.packages(c("gargle", "gmailr")) - 删除服务器上的旧缓存文件夹(如
.secret),避免新旧缓存冲突 - 验证Shiny进程用户(通常为
shiny用户)对密钥文件和缓存文件夹的读取权限
5. 服务器端测试授权有效性
以shiny用户身份在服务器上运行测试脚本,确认授权是否正常:
sudo -u shiny Rscript -e ' library(gmailr) gm_auth_configure(path = "/srv/shiny-server/your_app/new_my.json") gm_auth(email = "new_email@myorg.io", cache = "/srv/shiny-server/your_app/.secret_new", use_oob = TRUE) # 发送测试邮件验证 test_mime <- gm_mime() %>% gm_to("your_test_email@example.com") %>% gm_subject("Shiny Gmailr Test") %>% gm_text_body("Authorization works!") gm_send_message(test_mime) '
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

