Итак, у меня есть приложение Rshiny, настроенное на publi sh на сервере, но нам нужен токен аутентификации API, чтобы гарантировать, что данный пользователь имеет доступ. Процесс аутентификации обрабатывается в тегах JS вне приложения, в то время как фактический процесс Rshiny хранится в iFrame на странице.
У меня есть сценарий js, сохраненный извне в подкаталоге www /, упакованном с приложением. Сценарий JS запрашивает значение в localStorage для определения идентификатора пользователя и пингует проверку API с этим токеном для определения доступа. Похоже на это (выборка - это настраиваемая функция, которая запрашивает локальное хранилище для установки значения аутентификации).
/**
* This Fn ! using to vaidate the user login access
* @param none
*/
(function validateUserLoginInfo() {
console.log("Sending user acess");
var url = `https://authentication-url.com/isAuthy `;
fetch(url, { method: 'GET' }, function (response) {
if (response) {
// user validation is Successfully done
// $("#userValidated").val("Yes");
} else {
//invalid user access/login failure
//Shiny.setInputValue("userValidated","No")
// $("#userValidated").val("No");
}
});
})(); // => self executing Fn !
То, что я, по сути, пытаюсь сделать, - это запустить эту JS функцию, так что успех дает ввод, переданный в среду сервера Rshiny, например input $ isUserValidated, поэтому я могу маршрутизировать процессы приложения и предупреждать экземпляр о том, что у пользователя нет доступа. Я настроил его так, что текст страницы «Добро пожаловать» изменяется на основе этого проверочного ответа, а фактические вкладки с анализом впоследствии скрываются от экземпляра.
В вызовах if (response) else
в функции JS закомментированные строки - это попытки передать ответ серверной среде, но они не сработали. И я считаю, что способ, которым я вызываю эту функцию из приложения, работает, но я не уверен, действительно ли работает функция validateUserLoginInfo.
Так что я могу разбить свою путаницу на два шага
После получения скрипта через tags$head(tags$script(type="text/javascript", src = "www/authenticateUser.js"))
или includeScript('www/authenticateUser.js')
как я могу запустить фактическую функцию validateUserLoginInfo()
с сервера r? Или он уже запускается автоматически при загрузке приложения?
После вызова validateUserLoginInfo()
, как я могу передать ответ от этого вызова, чтобы сервер R мог его использовать?
Вот, надеюсь, простое приложение, которое улавливает то, что я ищу. Функцию AuthenticateUser. js можно рассматривать как функцию, которая возвращает просто «Да» или «Нет», и я просто пытаюсь получить доступ к этому ответу с сервера R.
ui <- fluidPage(
includeScript('www/authenticateUser.js')
textOutput('authed'),
)
server <- function(input,output,session){
output$authed <- renderText({
# No clue which one of these works; none have worked for me so far
response <- input$userValidated
response2 <- validateUserLoginInfo()
response3 <- shinyjs::js$validateUserLoginInfo()
return(c(response,response2,response3))
})
}
Я искал ответы повсюду и, похоже, не нашел ничего, что помогло бы мне достичь sh здесь. Отправка предупреждений или событий onClick из JS <-> Shiny, похоже, является тем, что большинство людей используют JS для Rshiny. Так что любая помощь приветствуется. Спасибо.