Bag 2.0 extract download d.m.v soap en login

Een eenvoudige POST naar https://service10.kadaster.nl/gds2/afgifte/productstore met BODY

<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:v20=“http://www.kadaster.nl/schemas/gds2/make2stock/v20201201”>
soapenv:Header/
soapenv:Body
v20:BestandenlijstOpvragenRequest
v20:Artikelnummers2532</v20:Artikelnummers>
</v20:BestandenlijstOpvragenRequest>
</soapenv:Body>
</soapenv:Envelope>

met HEADER
Authorization en de Base64Value
werkt uitstekend op mijn eigen server.

Echter, als ik hetzelfde uitvoer op de server van m’n klant krijg ik 405 Method No Allowed.

Hoe kan dit? Als ik overigens WEB.postman.co gebruik dan krijg ik deze foutmelding zowel op de server van m’n klant als op m’n eigen server.

Hulp zeer gewaardeerd! :slight_smile:

Zoek de verschillen…
Eerste wat bij mij opkomt is firewall, tweede is .NET versie ivm https, en zo zijn er nog wel wat dingen te verzinnen…

Hoe? Curl, FME, een browser, Postman? Zou ook nog een dingetje kunnen zijn. Maar op dit moment is er door lezers hier heeel weinig over te zeggen, omdat we jou omgeving niet kennen.

1 like

Dankje voor je reactie Stefan. Verschillen in de omgeving hoefde ik niet uit te zoeken. Ik heb het met python geprobeerd en daarmee werkte het wel.

Hmmm, ok. Nou, in ieder geval blij dat het nu lukt.

Persoonlijk zou ik toch graag willen weten waarom mijn Plan A op de ene plek niet werkte, en op de andere plek wel. Al was het alleen maar om het feit dat de ene plek van een klant was, en je dus de garantie hebt dat je het op andere plekken/klanten ook tegen het lijf loopt (en die klanten staan wellicht Python niet toe op een server…).
Maar goed, that’s my 2 cents.

Ben het met iedereen eens dat het kadaster best wel meer inzicht of een fatsoenlijke manier zou kunnen geven hoe de authenticatie werkt. Ze weten het zelf niet eens en nu is het prutswerk uit het jaar 0.

Ik liep ook tegen probleem aan dat dat downloaden wel lukte maar ik heb ook die lijst met AfgifteID’s nodig.
Door de vraag van Risingblue werd ik wel op juiste spoor gezet. Die “Method Not Allowed” was ik ook al tegengekomen en getackeld maar daarna niet gedacht om die basic authentication hier nog een keer te gebruiken. Het lijkt erop dat ik alle stappen nu compleet heb in postman, klaar voor het echte werk in c#.

Eerste stap is het aanloggen.
In de documentatie (ehm) worden daar hints gegeven.
De body zou volgens documentatie moeten zijn: user=xxx&password=xxx
Maar postman maakt er in de header dan Content-Type=tekst/plain van als je dat uitvinkt en expliciet: Content-Type=application/x-www-form-urlencoded invult gaat het wel goed.
Of je vult form-data met twee keys/values (1 voor user en 1 voor password) in en dan wordt er in de body user:xxx password:xxx van gemaakt en gaat het ook goed.
Nu krijg je dus een aangemelde pagina met cookie terug (heel primitief, zucht). Maar goed die cookie heb je dan wel.

Het soap productstore request, heel belangrijk, mag geen content-type header hebben (staat ergens een hint in documentatie). Postman doet dit standaard wel en daardoor krijg je die ‘Method Not Allowed’.
Bij authorization gebruik je “basic auth” met username en password, postman maakt hier dan die authorization header met een base64 van.
Nu krijg ik dus een soap response met de lijst van afgifte id’s daarin.

Vervolgens kun je een mutatie downloaden met de download url en het AfgifiteID in de url. In deze GET moet dus de cookie aan de header toegevoegd worden.

Nog een aanvulling. Er staat wel leuk dat er geen Content-Type meegestuurt mag worden maar dat is in de praktijk iets weerbarstiger. De C# HttpClient staat niet toe dat deze leeg is of weggehaald wordt. Het blijkt dat het met een Content-Type: ‘text/xml’ ook werkt.

Dit Pythonscript zette me in de juiste richting, dank! Het script enigszins aangepast en geïntegreerd in een FME-workspace. Nu kunnen we weer extracten downloaden :slight_smile:

Ik heb van alles wat ik in dit forum-topic tegenkwam geprobeerd maar het lukt mij niet om een eenvoudige soapcall te doen die een bestandenlijst terugkrijgt, het blijft maar terugkomen met “Authentication Required”:

mijn script:

from base64 import b64encode
import requests

def basic_auth(username,passord):
token= b64encode(f"{username}:{password}".encode(‘utf-8’)).decode(“ascii”)
return f’Basic {token}’

url = “https://service10.kadaster.nl/gds2/afgifte/productstore
username = “XXXXXXXXXXXX”
password = “XXXXXXXXXXXXXX”

SOAPenvelope= “”"
<soapenv:Envelope xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/
xmlns:v20=“http://www.kadaster.nl/schemas/gds2/make2stock/v20201201”>
soapenv:Header/
soapenv:Body
v20:BestandenlijstOpvragenRequest
v20:Periode
v20:DatumTijdVanaf2023-03-01T00:00:00</v20:DatumTijdVanaf>
v20:DatumTijdTotEnMet2023-04-01T23:59:59</v20:DatumTijdTotEnMet>
</v20:Periode>
v20:Artikelnummers2536</v20:Artikelnummers>
</v20:BestandenlijstOpvragenRequest>
</soapenv:Body>
</soapenv:Envelope>"""

options={“Authentication”: basic_auth(username,password)}
response = requests.post(url,data= SOAPenvelope,headers=options)
print(response.text)

mijn vraag:

is er ergens een bestand met voorbeeldcode te downloaden hier of bij kadaster?

Op zich ziet er goed uit, ik doe alleen niet die Auth-header encoding, dat laat ik requests doen en zet SOAP headers:

requests.post(url, headers=soap_headers, data= SOAPenvelope, auth=(username, password))

met:

soap_headers = CaseInsensitiveDict()
soap_headers["Accept"] = "text/xml"
soap_headers["Content-Type"] = "text/xml"

De hele procedure t/m download is inderdaad, zeg maar, uitdagend :slight_smile: maar de Kadaster-handleiding volgend is er uit te komen. Ik doe deze stappen in combinatie Python en Bash/curl, maar mogelijk is deze procedure inmiddels gewijzigd:

  • haal lijst beschikbare bestanden op via SOAP met credentials als Basic Auth (zie boven)
  • haal uuid uit response XML bijv <ns3:AfgifteID>bdb7cc60-c3d1-4eb6-8413-bd6b8c67290a</ns3:AfgifteID>
  • download: get Cookie inlogcode via regular Form POST op https://mijn.kadaster.nl/security/login.do
  • bewaar Cookie en zet die in uiteindelijke HTTP download request
  • de uuid zit in URL bijv https://service10.kadaster.nl/gds2/download/productstore/bdb7cc60-c3d1-4eb6-8413-bd6b8c67290a
2 likes

Thanx Just, dit werkt