8 Utiliser l’authentification
Quel que soit le mode d’authentifiaction de votre application Shiny, les identifiants d’accès (clés API, mots de passe, secrets, etc.) ne doivent jamais être écrits en clair dans le code.
Pour une gestion sécurisée de vos identifiants :
- Consultez la section sur la gestion des variables secrètes
- Utilisez des variables d’environnement
- Dans SK8, utilisez les variables CI/CD sécurisées pour récupérer les valeurs de ces variables d’environnement
Nous présentons ici comment intégrer l’authentification centralisée d’INRAE dans votre application Shiny :
comment utiliser le SSO INRAE avec le protocole OIDC pour les URL SK8 classiques (hors catalogue).
8.0.1 Demande de rattachement
Pour que l’authentification fonctionne l’application (URL) doit être déclaré coté DSI INRAE.
Formulaire de demande de raccordement
- Une fois votre demande d’hébergement validé vous disposez d’une URL d’accès public (<mon_projet> .sk8.inrae.fr)
- Télécharger le formulaire de renseignement document sur Ariane.
- Pour complèter le formulaire :
- 1 Nom, Prénom et Date de demande par un agent permanent INRAE.
- 2.1 Production : https://<mon_projet>.sk8.inrae.fr
Code Application : CODE_SK8_MONPROJET (Remplacer MONPROJET par le nom de votre projet)
Description du service : à compléter
Responsable métier et technique : à complèter
Client OIDC utilisé : ShinyOAuth
- 3.2 Mettre oui dans la colonne Demandé pour les attributs utilisateurs dont vous avez besoins et ajouter les manquants. (Listes des attributs possibles)
- 3.3 Production -> Url de connexion : https://<mon_projet>.sk8.inrae.fr
- 3.4 Commentaires : Ceci est une demande de raccordement au SSO INRAE avec le portocole OIDC pour l’application <mon_projet>.sk8.inrae.fr hébergé par le service SK8.
- Renommer le fichier en CODE_SK8_MONPROJET.AM.DR.OIDC.otd (Remplacer MONPROJET par le nom de votre projet)
Demande de raccordement
- Pour faire la demande de raccordement faire une demande Ariane en y ajoutant le document précédent.
TipAideDécrivez en quelques mots l’application d’un point de vue technique : Application R Shiny (web) hébgergée dans un cluster kubernetes.
Quel est l’environnement concerné ? : Environnement de production
Quels sont les protocoles supportés ? : OIDC
Quelle est la population cible ? : INRAE et agents non INRAE des UMRRécupération de vos informations de raccordement
Votre demande va être traitée par la DSI et vous recevrez deux identifiants à conserver secrétement.
Client ID et Client Secret à renseigner dans les variables secretes de votre projet gitlab sous OIDC_CLIENT_ID et OIDC_CLIENT_SECRET et à faire passer à votre application via le fichier .gitlab-ci-sk8.yml.
8.0.2 Intégrer l’authentification dans mon applicaiton
Utilisation du package shinyOAuth dans R pour implémenter l’authentification :
global.R
library("shinyOAuth")
# si mode async est a TRUE (dans server.R fonction oauth_module_server)
library(mirai)
mirai::deamons(1)
## mode async
# Définition du fournisseur d'identité
# Liste des services https://authentification.inrae.fr/.well-known/openid-configuration
provider <- shinyOAuth::oauth_provider(
name = "OIDC_INRAE",
auth_url = "https://authentification.inrae.fr/oauth2/authorize",
token_url = "https://authentification.inrae.fr/oauth2/token",
userinfo_required = TRUE,
userinfo_url = "https://authentification.inrae.fr/oauth2/userinfo",
introspection_url = "https://authentification.inrae.fr/oauth2/introspect",
revocation_url = "https://authentification.inrae.fr/oauth2/logout"
)
# Configuration du client qui se connecte à l'OIDC
# client_id et client_secret sont fournies par la DSI
# (utiliser les variables secrètes de gitlab OIDC_CLIENT_ID et OIDC_CLIENT_SECRET)
# Les scopes supplémentaires (customScope) sont à demander à la DSI dans la fiche de raccordement.
# par défaut on a 'email', 'sub' (uid), 'name', et 'family_name'
client <- shinyOAuth::oauth_client(
provider = provider,
client_id = Sys.getenv("OIDC_CLIENT_ID"),
client_secret = Sys.getenv("OIDC_CLIENT_SECRET"),
redirect_uri = "https://<\mon_projet\>.sk8.inrae.fr", # changer l'URL
scopes = c( "openid" ,"profile", "email", "customScope")
)ui.R
ui <- shiny::fluidPage(
# Obligatoire
use_shinyOAuth(),
# pour ajouter un bouton de connexion
actionButton("login_btn", "Login"),
# pour ajouter un bouton de déconnexion
actionButton("logout_btn", "Logout"),
# affiche les informations utilisateur
mainPanel(
# login information:
uiOutput("login_information"),
),
)server.R
server <- function(input, output, session) {
auth <- shinyOAuth::oauth_module_server(
id = "auth",
client = client,
auto_redirect = FALSE, # utilise les boutons de login, si TRUE oblige l'authentification
async = TRUE, # traitement asynchrone des requètes (à TRUE utilise {mirai})
)
# si bouton de connexion
observeEvent(input$login_btn, {
auth$request_login()
})
# si bouton de déconnexion
observeEvent(input$logout_btn, {
auth$logout()
})
# Render login information:
output$login_information <- renderUI({
# vérifie que l'utilisateur est connecté
if (auth$authenticated) {
# récupère les attributds de l'utilisateur (scope)
user_info <- auth$token@userinfo
tagList(
tags$p("You are logged in! Your details:"),
tags$pre(paste(capture.output(str(user_info)), collapse = "\n"))
)
} else {
tags$p("You are not logged in.")
}
})8.0.3 Authentification Fédération Education-Recherche
- En cours de tests
Sont présentées des solutions pour mettre l’authentifiaction en place dans votre application où vous avez a gérer les comptes.
Ces solutions peuvent être utilisé pour le developpement ou si vous disposez déjà d’une base de données utilisateurs externe.
8.0.4 shinymanager
Le package {shinymanager} permet de mettre un système d’authentification en utilisant une Base de Données locale (SQLite) ou une base SQL externe.
8.0.5 shinyauthR
Le package {shinyauthR} n’est plus maintenu et est à proscrire. Privilégier shinymanager.
8.0.6 login
Le package {login} permet en plus des packages précédents d’avoir une gestion par l’utilisateur de son mot de passe et permettre la création de compte.
Préférer son utilisation pour le developpement, sa maintenance étant à l’arrêt.
