# Pressmatix Aboverwaltung Integrationsmöglichkeiten

## Zielarchitektur

1. Benutzerauthentifizierung läuft über einen OIDC-Provider (PX-User, Auth0 oder Keycloak)
2. Benutzer Authentifiziert sich in der PressMatrix App oder im Web am Pressmatrix-Kontext \[läuft über den OIDC-Provider\]
3. Es wird ein Access Token-Generiert
4. Pressmatrix ruft beim Zugriff die eigene Middleware auf
5. Middleware erhält den OIDC-Token

Beispiel-Aufruf durch Pressmatrix

```bash
curl -X POST https://{auth-server-url}/pmx-api/v2/{profile_token}/authorize \
  -H "Authorization: Bearer {ACCESS_TOKEN}" \
  -H "OIDC-ID-Token: {OIDC_ID_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "issue_name": "Sample Issue May 2014",
    "issue_date": "2014-05-01",
    "category_name": "Sample Category",
    "category_ids": "20924,20925",
    "product_id_apple": "sample_issue_2014_05",
    "product_id_google": "sample_issue_2014_05",
    "product_id_amazon": "sample_issue_2014_05",
    "product_id_external": "sample_id_1,sample_id_2"
  }'
```

Die Middleware prüft zuerst ob der Token gültig ist \[Anfrage zum OIDC-Provider\]

Wenn der Token ungültig ist, wird der Status 401, Unauthorized zurückgegeben

Wenn der Token gültig ist, wird geprüft, ob der Kunde Zugriff auf die angefragte Ressource hat

falls ja: Rückgabe von granted: true

falls nein: Rückgabe von granted: false

<p class="callout info">Die Daten der Abonnemente müssen in eine eigene Datenbank der Middleware synchronisiert werden, damit beim zugriff nicht auf die Live-Daten im CRM zugegriffen werden müssen. Sonst kann der Kunde bei beispielsweise eines API-Problems bei Sage nicht auf eine Ausgabe zugreifen.</p>

