# API auf Drupal 9 extern verfügbar machen

**URL:** <https://community.software-fuer-engagierte.de/t/api-auf-drupal-9-extern-verfuegbar-machen/184>\
**Category:** CiviCRM Frage&Antwort\
**Created:** [11. März 2022 um 13:31 UTC](https://community.software-fuer-engagierte.de/t/api-auf-drupal-9-extern-verfuegbar-machen/184 "2022-03-11T13:31:35Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Marc\_Michalsky](https://community.software-fuer-engagierte.de/user_avatar/community.software-fuer-engagierte.de/marc_michalsky/32/271_2.png) [@Marc\_Michalsky](https://community.software-fuer-engagierte.de/u/Marc_Michalsky)\
**Post date:** [11. März 2022 um 13:31 UTC](https://community.software-fuer-engagierte.de/t/api-auf-drupal-9-extern-verfuegbar-machen/184/1 "2022-03-11T13:31:35Z")

</div>

Hallo zusammen,

wir sind gerade dabei, unsere CiviCRM-Installation auf **Drupal 9 und CiviCRM 5.45** zu upgraden.

Ich kämpfe nun schon ein paar Stunden damit, die API nach außen verfügbar zu machen. Scheinbar wurde die [Authentifizierung komplett überarbeitet](https://github.com/civicrm/civicrm-core/pull/19590) (siehe [Doku](https://docs.civicrm.org/dev/en/latest/framework/authx/#settings)) und auch die API-Endpunkte haben sich verändert, sodass `extern/rest.php` [unter Drupal 9 nicht mehr zur Verfügung steht](https://docs.civicrm.org/dev/en/latest/api/v3/rest/#compatibility).

Ist es schon jemandem gelungen, die API unter Drupal 9 verfügbar zu machen?

## Authentifizierung

Die Authentifizierung gelingt mir momentan nur mit einem [JWT](https://docs.civicrm.org/dev/en/latest/framework/authx/#credentials). Wenn ich meinem Request einen JWT im Header mitgebe, kann ich sehen, dass die Authentifizierung funktioniert hat:

```bash
$ curl --location --request GET 'https://example.com/civicrm/authx/id' \
> --header 'X-Civi-Auth: Bearer einsuperlangerjwt' 

{"contact_id":8,"user_id":null,"flow":"xheader","cred":"jwt"}

```

Mit einem API-Key im Header bekomme ich nur:

```bash
$ curl --location --request GET 'https://example.com/civicrm/authx/id' \
> --header 'X-Civi-Auth: Bearer eingueltigerapikey' 

HTTP 401 Login not permitted. Must satisfy guard (jwt, api_key).

```

Wenn ich auf dem Server mit einem `cv ev 'Civi::settings()->set("authx_guards", ["api_key"]))'` den [Guard](https://docs.civicrm.org/dev/en/latest/framework/authx/#guards) so setze, dass er nur den API-Key enthält, hilft das auch nicht:

```bash
$ curl --location --request GET 'https://example.com/civicrm/authx/id' \
> --header 'X-Civi-Auth: Bearer eingueltigerapikey'

HTTP 401 Login not permitted. Must satisfy guard (api_key).

```

So wie ich das verstanden habe, muss der Request auch nur einen der verlangten Guards erfüllen.

Auch das Anhängen des API-Keys als Parameter hilft leider nicht, gibt aber eine andere Fehlermeldung:

```bash
$ curl --location --request GET 'https://example.com/civicrm/authx/id?_authx=eingueltigerapikey' 

HTTP 401 Invalid credential

```

Nun ja, mit einem JWT sollte es ja vorerst funktionieren…

## API-Endpunkte

Der Einzige Endpunkt, der mir momentan etwas sinnvolles ausspuckt ist:

```auto
https://example.com/civicrm/authx/id

```

[Hier](https://lab.civicrm.org/dev/core/-/issues/2077#note_54087) wird behauptet, dass der `/ajax/rest` Endpunkt den alten `/extern/rest.php` Endpunkt ersetzen soll.

```auto
https://example.com/civicrm/ajax/rest

```

Doch ein GET Request an `https://example.com/civicrm/ajax/rest?entity=Group&action=get` gibt mir nur die Login-Seite zurück. Das trifft sowohl mit einem JWT im Header und ohne jegliche Authentifizierung zu. Mit einer fehlerhaften Authentifizierung (korrekter API-Key oder manipulierter JWT) bekomme ich Fehlermeldungen.

Selbiges gilt auch für den im API-Explorer vorgeschlagenen Endpunkt:

```auto
https://example.com/libraries/civicrm/core/extern/rest.php

```

Unter dem Pfad lag zunächst gar keine `rest.php`. Das [hier](https://civicrm.stackexchange.com/questions/37926/what-is-the-correct-rest-url-in-drupal-8-or-9#comment46099_37956) vorgeschlagene Anlegen eines symbolischen Links half auch nicht:

```bash
$ ln -s /var/www/example.com/vendor/civicrm/civicrm-core/extern /var/www/example.com/web/libraries/civicrm/core/

```

---

<div class="post-metadata">

**Author:** ![Marc\_Michalsky](https://community.software-fuer-engagierte.de/user_avatar/community.software-fuer-engagierte.de/marc_michalsky/32/271_2.png) [@Marc\_Michalsky](https://community.software-fuer-engagierte.de/u/Marc_Michalsky)\
**Post date:** [21. März 2022 um 10:59 UTC](https://community.software-fuer-engagierte.de/t/api-auf-drupal-9-extern-verfuegbar-machen/184/2 "2022-03-21T10:59:09Z")

</div>

Ich habe eine Lösung gefunden.

Ersteinmal habe ich auf einen [Tipp auf Mattermost](https://chat.civicrm.org/civicrm/pl/wot4icyqfbywf85nandmn8fp6y) hin auf _CiviCRM 5.47.2_ geupdatet.

Leider funktionierte es dann immer noch nicht sofort, was aber wohl an meinem Herumgefrickel mit dem neuen Authentifizierungssystem lag, in dem ich _Guards_ definiert hatte. Nachdem ich diese wieder entfernt und der _Legacy-API_ als erlaubte Authentifizierungsmethode den `api_key` hinzugefügt habe, wurden meine Requests dann endlich akzeptiert.

Der Vorteil an der Verwendung der _Legacy-API_ ist wohl, dass sie noch immer den Site-Key (`key`) und den API-Key (`api_key`) als Querie-Parameter im Request akzeptiert und nur der Endpunkt auf `https://example.com/civicrm/ajax/rest` geändert werden muss. Allerdings frage ich mich, wie zukunftssicher das ist.
