lumnik. / scénarios Tous les scénarios · English

Le SaaS derrière OAuth2 lu sans perdre une page

Objectif Lire un SaaS protégé par OAuth2 sans perdre de page, et dire pourquoi quand l'accès est refusé.

Une partie des commandes arrive par un SaaS récent. Il donne un identifiant client et un secret, et veut un jeton de courte durée.

manifests/10-orders.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-saas-b  connector_type: rest-generic  scopes: [ecommerce]spec:  base_url: http://host.docker.internal:8098  auth:    kind: oauth2    token_url: http://host.docker.internal:8098/oauth/token    client_id: lumnik-orders    client_secret_env: SCENARIO_SAAS_B_CLIENT_SECRET  endpoints:    - id: orders      path: /api/orders      method: GET      pagination:        kind: page        page_param: page        size_param: size        size: 25        start_page: 1        has_more_path: "$.has_more"        response_path: "$.data"      target:        kind: hybrid        table: ext.saas_orders_b        unique_key: "$.id"        promote:          - { name: customer, path: "$.customer", type: text }          - { name: total, path: "$.total", type: decimal }          - { name: status, path: "$.status", type: text }      incremental:        mode: full
$ lm connector run scenario-saas-b
run scheduled: 8cef175c-419b-4b7a-8b45-a53d536ef2db

$ lm run get 8cef175c-419b-4b7a-8b45-a53d536ef2db
ID        CONNECTOR        ENDPOINT  STATUS     IN   OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED
8cef175c  scenario-saas-b  orders    Completed  200  200  0        0             2026-11-03 17:08  2026-11-03 17:09
$ lm connector run scenario-saas-b
run scheduled: 9d2928c7-301f-4376-991c-40eb864554cc

$ lm run get 9d2928c7-301f-4376-991c-40eb864554cc
ID        CONNECTOR        ENDPOINT  STATUS     IN   OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED
9d2928c7  scenario-saas-b  orders    Completed  200  200  0        0             2026-11-03 17:09  2026-11-03 17:10
$ lm source rest test scenario-saas-b
ENDPOINT  METHOD  STATUS  ITEMS  VERDICT
orders    GET     -       0      OAuth2 token refused by the authorization server: HTTP 401 invalid_client
Error: 1 of 1 enabled endpoint(s) did not answer with readable data

$ lm connector run scenario-saas-b
run scheduled: 404c6db3-1334-4494-a9e0-8cfdf0173375

$ lm run get 404c6db3-1334-4494-a9e0-8cfdf0173375
ID        CONNECTOR        ENDPOINT  STATUS  IN  OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED
404c6db3  scenario-saas-b  orders    Failed  0   0    0        0             2026-11-03 17:10  2026-11-03 17:10
✖ run failed: OAuth2 token refused by the authorization server: HTTP 401 invalid_client

Limites

  • Flux client credentials uniquement: ni connexion par navigateur, ni jeton de rafraîchissement, ni mTLS.
  • Un jeton de moins de 8 caractères est refusé: trop court pour être distingué des données que la source renvoie.
  • SaaS simulé, commandes synthétiques.

Ventes · SaaS

Des commandes arrivent par un SaaS.

Protégé par OAuth2.

Jetons de 30 secondes, run de 40

Le problème

Le jeton expire pendant la lecture.

  • 30 secondes de vie.
  • 40 secondes de lecture.

Ce qui n'est pas modifié

Le SaaS reste tel quel.

  • Son serveur d'autorisation.
  • Un identifiant client, un secret.

Le piège

Une page refusée en silence.

  • Un jeton expiré.
  • Une rotation de clés en plein run.

Ce qu'il a fallu écrire

kind: oauth2

Une ligne.

  • Le jeton demandé et renouvelé à temps.
  • Le secret stocké, jamais dans le manifeste.
  • Un manifeste, 35 lignes.

Un refus

invalid_client, dit clairement.

  • À la pré-vérification et sur le run.
  • Ni le secret ni le jeton affichés.

La limite

Client credentials seulement.

  • Ni navigateur, ni jeton de rafraîchissement.

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →