Olá! Estou desenvolvendo um aplicativo interativo com Flexdashboard e gostaria de hospedar no shinyapps.io, mas queria colocar uma tela de autenticação para que somente que tivesse usuário e senha conseguisse acesso. Existe alguma maneira de implementar esse serviço de autenticação no Flexdashboard? Pesquisando, encontrei alguns exemplos para isso no shiny, mas que envolve construir os server.r e ui.r, que não utilizo no Flexdashboard.
Olá, Davi. Então, até tem como fazer o que pede com shinymanager
. Porém, há de se ressaltar uma certa insegurança neste processo devido ao ponto que você mesmo mencionou (de não utilizar server.r
e ui.r
).
Primeiro, vou lhe fornecer o código necessário para criar esta autenticação:
---
title: "Old Faithful Eruptions"
runtime: shiny
output:
flexdashboard::flex_dashboard
---
```{r include=FALSE}
library(datasets)
library(shiny)
library(flexdashboard)
library(shinymanager)
data(faithful)
# define credentials
credentials <- data.frame(
user = c("davi", "cursor"),
password = c("lucena", "cursor"),
stringsAsFactors = FALSE
)
/*você precisa deste CSS para criar a tela de login*/
.panel-auth {
position: fixed;
top:0;
bottom: 0;
left: 0;
right: 0;
background-color: #FFF;
opacity: 1;
z-index: 99997;
overflow-x: hidden;
overflow-y: scroll;
}
Column {.sidebar}
-----------------------------------------------------------------------
Waiting time between eruptions and the duration of the eruption for the
Old Faithful geyser in Yellowstone National Park, Wyoming, USA.
```{r}
selectInput("n_breaks", label = "Number of bins:",
choices = c(10, 20, 35, 50), selected = 20)
sliderInput("bw_adjust", label = "Bandwidth adjustment:",
min = 0.2, max = 2, value = 1, step = 0.2)
Column
-----------------------------------------------------------------------
### Geyser Eruption Duration
```{r}
renderPlot({
hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks),
xlab = "Duration (minutes)", main = "Geyser Eruption Duration")
dens <- density(faithful$eruptions, adjust = input$bw_adjust)
lines(dens, col = "blue")
})
auth_ui(id = "auth")
auth <- callModule(
module = auth_server,
id = "auth",
check_credentials = check_credentials(credentials)
)
Veja as funções que usei neste documento e adapte para sua aplicação.
No entanto, Davi, isso é inseguro para flexdashboard
, pois não é possível inserir a função secure_app
devido o flexdashboard
não ter a divisão server.r
.
Como assim? Significa que se o usuário sabe utilizar o console do navegador, ele conseguirá quebrar essa autenticação.
Veja abaixo o que eu faço após retirar a propriedade position: fixed;
do CSS
:
Eu consigo acessar a aplicação.
Você pode até utilizar javascript
para bloquear alguns shortcuts, como Ctrl + Shif + C e impedir o acesso do usuário ao CSS
(veja mais aqui), mas de nada adiantará se o usuário digitar chrome://inspect/#pages e inspecionar a página. Ele conseguirá avançar.
Na verdade, o shinyapps.io funciona como uma barreira de autenticação natural (até mesmo com a versão gratuita). Como assim? Você sempre digita um nome de usuário e senha para entrar no seu shinyapps.io. Então, tu pode arquivar sua aplicação quando terminar de usar e, autenticar-se novamente e ativá-la, repetindo sempre este processo.
Portanto, há como utilizar autenticação para flexdashboard
, mas não há segurança devido a barreira ser apenas construida pelo CSS
. Caso você trabalhe em algum lugar e precise usar essa autenticação, não use pois os seus dados estarão em risco permanente. Se precisar mesmo de autenticação, recomendo a migração para o shiny
sem flexdashboard
, com uso de ui.r
e server.r
e a possibilidade do emprego da função secure_app
. Ou ainda, pode pagar a versão STANDARD
do shinyapps.io e conseguir se autenticar sem maiores esforços.
Leia mais aqui sobre autenticação em shiny
.