You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:22:27