如何通过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_authcookie无效,因为浏览器仍保留本地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)
方案原理
- 后台触发账号退出:通过
fetch发送带credentials: 'include'的GET请求到账号退出地址,确保携带当前会话cookie,触发账号退出逻辑,该过程在后台静默完成,不跳转页面; - 跳转应用退出:待后台请求完成后,通过
location.href跳转到应用退出地址,完成应用层面的退出,最终实现双重退出并强制重新认证。
注意事项
- 需在shinyapps.io Standard级别及以上私有账号环境测试,由于
login.shinyapps.io与应用域名同属shinyapps.io子域,通常允许带credentials的跨域请求; - 若遇CORS问题,可尝试调换顺序:先跳转到应用退出地址,再在退出后的页面通过
fetch处理账号退出,但这种方式需要额外页面逻辑,不如前者流畅。
内容的提问来源于stack exchange,提问作者bcarothers
相关产品推荐
相关产品推荐

