# DocCheck - Login OAuth2

Procedure d'authentification d'un utilisateur via DocCheck Login (flow OAuth2 Authorization Code).
Integration officielle : bouton de login DocCheck cote front, traitement du callback cote back-end.

## Pre-requis

- Plan DocCheck : Basic minimum.
- Cote console DocCheck Access (https://access.doccheck.com/app) :
  - Login client cree (fournit `client_id` et `client_secret`).
  - `Redirect URL` enregistree (doit pointer vers la page de callback de la plateforme).
  - Bouton configure via le Button Configurator (genere le markup HTML a coller).

## Portee du plan Basic

- Permet de verifier qu'un utilisateur est authentifie chez DocCheck.
- Ne donne PAS acces aux donnees personnelles (nom, email, profession, etc.). Ces donnees necessitent Economy+ et le consentement utilisateur.

## Flow global

1. La page de la plateforme affiche le bouton de login DocCheck.
2. L'utilisateur clique : le bouton declenche la redirection vers DocCheck.
3. L'utilisateur se connecte sur DocCheck.
4. DocCheck redirige l'utilisateur vers la `Redirect URL` de la plateforme avec les parametres GET `code` et `state`.
5. Le back-end echange ce `code` contre un `access_token` via un POST serveur-a-serveur.
6. Si l'echange reussit, l'utilisateur est considere comme authentifie.

> Important : la presence du parametre `code` dans l'URL de retour ne suffit PAS a prouver l'authentification. Il faut imperativement realiser l'echange contre un access token cote serveur.

## Etape 1 - Affichage du bouton DocCheck

Cote page front, deux elements a integrer :

1. Le script du composant (chargement du bouton) :

```html
<script src="https://dccdn.de/static.doccheck.com/components/login-button/@latest/main.js"></script>
```

2. Le markup HTML du bouton, genere par le Button Configurator (DocCheck Access) et colle tel quel.

Parametres configurables via le Button Configurator :
- `Redirect URL` : URL de callback de la plateforme.
- `Button size` : taille du bouton.
- `Login language` : langue de l'interface de login DocCheck.
- `Personal` : scope des donnees (sans effet utile en plan Basic).
- `State` : valeur arbitraire renvoyee telle quelle au callback. A utiliser pour la protection CSRF et/ou pour restaurer un etat applicatif au retour.

Le clic sur le bouton declenche la redirection vers le service de login DocCheck en transmettant les parametres OAuth2 (`client_id`, `redirect_uri`, `response_type=code`, `state`).

## Etape 2 - Callback sur la plateforme

DocCheck redirige le navigateur vers la `Redirect URL` configuree avec :
- `code` : authorization code, valable pour un seul echange.
- `state` : valeur initialement passee au bouton. A comparer avec la valeur attendue cote plateforme. Si differente : rejeter.

Endpoint cible cote plateforme : `src/frontoffice/fo-advanz-login-redirect.php`.

## Etape 3 - Echange du code contre un access token

Appel serveur-a-serveur (back-end uniquement, car le `client_secret` est implique).

- Methode : `POST`
- URL : `https://auth.doccheck.com/token`
- Encodage du body : `application/x-www-form-urlencoded`

Parametres du body :
- `client_id` : Login Client ID.
- `client_secret` : secret de la plateforme (stocke en config / .env, jamais expose au navigateur).
- `grant_type=authorization_code`
- `code` : valeur recue a l'etape 2.
- `redirect_uri` : strictement identique a la `Redirect URL` enregistree cote DocCheck et a celle utilisee a l'etape 1.

## Etape 4 - Reponse du endpoint token

Reponse JSON en cas de succes :
- `access_token` : token d'acces.
- `token_type` : `Bearer`.
- `expires_in` : `3600` (duree de vie en secondes).
- `refresh_token` : token de rafraichissement.
- `scope` : portee accordee.

En cas d'erreur :
- `error`
- `error_description`

Une reponse 2xx avec ces champs = utilisateur authentifie. C'est cette etape qui valide reellement la session DocCheck.

## Cote plateforme - resume des actions

1. Inserer le script et le markup du bouton genere par le Button Configurator sur la page de login.
2. Configurer la `Redirect URL` cote DocCheck pour qu'elle pointe vers `fo-advanz-login-redirect.php`.
3. Sur `fo-advanz-login-redirect.php` :
   - Recuperer `code` et `state` en GET.
   - Verifier `state` (CSRF).
   - POST vers `https://auth.doccheck.com/token` avec `client_id`, `client_secret`, `grant_type=authorization_code`, `code`, `redirect_uri`.
   - Si reponse OK : marquer l'utilisateur comme authentifie DocCheck en session.
   - Sinon : rejeter et logger l'erreur.

## Sources

- https://docs.doccheck.com/login-access/oauth/configuration.html
- https://docs.doccheck.com/login-access/oauth/endpoints/access-token_endpoint.html
- https://docs.doccheck.com/login-access/oauth/endpoints/endpoint-overview.html
- https://docs.doccheck.com/login-access/additional-information/redirect-state-flow.html
- https://docs.doccheck.com/login-access/getting-started/button.html
- https://docs.doccheck.com/login-access/getting-started/quickstart.html

---

## Ajout d'un pays - Configuration front

### 1. Page de choix HCP / Patient

Creer une web page avec le snippet suivant. Adapter les textes et le `loginclientid` fourni par DocCheck.
Le `redirecturi` doit pointer vers `fo-advanz-login-redirect.php` de l'environnement cible.

```html
<div class="grid">
    <div class="card column column-12 snippet-green-background-rectangle snippet-block">
        <h1 class="card-title">WELCOME TO</h1>
        <h1 class="card-title">ADVANZ PHARMA [PAYS]</h1>
        <h1 class="card-title">MEDICAL INFORMATION</h1>
        <p class="card-text align-center">
            We strive to provide timely, accurate, unbiased, and balanced evidence-based product information.
        </p>
        <div class="grid">
            <div class="column column-6">
                <div class="grid d-flex snippet-block snippet-white-container-button-and-text bd-highlight">
                    <div class="p-2 flex-grow-1 bd-highlight"><p>I am a Healthcare Professional</p></div>
                    <div class="p-2 bd-highlight">
                        <p><span id="activeDcLogin" class="btn btn-primary">Select</span></p>
                        <dc-login-button
                            size="medium"
                            class="d-none"
                            language="en"
                            loginclientid="<CLIENT_ID_DOCCHECK>"
                            redirecturi="https://<domaine>/fo-advanz-login-redirect.php"
                            state="">
                        </dc-login-button>
                    </div>
                </div>
            </div>
            <div class="column column-6">
                <div class="grid d-flex snippet-block snippet-white-container-button-and-text bd-highlight">
                    <div class="p-2 flex-grow-1 bd-highlight"><p>I am a Patient / Caregiver</p></div>
                    <div class="p-2 bd-highlight">
                        <p><a href="/[page-patient]?userType=patient" class="btn btn-primary">Select</a></p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<p class="greentext align-center">Please call [numero] to report adverse events or product complaints</p>
<p class="align-center">or to speak to a Medical Information Specialist.</p>
<p class="align-center">or email <a href="mailto:[email]">[email]</a></p>
```
ne pas oublier d'intégrer le bouton dockcheck à jour et en d-none!
### 2. Tracked link

Creer un tracked link (Backoffice > Advertising) qui redirige vers l'URL de la page creee en etape 1,
avec le parametre `countryValue=<pays>` en suffixe.

Exemple : `/[url-page-hcp-patient]?countryValue=germany`

### 3. Dropdown home page

Dans le snippet de la home page, ajouter l'entree du nouveau pays dans la dropdown :

```html
<a class="dropdown-item" href="/tracked-link.php?id=<ID_TRACKED_LINK>">Germany</a>
```

Remplacer `<ID_TRACKED_LINK>` par l'ID genere a l'etape 2.