如何使用EasyAuth从Azure web应用程序内的Shiny服务器获取用户信息



我在使用azure的EasyAuth的azure应用程序服务中有一个闪亮的应用程序。我可以成功通过身份验证打开页面。然而,我想获得不是自动的用户信息,因为Shiny在不购买完整专业版的情况下删除了标题。

我可以想出一些高级别的潜在解决方案,但我不确定如果不尝试全面实施每一个,这些解决方案的效果如何。

  1. 在Shiny前面放一个nginx或apache反向代理,它会将头重写为查询参数,然后可以作为session[['clientData']]$url_searchPro访问:我很确定这会起作用。Con:我认为人们可以通过更改地址中的查询来欺骗自己,而且他们会看到自己的名字附加在url上,这会让复制粘贴变得很痛苦。这并不是一个破坏交易的因素,因为这只是为了方便,而不是安全,每个人都可以访问任何东西(至少目前(

  2. 访问安全&来自服务器的HTTPonly-AppServiceAuthSession cookie,然后httr::GETmyurl.com/.auth/me使用该cookie来获得用户身份的简明json。Pro:如果可能的话,那么我不必像#1中那样重新配置我的Docker映像。缺点:我似乎无法很容易地将cookie放入光泽中,所以这可能不是一个潜在的

  3. 让客户端浏览器通过js脚本访问myurl.com/.auth/me,并将这些结果返回到闪亮的服务器。Pro:就像2一样,不需要重新配置我的应用程序服务。Con:不知道是否可能,但它是同一个域,所以我认为是。

如果2和3可以快速实现或100%排除,那将是最有帮助的。如果有第四种选择是我没有想到的,那也很受欢迎。

我最终找到了#3。

这是R/Shiny代码

library(shiny)
library(rjson)
library(shinyjs)
addResourcePath("www", "www")
shinyApp(
ui=(
fluidPage(
tags$head(
tags$script(src = "www/script.js")
),
useShinyjs(),
verbatimTextOutput("results")
)
),
server = function(input, output, session) {
shinyjs::runjs('fetchUser();')
output$results = renderPrint({
parsed<-try(fromJSON(json_str=input$username))
if(!any(class(parsed)=="try-error"))  return(parsed[[1]]$user_id)
})
}
)

这是script.js,它将放在www文件夹中

// script.js
async function fetchUser() {
let response = await fetch('/.auth/me');
if (response.status ===200) {
let data = await response.text();
Shiny.setInputValue('username', await data);
}
} 

我把它和JS for R的书、关于JS函数获取的指南以及关于shinyjs的一些不同的问题拼凑在一起。我猜,如果有人真的想,他们可以拦截JS脚本,这样他们就可以返回他们想要的东西,而不是来自/.auth/me的东西,但由于这只有在验证AD身份验证后才能实现,而且在我的情况下,这主要是为了方便而非安全,我并不太担心。好消息是,返回的json提供了一个令牌,我认为,您可以独立验证的身份。

最新更新