8  Utiliser l’authentification

ImportantNE JAMAIS METTRE SES IDENTIFIANTS D’ACCES DIRECTEMENT DANS LE CODE, SURTOUT SUR LA FORGE

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
CautionOIDC INRAE

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.

  1. 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)
  2. Demande de raccordement

    • Pour faire la demande de raccordement faire une demande Ariane en y ajoutant le document précédent.
    TipAide

    Dé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 UMR

  3. Ré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.

8.1 Ressources additionnelles