Skip to content

Instantly share code, notes, and snippets.

@jjesusfilho

jjesusfilho/global.R

Last active Oct 2, 2018
Embed
What would you like to do?
Configurando a autenticação do shiny com o protocolo oauth2, usando o auth0.
library(shiny)
library(jose)
library(httr)
library(jsonlite)
library(stringi)
### Autenticacao ####
## Esta função irá verificar se código pedido está presente na url de retorno.
has_auth_code <- function(params) {
return(!is.null(params$code))
}
audiencia<-audience ## Você pega isso no ítem APIs do auth0 dashboard.
state<-stringi::stri_rand_strings(1,15) %>% ## Cria uma string aleatória para assegurar que a resposta do auth0 se refere a esta requisição.
jose::base64url_encode() ## Ela precisa estar em base64url.
client_id= id_do_aplicativo ## Isto você pega quando cria uma nova aplicação no auth0
client_secret<-segredo_do_aplicativo ## Ídem. Esta é a informação que não pode ser exposta e não pode ser revelada. Ela não pode aparer no UI, somene no server.
scope = "openid" ## Este se refere ao escoplo das informações do usuários que você quer usar. Pode solicitar mais informações, como o perfil para dar
## um tom mais personalizado ao shinyapp.
redirect_uri = "url para callback" ## URL que você coloca no Allowed Callback URLs quando cria a aplicação. Pode ser algo como: https://exemplo.com.br/shiny/meu_app/
response_type = "code" ## Você deve pedir um código para o auth0. Ele virá junto com o state na url resposta. Com isso, você
## verifica se o state é o mesmo que você enviou.
url<- "https://dominio.auth0.com/authorize" ## Este é o seu domínio no auth0 seguido pelo parâmetro authorize, que corresponde à api de pedido do código.
### Com todas essas informações, você monta a url (u) para solicitar.
query = list(state = state,
client_id = client_id,
protocol = "oauth2",
prompt = "",
response_type = "code",
connection = "Username-Password-Authentication",
redirect_uri = redirect_uri,
scope = "openid")
## Provisório, substituir mais adiante pelo
u<-httr::parse_url(url)
u$query<-query
u<-httr::build_url(u)
autorizacao<-function(x){
u
}
### Fim autenticacao ####
## Não esquecer de incluir o argumento session no shinyServer. Pois ele irá salvar as respostas.
shinyServer(function(input, output,session){
## Pega os parâmetros do session. Verifica se o código está lá. Pode verificar também se o state está correto, ou seja, o mesmo criado anteriormente
## e enviado.
params <- parseQueryString(isolate(session$clientData$url_search))
if (!has_auth_code(params)) {
return()
}
code <- params$code
state <- params$state
session_state <- params$session_state
## Aqui você manda um POST para o auth0 informando qual o grant_type que quer. Informa o código "code" recebido. Assim, ele irá
## liberar o acesso ao app, redirecionado.
resp <- httr::POST("https://dominio.auth0.com/oauth/token",
body = list(
client_id = client_id,
scope = scope,
code = code,
redirect_uri = redirect_uri,
grant_type = "authorization_code",
client_secret = client_secret))
respObj <- jsonlite::fromJSON(rawToChar(resp$content)) ## Na resposta, o auth0 irá mandar as informações do usuário que você pediu. Você pode usar essas informações para
### melhorar a relação com o usuário. Ela obedece o protoco JWT e vem em json.
str(respObj)
}
ui <- fluidPage(
## Aqui vai sua ui como qualquer outra.
verbatimTextOutput("texto")
)
## Esta função irá rodar antes do ui. Ela vai verifica se na resposta (na url) do auth0 está o código "code" solicitado.
## Na resposta também vem o state. Você pode comparar com o state que você enviou para ver se ele é o mesmo. Assim, você está seguro de que
## é o próprio auth0 que está respondendo.
## Se a resposta vier conforme esperado, roda o ui.
uiFunc<-function(x){
if(!has_auth_code(parseQueryString(x$QUERY_STRING))){
return(tags$script(HTML(sprintf("location.replace(\"%s\");", u))))
}else{
ui
}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.