Connexion python via API REST authentification

17 views
Skip to first unread message

Alain Benard

unread,
May 16, 2025, 8:42:17 AMMay 16
to georchestra-dev
A tout hasard je demande si quelqun disposerai des explications ou d'exemple de code pour connecter un script python à un geoserver d'une instance georchestra. Le souci que je rencontre relève de l'authentification que je ne sais pas comment passer , un simple basicauth avec login / mot de passe aboutissant à des erreur 401. L'url que j'utilise est bonne et fonctionne si je suis déjà authentifié depuis un navigateur mais pas depuis un appel en python (mais certainement aussi en curl ...). J'imagine qu'il faut fournir un mécanisme qui est transparent lors de la connexion via un navigateur (session, cookies ??).  Bref parmi les usagers georchestra y aurait-il une bonne âme qui puisse expliquer ce qu'il faut faire ou mieux partager un code très simple. Voici typiquement un code très simple qui récupère (s'il marchait ;)) la liste des datastore d'un workspace et qui me donnne une erreur 401 (j'ai essayé pas mal de variantes) :
def get_datastores(workspace):
url = f"{GEOSERVER_URL}/rest/workspaces/{workspace}/datastores.json"
response = requests.get(url, auth=(USERNAME, PASSWORD))
if response.status_code == 200:
return response.json().get('dataStores', {}).get('dataStore', [])
else:
raise Exception(f"Failed to get datastores: {response.text}")

jean rodriguez

unread,
May 16, 2025, 9:15:06 AMMay 16
to georche...@googlegroups.com
Bonjour, 

J'ai repris votre code et j'ai eu un status code = 200. Êtes-vous sûr que vous prenez le bon URL ? 

JPR

--
--
projet: http://www.georchestra.org/

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "georchestra-dev".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse georchestra-d...@googlegroups.com.
Pour afficher cette discussion, accédez à https://groups.google.com/d/msgid/georchestra-dev/94a8ab09-8c8c-4fa9-b5bf-579f46da5078n%40googlegroups.com.

Alain Benard

unread,
May 19, 2025, 4:45:01 AMMay 19
to georchestra-dev
Bonjour,
j'ai eu des explications par ailleurs entre temps et il s'avère que l'exemple fourni va fonctionner avec un geoserver autonome qui gère ses propres utilisateurs. Le fait d'être dans une instance geoserver intégrée à un georchestra nécessite d'autres mécanismes car l'authentification est déportée au niveau du module CAS avec soit un compte local à georchestra (cas assez simple mais qui ne fonctionne pas avec mon exemple) ou avec des déports de l'authentification via des mécanismes SSO ou autre et là c'est plus complexe et à façon.
Au final pour m'en sortir j'utilise un compte local à l'IDS avec une première étape qui consiste à mémoriser les informations de session (ce qui n'était pas dans mon code exemple) avec une méthode telle que celle-ci :
def connect(self):
"""
Connecte à GeoOrchestra/GeoServer avec un compte local.
Retourne une session authentifiée ou None en cas d’échec.
"""
login_url = f"{self.base_url}/login"
session = requests.Session()
payload = {"username": self.username, "password": self.password}

try:
response = session.post(login_url, data=payload, allow_redirects=True)
if response.ok or "GeoOrchestra" in response.text:
print("[INFO] Connexion réussie")
return session
else:
print("[ERREUR] Échec de la connexion")
return None
except Exception as e:
print(f"[ERREUR connexion] {e}")
return None
Ensuite je réutilise ce résultat mémorisé dans une propriété session avec par exemple (listing des datastore d'un workspace) :
datastores_url = f"{self.base_url}/geoserver/rest/workspaces/{workspace}/datastores.json"
r = self.session.get(datastores_url)
r.raise_for_status()
datastores = r.json().get('dataStores', {}).get('dataStore', [])
On doit pouvoir clore ce ticket s'il n'y a pas surenchère.
Merci en tout cas d'avoir passé un peu de temps à essayer de m'aider.
Reply all
Reply to author
Forward
0 new messages