Contenu - DS - Question sur GraphQL ---> Réponse de l'API "unauthorized"

Généralités

Plusieurs éléments génériques sur les problématiques avec l’API GraphQL de DS :

  • Il n’y a pas de restriction par IP sur l'API GraphQL.
  • Si le jeton n’a pas été régénéré, il doit fonctionner normalement
  • Le jeton expire uniquement quand il est régénéré via le bouton sur la page "Profil" (URL : /profil) du compte administrateur.
  • Dans le cas, où les requêtes GraphQL ne fonctionne plus, nous vous proposons de suivre 2 principes :
    • utiliser une requête simple GraphQL pour tester que le jeton est bien le bon et que l'API GraphQL répond ;
    • utiliser un outil simple pour tester les requêtes GraphQL (à l'ADULLACT, nous utilisons CURL)

Exemple de requête GraphQL simple

{
  demarche(number: 26) {
    state
    title
    dateCreation
    datePublication
    description
    service {
      typeOrganisme
      organisme
      nom
    }
  }
}

Exemple de requête GraphQL avec CURL

Testé sous Linux avec les outils curl et jq (ce dernier n'est pas obligatoire, il sert juste à lire plus facilement la réponse JSON).

# Jeton DS pour l'API GraphQL
set +o history         # désactiver l'historique des lignes de commande
API_JETON="<YOUR_TOKEN>"
set -o history          # activer l'historique des lignes de commande

API_GRAPHQL_URL="https://demarches.adullact.org/api/v2/graphql"
PROCEDURE_ID=26

# Requête à l'API GraphQL de DS
DS_REQUEST="{ demarche(number: ${PROCEDURE_ID}) { state title dateCreation datePublication description service { typeOrganisme organisme nom } } }"
curl -X POST                                       \
     -H "Content-Type: application/json"           \
     -H "Authorization: Bearer token=${API_JETON}" \
     --data "{ \"query\": \"${DS_REQUEST}\" }"     \
     ${API_GRAPHQL_URL} | jq

Réponse "unauthorized" de l'API GraphQL de DS

La réponse GraphQL est la même dans les 3 cas suivants :

  • aucun jeton DS n'a été envoyé dans les entêtes HTTP de la requête GraphQL
  • le jeton DS n'est pas le bon (il a par exemple été régénéré avec le compte administrateur).
  • le jeton DS est bon, mais la requête GraphQL porte sur une ressource (démarche, dossier) pour lequel le compte administrateur n'a pas les droits.
{
  "data": null,
  "errors": [
    {
      "message": "An object of type Demarche was hidden due to permissions",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "demarche"
      ],
      "extensions": {
        "code": "unauthorized"
      }
    }
  ]
}

Exemples avec le bac à sable de DS

Aucun jeton DS n'a été envoyé dans les entêtes HTTP

API_GRAPHQL_URL="https://demarches.adullact.org/api/v2/graphql"
PROCEDURE_ID=26
DS_REQUEST="{ demarche(number: ${PROCEDURE_ID}) { state title dateCreation datePublication description service { typeOrganisme organisme nom } } }"
curl -X POST                                       \
     -H "Content-Type: application/json"           \
     --data "{ \"query\": \"${DS_REQUEST}\" }"     \
     ${API_GRAPHQL_URL} | jq
{
  "data": null,
  "errors": [
    {
      "message": "An object of type Demarche was hidden due to permissions",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "demarche"
      ],
      "extensions": {
        "code": "unauthorized"
      }
    }
  ]
}

Le jeton DS n'est pas le bon

# Jeton DS pour l'API GraphQL
set +o history         # désactiver l'historique des lignes de commande
API_JETON="<OLD_OR_BAD_TOKEN>"
set -o history          # activer l'historique des lignes de commande

API_GRAPHQL_URL="https://demarches.adullact.org/api/v2/graphql"
PROCEDURE_ID=26
DS_REQUEST="{ demarche(number: ${PROCEDURE_ID}) { state title dateCreation datePublication description service { typeOrganisme organisme nom } } }"
curl -X POST                                       \
     -H "Content-Type: application/json"           \
     -H "Authorization: Bearer token=${API_JETON}" \
     --data "{ \"query\": \"${DS_REQUEST}\" }"     \
     ${API_GRAPHQL_URL} | jq
{
  "data": null,
  "errors": [
    {
      "message": "An object of type Demarche was hidden due to permissions",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "demarche"
      ],
      "extensions": {
        "code": "unauthorized"
      }
    }
  ]
}

Le jeton DS est bon, mais l'accès à la ressource (démarche, dossier) n'est pas autorisé

Le jeton DS est bon, mais la requête GraphQL porte sur une ressource (démarche, dossier) pour lequel le compte administrateur n'a pas les droits.

# Jeton DS pour l'API GraphQL
set +o history         # désactiver l'historique des lignes de commande
API_JETON="<YOUR_VALID_TOKEN>"
set -o history          # activer l'historique des lignes de commande

API_GRAPHQL_URL="https://demarches.adullact.org/api/v2/graphql"
PROCEDURE_ID=<BAD_ID> # vous n'avez pas les droits administrateur sur cette démarche
DS_REQUEST="{ demarche(number: ${PROCEDURE_ID}) { state title dateCreation datePublication description service { typeOrganisme organisme nom } } }"
curl -X POST                                       \
     -H "Content-Type: application/json"           \
     -H "Authorization: Bearer token=${API_JETON}" \
     --data "{ \"query\": \"${DS_REQUEST}\" }"     \
     ${API_GRAPHQL_URL} | jq
{
  "data": null,
  "errors": [
    {
      "message": "An object of type Demarche was hidden due to permissions",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "demarche"
      ],
      "extensions": {
        "code": "unauthorized"
      }
    }
  ]
}

Le jeton DS est bon et l'accès à la ressource (démarche, dossier) est autorisé

# Jeton DS pour l'API GraphQL
set +o history         # désactiver l'historique des lignes de commande
API_JETON="<YOUR_VALID_TOKEN>"
set -o history          # activer l'historique des lignes de commande

API_GRAPHQL_URL="https://demarches.adullact.org/api/v2/graphql"
PROCEDURE_ID=<VALID_ID> # vous avez les droits administrateur sur cette démarche
DS_REQUEST="{ demarche(number: ${PROCEDURE_ID}) { state title dateCreation datePublication description service { typeOrganisme organisme nom } } }"
curl -X POST                                       \
     -H "Content-Type: application/json"           \
     -H "Authorization: Bearer token=${API_JETON}" \
     --data "{ \"query\": \"${DS_REQUEST}\" }"     \
     ${API_GRAPHQL_URL} | jq
Edited by Fabrice Gangler