Criar uma página de login para um flexdashboard

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.

1 Curtida

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.

1 Curtida