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

如何通过Shiny的actionButton依次访问URL实现shinyapps.io彻底退出

实现shinyapps.io无缝双重退出方案

问题概述

shinyapps.io的认证依赖会话cookie,但浏览器对这类cookie的保留时长超出预期,导致仅访问应用退出地址 https://accountName.shinyapps.io/appName/__logout__(替换accountName和appName)无法强制触发重新认证。必须同时完成应用退出和账号退出(访问https://login.shinyapps.io/logout)才能彻底退出,但手动操作两步过于繁琐。

现有方案的问题

此前的尝试均存在缺陷:

  • 使用window.open打开账号退出地址会被浏览器弹窗拦截,即使允许也会生成新标签页,体验不佳;
  • 连续调用location.href或window.location.replace只会执行最后一个跳转,无法完成双重退出;
  • 服务器端通过cookies包删除therealshinyapps和shinyapps_auth cookie无效,因为浏览器仍保留本地cookie。

可行解决方案

利用JavaScript的fetch API在后台静默处理账号退出请求,完成后再跳转到应用退出地址,实现无弹窗、单标签页的无缝退出。代码示例如下:

library(shiny)

ui <- fluidPage(
    titlePanel("Logout Test"),
    
    actionButton(
      inputId = "logout",
      label = "Log out",
      # 替换accountName和appName为实际值
      onclick = "fetch('https://login.shinyapps.io/logout', {method: 'GET', credentials: 'include'}).then(() => location.href='https://accountName.shinyapps.io/appName/__logout__');"
    )
)

server <- function(input, output) {
  # 无需额外服务器逻辑
}

shinyApp(ui = ui, server = server)

方案原理

  1. 后台触发账号退出:通过fetch发送带credentials: 'include'的GET请求到账号退出地址,确保携带当前会话cookie,触发账号退出逻辑,该过程在后台静默完成,不跳转页面;
  2. 跳转应用退出:待后台请求完成后,通过location.href跳转到应用退出地址,完成应用层面的退出,最终实现双重退出并强制重新认证。

注意事项

  • 需在shinyapps.io Standard级别及以上私有账号环境测试,由于login.shinyapps.io与应用域名同属shinyapps.io子域,通常允许带credentials的跨域请求;
  • 若遇CORS问题,可尝试调换顺序:先跳转到应用退出地址,再在退出后的页面通过fetch处理账号退出,但这种方式需要额外页面逻辑,不如前者流畅。

内容的提问来源于stack exchange,提问作者bcarothers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:44:51