[![image.png](https://wiki.go-solution.ch/uploads/images/gallery/2026-07/scaled-1680-/GdiqjQIHYm4nsDoo-image.png)](https://wiki.go-solution.ch/uploads/images/gallery/2026-07/GdiqjQIHYm4nsDoo-image.png)

## Mögliche CRM Datenstruktur

#### Kontakt beziehungsweise Benutzer

<div class="TyagGW_tableContainer" id="bkmrk-feld-beispiel-crm-co"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="3559" data-start="3382"><thead data-end="3401" data-start="3382"><tr data-end="3401" data-start="3382"><th class="last:pe-10" data-col-size="sm" data-end="3389" data-start="3382">Feld</th><th class="last:pe-10" data-col-size="sm" data-end="3401" data-start="3389">Beispiel</th></tr></thead><tbody data-end="3559" data-start="3412"><tr data-end="3439" data-start="3412"><td data-col-size="sm" data-end="3429" data-start="3412">CRM Account ID</td><td data-col-size="sm" data-end="3439" data-start="3429">`4711`</td></tr><tr data-end="3473" data-start="3440"><td data-col-size="sm" data-end="3455" data-start="3440">OIDC Subject</td><td data-col-size="sm" data-end="3473" data-start="3455">`8b153fb2-...`</td></tr><tr data-end="3505" data-start="3474"><td data-col-size="sm" data-end="3483" data-start="3474">E-Mail</td><td data-col-size="sm" data-end="3505" data-start="3483">`kunde@example.ch`</td></tr><tr data-end="3524" data-start="3506"><td data-col-size="sm" data-end="3515" data-start="3506">Status</td><td data-col-size="sm" data-end="3524" data-start="3515">aktiv</td></tr><tr data-end="3559" data-start="3525"><td data-col-size="sm" data-end="3545" data-start="3525">Identity Provider</td><td data-col-size="sm" data-end="3559" data-start="3545">`keycloak`</td></tr></tbody></table>

</div></div>Der wichtigste Schlüssel ist der **OIDC-Claim `sub`**. Die E-Mail-Adresse sollte nicht als dauerhafter Primärschlüssel verwendet werden, weil sie sich ändern kann.

#### Abonnement

<div class="TyagGW_tableContainer" id="bkmrk-feld-beispiel-subscr"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="4001" data-start="3741"><thead data-end="3760" data-start="3741"><tr data-end="3760" data-start="3741"><th class="last:pe-10" data-col-size="sm" data-end="3748" data-start="3741">Feld</th><th class="last:pe-10" data-col-size="sm" data-end="3760" data-start="3748">Beispiel</th></tr></thead><tbody data-end="4001" data-start="3771"><tr data-end="3809" data-start="3771"><td data-col-size="sm" data-end="3789" data-start="3771">Subscription ID</td><td data-col-size="sm" data-end="3809" data-start="3789">`SUB-2026-00123`</td></tr><tr data-end="3833" data-start="3810"><td data-col-size="sm" data-end="3823" data-start="3810">Contact ID</td><td data-col-size="sm" data-end="3833" data-start="3823">`4711`</td></tr><tr data-end="3869" data-start="3834"><td data-col-size="sm" data-end="3848" data-start="3834">Produktcode</td><td data-col-size="sm" data-end="3869" data-start="3848">`MAGAZIN-PREMIUM`</td></tr><tr data-end="3895" data-start="3870"><td data-col-size="sm" data-end="3879" data-start="3870">Beginn</td><td data-col-size="sm" data-end="3895" data-start="3879">`2026-01-01`</td></tr><tr data-end="3919" data-start="3896"><td data-col-size="sm" data-end="3903" data-start="3896">Ende</td><td data-col-size="sm" data-end="3919" data-start="3903">`2026-12-31`</td></tr><tr data-end="3938" data-start="3920"><td data-col-size="sm" data-end="3929" data-start="3920">Status</td><td data-col-size="sm" data-end="3938" data-start="3929">aktiv</td></tr><tr data-end="3969" data-start="3939"><td data-col-size="sm" data-end="3957" data-start="3939">Kündigungsdatum</td><td data-col-size="sm" data-end="3969" data-start="3957">optional</td></tr><tr data-end="4001" data-start="3970"><td data-col-size="sm" data-end="3989" data-start="3970">Grace Period bis</td><td data-col-size="sm" data-end="4001" data-start="3989">optional</td></tr></tbody></table>

</div></div>#### Produktzuordnung

<div class="TyagGW_tableContainer" id="bkmrk-crm-produktcode-pres"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="4212" data-start="4024"><thead data-end="4060" data-start="4024"><tr data-end="4060" data-start="4024"><th class="last:pe-10" data-col-size="sm" data-end="4042" data-start="4024">CRM-Produktcode</th><th class="last:pe-10" data-col-size="sm" data-end="4060" data-start="4042">PressMatrix-ID</th></tr></thead><tbody data-end="4212" data-start="4071"><tr data-end="4126" data-start="4071"><td data-col-size="sm" data-end="4091" data-start="4071">`MAGAZIN-PREMIUM`</td><td data-col-size="sm" data-end="4126" data-start="4091">`com.publisher.magazin.premium`</td></tr><tr data-end="4170" data-start="4127"><td data-col-size="sm" data-end="4144" data-start="4127">`MAGAZIN-2026`</td><td data-col-size="sm" data-end="4170" data-start="4144">`magazin_issue_2026_*`</td></tr><tr data-end="4212" data-start="4171"><td data-col-size="sm" data-end="4189" data-start="4171">`ARCHIV-ZUGANG`</td><td data-col-size="sm" data-end="4212" data-start="4189">Kategorie `archive`</td></tr></tbody></table>

</div></div>## Mögliche Middleware Datenbank:

```
                    Synchronisation
Sage CRM ─────────────────────────────────► Middleware-Datenbank
                                                   ▲
                                                   │ schnelle Abfrage
PressMatrix ───────────── authorize/issues ─────────┘




identity_mapping
----------------
issuer
oidc_subject
crm_contact_id

subscriptions
-------------
subscription_id
crm_contact_id
status
valid_from
valid_until
grace_until

entitlements
------------
subscription_id
product_code
pressmatrix_product_id
valid_from
valid_until
```