> For the complete documentation index, see [llms.txt](https://docs.chamilo.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chamilo.org/3.x/el/odigos-diaxeirisis/admin-guide/authentication/azure-entra-id.md).

# Azure Entra ID

Η Microsoft μετονόμασε το Azure Active Directory (Azure AD) σε **Microsoft Entra ID** το 2023 — πρόκειται για την ίδια υπηρεσία και ο κώδικας και η διαμόρφωση του Chamilo εξακολουθούν να αναφέρονται σε αυτήν ως `azure`. Αυτή η σελίδα καλύπτει τα ειδικά για το Azure μέρη της ενσωμάτωσης: καταχώριση εφαρμογής, αντιστοίχιση ρόλων βάσει ομάδων, πιστοποίηση με πιστοποιητικό και τις αποκλειστικές εντολές συγχρονισμού χρηστών/ομάδων. Για τα κλειδιά διαμόρφωσης που είναι κοινά σε κάθε πάροχο (`enabled`, `title`, `allow_create_new_users` και ούτω καθεξής) και τη γενική δομή του `authentication.yaml`, δείτε το [OAuth2](/3.x/el/odigos-diaxeirisis/admin-guide/authentication/oauth2.md).

## Καταχώριση του Chamilo στο Microsoft Entra ID

1. Στο κέντρο διαχείρισης Entra, δημιουργήστε μια **App registration** για το Chamilo.
2. Ορίστε το URI ανακατεύθυνσης (τύπος πλατφόρμας **Web**) σε:

   ```
   https://your-chamilo-url/connect/azure/check
   ```
3. Σημειώστε το **Application (client) ID** και το **Directory (tenant) ID** — θα χρειαστείτε και τα δύο.
4. Στην ενότητα **Certificates & secrets**, δημιουργήστε είτε ένα μυστικό πελάτη είτε ανεβάστε ένα πιστοποιητικό (δείτε [Πιστοποίηση με πιστοποιητικό](#certificate-authentication) παρακάτω).
5. Στην ενότητα **API permissions**, προσθέστε τα παρακάτω δικαιώματα Microsoft Graph και χορηγήστε συγκατάθεση διαχειριστή.

| Δικαίωμα                                  | Τύπος       | Απαιτείται για                                         |
| ----------------------------------------- | ----------- | ------------------------------------------------------ |
| `User.Read`                               | Delegated   | Βασική σύνδεση                                         |
| `GroupMember.Read.All`                    | Delegated   | Αντιστοίχιση ρόλων βάσει ομάδων κατά τη σύνδεση        |
| `User.Read.All`                           | Application | `app:azure-sync-users`                                 |
| `GroupMember.Read.All` ή `Group.Read.All` | Application | `app:azure-sync-users` και `app:azure-sync-usergroups` |

Τα δικαιώματα εφαρμογής απαιτούν συγκατάθεση διαχειριστή και χρησιμοποιούνται μόνο από τις εντολές κονσόλας συγχρονισμού (μέσω της χορήγησης `client_credentials`), ποτέ από τη σύνδεση ενός διαδραστικού χρήστη.

## Βασική διαμόρφωση

```yaml
authentication:
  1:
    oauth2:
      azure:
        enabled: true
        title: "Sign in with Microsoft"
        client_id: "<application-client-id>"
        client_secret: "<client-secret>"
        tenant: "<tenant-id>"
        url_login: "https://login.microsoftonline.com"
        path_authorize: "/<tenant-id>/oauth2/v2.0/authorize"
        path_token: "/<tenant-id>/oauth2/v2.0/token"
        url_api: "https://graph.microsoft.com"
        allow_create_new_users: true
        allow_update_user_info: true
```

### Πολλαπλοί μισθωτές έναντι ενός μισθωτή

Η τιμή `tenant` πρέπει να αντιστοιχεί στον τρόπο με τον οποίο ορίστηκαν οι «υποστηριζόμενοι τύποι λογαριασμών» της καταχώρισης εφαρμογής:

* Ένα συγκεκριμένο GUID μισθωτή — ένας μισθωτής, μόνο οι λογαριασμοί αυτού του οργανισμού μπορούν να συνδεθούν
* `organizations` — οποιοσδήποτε μισθωτής Entra ID
* `common` — οποιοσδήποτε μισθωτής Entra ID συν προσωπικοί λογαριασμοί Microsoft

## Απαιτούμενα χαρακτηριστικά χρήστη

Κάθε χρήστης Entra ID που χρειάζεται να συνδεθεί στο Chamilo πρέπει να έχει συμπληρωμένα τα `mail` και `mailNickname` — η σύνδεση εμφανίζει σφάλμα αν κάποιο από τα δύο είναι κενό (μαζί με το αμετάβλητο αναγνωριστικό αντικειμένου Entra, το οποίο είναι πάντα παρόν). Η αντιστοίχιση πεδίων από το Microsoft Graph στο Chamilo είναι **σταθερή** για το Azure (σε αντίθεση με τον γενικό πάροχο OAuth2, που σας επιτρέπει να διαμορφώσετε την αντιστοίχιση πεδίων):

| Πεδίο Chamilo           | Πηγή Microsoft Graph                                                                                                    |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| Όνομα                   | `givenName`                                                                                                             |
| Επώνυμο                 | `surname`                                                                                                               |
| Ηλεκτρονικό ταχυδρομείο | `mail`                                                                                                                  |
| Όνομα χρήστη            | `userPrincipalName`                                                                                                     |
| Τηλέφωνο                | `telephoneNumber`, έπειτα `businessPhones[0]`, έπειτα `mobilePhone`                                                     |
| Ενεργός                 | `accountEnabled`                                                                                                        |
| Γλώσσα διεπαφής         | `preferredLanguage` (αντιστοιχίζεται σε εγκατεστημένη γλώσσα του Chamilo, με εναλλακτική την προεπιλογή της πλατφόρμας) |

Τρία επιπλέον πεδία εγγράφονται επίσης σε κάθε επιτυχή σύνδεση: `organisationemail` (= `mail`), `azure_id` (= `mailNickname`) και `azure_uid` (= το αναγνωριστικό αντικειμένου Entra). Αυτά υποστηρίζουν τη λογική αντιστοίχισης λογαριασμών παρακάτω.

## Αντιστοίχιση συνδέσεων σε υπάρχοντες λογαριασμούς Chamilo

Ορίστε το `existing_user_verification_order` σε μια λίστα ψηφίων `1`–`3` διαχωρισμένων με κόμμα για να ελέγξετε πώς μια εισερχόμενη σύνδεση Entra ID αντιστοιχίζεται σε υπάρχοντα λογαριασμό Chamilo:

| Τιμή | Αντιστοιχίζεται με                                             |
| ---- | -------------------------------------------------------------- |
| `1`  | Επιπλέον πεδίο `organisationemail` == Entra `mail`             |
| `2`  | Επιπλέον πεδίο `azure_id` == Entra `mailNickname`              |
| `3`  | Επιπλέον πεδίο `azure_uid` == αναγνωριστικό αντικειμένου Entra |

Οι θέσεις δοκιμάζονται με τη σειρά που αναφέρονται· η πρώτη ενεργή (όχι διαγραμμένη λογικά) αντιστοίχιση υπερισχύει. Μια μη έγκυρη ή κενή τιμή προεπιλέγεται σε `1,2,3`. Αν καμία από τις διαμορφωμένες θέσεις δεν αντιστοιχεί — κάτι που ισχύει πάντα την πρώτη φορά που ένας δεδομένος χρήστης συνδέεται, καθώς αυτά τα επιπλέον πεδία συμπληρώνονται *μετά* από επιτυχή σύνδεση — το Chamilo καταφεύγει στην αντιστοίχιση του ίδιου του πεδίου `email` του Chamilo με το Entra `mail`, έπειτα του `username` με το `userPrincipalName`, ανεξάρτητα από ό,τι διαμορφώσατε.

## Αντιστοίχιση ρόλων βάσει ομάδας

Αντιστοιχίστε ομάδες ασφαλείας του Entra ID σε ρόλους του Chamilo με τα Object ID τους (GUID):

```yaml
authentication:
  1:
    oauth2:
      azure:
        group_id:
          admin: "<entra-group-object-id>"
          session_admin: "<entra-group-object-id>"
          teacher: "<entra-group-object-id>"
```

Σε κάθε σύνδεση, το Chamilo καλεί το Microsoft Graph `/v1.0/me/memberOf` με το δικό του access token του χρήστη και ελέγχει τις επιστρεφόμενες ομάδες έναντι αυτών των τριών ID, με τη σειρά **admin → session\_admin → teacher**. Ισχύει η πρώτη αντιστοίχιση — ένας χρήστης που ανήκει τόσο στην ομάδα admin όσο και στην ομάδα teacher προάγεται μόνο σε admin. Όποιος δεν ανήκει σε καμία διαμορφωμένη ομάδα διατηρεί τον υπάρχοντα ρόλο του (ή τον προεπιλεγμένο ρόλο φοιτητή, στην πρώτη σύνδεση). Αυτό απαιτεί την εκχωρημένη άδεια `GroupMember.Read.All` που αναφέρεται παραπάνω.

## Πιστοποίηση με πιστοποιητικό

Ως εναλλακτική του `client_secret`, πιστοποιηθείτε με πιστοποιητικό:

```yaml
authentication:
  1:
    oauth2:
      azure:
        client_certificate_private_key: "<PEM private key, single line, with \\n for line breaks>"
        client_certificate_thumbprint: "<hex SHA1 thumbprint>"
```

Ανεβάστε το αντίστοιχο δημόσιο πιστοποιητικό στην ενότητα **Certificates & secrets** στην καταχώριση της εφαρμογής και αντιγράψτε το αποτύπωμά του (εμφανίζεται σε δεκαεξαδική μορφή στην πύλη) στο `client_certificate_thumbprint`. Όταν έχουν οριστεί και τα δύο κλειδιά, το Chamilo δημιουργεί μια υπογεγραμμένη JWT client assertion (RS256) αντί να στέλνει `client_secret` — αυτό ισχύει τόσο για τις διαδραστικές συνδέσεις όσο και για την πιστοποίηση μόνο εφαρμογής των εντολών συγχρονισμού.

## Συγχρονισμός χρηστών και ομάδων από το Entra ID

Δύο εντολές κονσόλας προμηθεύουν και συντηρούν λογαριασμούς Chamilo απευθείας από το Entra ID, ανεξάρτητα από το αν κάποιος συνδέεται διαδραστικά. Και οι δύο πιστοποιούνται μόνο ως εφαρμογή (`client_credentials`), επομένως χρειάζονται τις **application** άδειες Graph που αναφέρονται παραπάνω, και και οι δύο προορίζονται να προγραμματίζονται στο cron αντί να εκτελούνται χειροκίνητα.

### `app:azure-sync-users`

Ανακτά χρήστες από το Microsoft Graph και προμηθεύει/ενημερώνει τους αντίστοιχους λογαριασμούς Chamilo χρησιμοποιώντας την ίδια αντιστοίχιση πεδίων και τη λογική αντιστοίχισης λογαριασμών όπως μια διαδραστική σύνδεση.

* Από προεπιλογή ανακτά την πλήρη λίστα χρηστών (`/v1.0/users`, με σελιδοποίηση). Ορίστε `script_users_delta: true` για να χρησιμοποιηθεί αντί αυτού το `/v1.0/users/delta` — το Chamilo διατηρεί τον σύνδεσμο delta μεταξύ εκτελέσεων, ώστε οι επόμενες εκτελέσεις να ανακτούν μόνο ό,τι άλλαξε.
* Ορίστε `deactivate_nonexisting_users: true` για απενεργοποίηση λογαριασμών Chamilo (με πηγή πιστοποίησης Azure) που δεν εμφανίζονται πλέον στην ανάκτηση από το Entra ID. Αυτό λειτουργεί μόνο σε λειτουργία πλήρους ανάκτησης — η λειτουργία delta δεν επιστρέφει ποτέ την πλήρη λίστα χρηστών, επομένως αυτή η ρύθμιση αγνοείται όταν είναι ενεργό το `script_users_delta`.
* Η αντιστοίχιση ρόλων ομάδας (παραπάνω) εφαρμόζεται εκ νέου για κάθε συγχρονισμένο χρήστη κατά τη διάρκεια αυτής της εκτέλεσης, όχι μόνο κατά τη σύνδεση.

### `app:azure-sync-usergroups`

Ανακτά ομάδες του Entra ID και τις αντικατοπτρίζει ως τάξεις Chamilo (`Usergroup`).

* Ανακτά την πλήρη λίστα ομάδων (`/v1.0/groups`) ή, με `script_usergroups_delta: true`, το endpoint delta, με τον δικό του ξεχωριστά παρακολουθούμενο σύνδεσμο delta.
* Το `group_filter_regex` περιορίζει ποιες ομάδες συγχρονίζονται, με αντιστοίχιση στο εμφανιζόμενο όνομα της ομάδας.
* **Κάθε εκτέλεση εκκαθαρίζει πρώτα όλα τα υπάρχοντα μέλη της αντίστοιχης τάξης Chamilo**, και στη συνέχεια επανεγγράφει όσα μέλη επιστρέφει αυτή τη στιγμή το Graph. Τα μέλη αντιστοιχίζονται μόνο σε *υπάρχοντες* χρήστες Chamilo, χρησιμοποιώντας την ίδια [λογική αντιστοίχισης λογαριασμών](#matching-logins-to-existing-chamilo-accounts) όπως στη σύνδεση — αυτή η εντολή δεν δημιουργεί ποτέ νέους λογαριασμούς χρηστών, και οποιοδήποτε μέλος ομάδας δεν μπορεί να αντιστοιχιστεί σε υπάρχοντα λογαριασμό Chamilo παραλείπεται σιωπηλά.

## Γνωστοί περιορισμοί

* **Δεν υπάρχει ενιαία αποσύνδεση.** Η αποσύνδεση από το Chamilo δεν αποσυνδέει τον χρήστη από το Entra ID ή άλλες συνδεδεμένες εφαρμογές. Υπάρχει ένα κλειδί διαμόρφωσης `force_logout` στο `authentication.yaml` αλλά δεν έχει υλοποιηθεί προς το παρόν — θεωρήστε το δεσμευμένο, όχι λειτουργικό.
* **Η επαναφορά κωδικού πρόσβασης δεν έχει νόημα για λογαριασμούς Azure.** Εφόσον η πιστοποίηση γίνεται εξ ολοκλήρου μέσω του Entra ID, το Chamilo δεν διατηρεί χρησιμοποιήσιμο τοπικό κωδικό πρόσβασης για αυτούς τους λογαριασμούς.

## Αντιμετώπιση προβλημάτων

* Οι αποτυχίες σύνδεσης (ελλείποντα απαιτούμενα χαρακτηριστικά, σφάλματα Graph API) εμφανίζονται στον χρήστη ως μήνυμα flash στη σελίδα σύνδεσης.
* Οι εντολές συγχρονισμού καταγράφουν προβλήματα ανά εγγραφή με προειδοποιήσεις και συνεχίζουν την επεξεργασία του υπόλοιπου παρτίδας αντί να διακόπτονται στο πρώτο σφάλμα — ελέγξτε την έξοδο κονσόλας της εντολής (ή όπου καταγράφει το cron σας) μετά από κάθε εκτέλεση.
* Διατηρήστε ενεργοποιημένη την τυπική φόρμα σύνδεσης του Chamilo ώστε οι διαχειριστές να έχουν πάντα τρόπο εισόδου αν η ενσωμάτωση Entra ID συμπεριφερθεί εσφαλμένα.
