ANPR e PDND con accesso API

Ciao a tutti,
sto provando ad integrarmi alle API di ANPR accedendo tramite PDND.
Ma sto riscontrando non pochi problemi.

Oltretutto gli errori non sono “parlanti”, ma generici, per cui è molto difficile capire dove sta l’errore…

C’e’ qualche contatto tecnico diretto (e non tramite GitHub dove rispondono quando capita) a cui sottoporre qualche quesito, in modo da velocizzare un po’ lo sviluppo?!

Ciao Francesco,
stai avendo difficoltà con lo stacco del voucher JWT o proprio con l’utilizzo delle API ANPR?

All’interno delle specifiche API di solito c’è sempre il contatto tecnico di riferimento (poi se rispondono e con che tempistiche è tutto da scoprire)

Per quanto riguarda le chiamate a PDND per ottenere il voucher non ho avuto problemi (tanto è vero che con Inad non è stato un problema portare a termine l’integrazione).
E’ la seconda chiamata al servizio di ANPR che mi da dei problemi, e soprattutto gli errori non danno molte indicazioni su cosa potrebbe essere sbagliato nella chiamata.

Ciao, io ho interfacciato i servizi ANPR, scrivimi in privato la query e il msg di errore, vediamo se riesco a darti una mano.

Guarda, ti giro il link della iussue che ho aperto su GitHub

Io sto eseguendo l’integrazione utilizzando .NET.

Mi han girato un esempio scritto in Python, pero’ mi da lo stesso risultato.

from jose import jwt
from jose.constants import Algorithms
import http.client, urllib.parse
import random
import hashlib
import base64
import requests
import json
import datetime
import uuid
import os

def clear():
os.system(‘clear’)

def get_private_key(key_path):
with open(key_path, “rb”) as private_key:
encoded_string = private_key.read()
return encoded_string

if name == ‘main’:

clientid = ‘client-id-here’ #found in PDND
keyid = ‘key-id-here’ #found in PDND
purposeid = ‘purpose-id-here’ #found in PDND
userid = ‘username-here’ #mario rossi
location = ‘device-id-here’ #pc-123456
loa = ‘level of assurance’ #LoA2 / SPID
audience = ‘https://modipa-val.anpr.interno.it/govway/rest/in/MinInternoPortaANPR/C001-servizioNotifica/v1
target = “https://modipa-val.anpr.interno.it/govway/rest/in/MinInternoPortaANPR-PDND/C001-servizioNotifica/v1/anpr-service-e002
request = ‘{“idOperazioneClient”:“22”,“criteriRicerca”:{“codiceFiscale”:“DPLPRM90R10H501I”},“datiRichiesta”:{“dataRiferimentoRichiesta”:“2023-08-22”,“motivoRichiesta”:“PROT.NUM.12345”,“casoUso”:“C001”}}’

issued = datetime.datetime.utcnow()
delta = datetime.timedelta(minutes=43200)
expire_in = issued + delta
dnonce = random.randint(1000000000000, 9999999999999)

rsaKey = get_private_key(‘eservice-client-keypair.rsa.priv path here’)

headers_rsa = {
“kid”: keyid,
“alg”: ‘RS256’,
“typ”: ‘JWT’
}

#crea assertion di audit
jti = uuid.uuid4()
audit_payload = {
“userID”: userid,
“userLocation”: location,
“LoA”: loa,
“iss” : clientid,
“aud” : audience,
“purposeId”: purposeid,
“dnonce” : dnonce,
“jti”:str(jti),
“iat”: issued,
“nbf” : issued,
“exp”: expire_in
}

audit = jwt.encode(audit_payload, rsaKey, algorithm=Algorithms.RS256, headers=headers_rsa)
audit_hash = hashlib.sha256(audit.encode(‘UTF-8’)).hexdigest()

clear()
print(“audit =”, audit)
print(“audit hash =”, audit_hash)

#crea client assertion per richiesta voucher
jti = uuid.uuid4()
payload = {
“iss”: clientid,
“sub”: clientid,
“aud”: “auth.uat.interop.pagopa.it/client-assertion”,
“purposeId”: purposeid,
“jti”: str(jti),
“iat”: issued,
“exp”: expire_in,
“digest”: {
“alg”: “SHA256”,
“value”: audit_hash
}
}

client_assertion = jwt.encode(payload, rsaKey, algorithm=Algorithms.RS256, headers=headers_rsa)
print(“client assertion =”, client_assertion)

#effettua richiesta voucher
params = urllib.parse.urlencode({
‘client_id’: clientid,
‘client_assertion’: client_assertion,
‘client_assertion_type’: ‘urn:ietf:params:oauth:client-assertion-type:jwt-bearer’,
‘grant_type’: ‘client_credentials’
})
headers = {“Content-type”: “application/x-www-form-urlencoded”}
conn = http.client.HTTPSConnection(“auth.uat.interop.pagopa.it”)
conn.request(“POST”, “/token.oauth2”, params, headers)
response = conn.getresponse()

voucher = json.loads(response.read())[“access_token”]
print(“voucher=”, voucher)

#prepara il body per la richiesta e relativo digest
body = request
type = ‘application/json’
encoding = ‘UTF-8’
body_digest = hashlib.sha256(body.encode(‘UTF-8’))
digest = ‘SHA-256=’ + base64.b64encode(body_digest.digest()).decode(‘UTF-8’)

print(“body_digest =”, body_digest)

#crea signature
jti = uuid.uuid4()
payload = {
“iss” : clientid,
“aud” : audience,
“purposeId”: purposeid,
“sub”: clientid,
“jti”: str(jti),
“iat”: issued,
“nbf” : issued,
“exp”: expire_in,
“signed_headers”: [
{“digest”: digest},
{“content-type”: type},
{“content-encoding”: encoding}
]
}

signature = jwt.encode(payload, rsaKey, algorithm=Algorithms.RS256, headers=headers_rsa)
print(“signature =”, signature)

#effettua chiamata
api_url = target
headers = {“Accept”:“application/json”,
“Content-Type”:type,
“Content-Encoding”:encoding,
“Digest”:digest,
“Authorization”:"Bearer " + voucher,
“Agid-JWT-TrackingEvidence”:audit,
“Agid-JWT-Signature”:signature
}

print(“headers =”, headers)

response = requests.post(api_url, data=body.encode(‘UTF-8’), headers=headers, verify=False)

response = requests.get(api_url, headers=headers, verify=False)

print(“response =”, response.json())

L’esempio si riferiesce al servizio C001, io l’ho declinato per la C003 di cui ho fatto richiesta di fruizione in ambiente di collaudo.

Buongiorno,
mi trovo in una situazione simile ma parto praticamente da zero. Il comune per cui lavoro è accreditato e dovrei permettere all’azienda che sviluppa software per noi di accedere tramite API alla ANPR in sola lettura.
Chiedo scusa ma la documentazione che reperisco non mi è chiara e in qualche punto manca.
Ad esempio Documentazione tecnica | Guida ad ANPR cliccando sui file di documentazione continuo ad avere Access denied.
Qualcuno potrebbe aiutarmi?
Grazie,

Link utile ma ormai vecchio e non aggiornato.
In generale fare riferimento qui, ma poi dipende da cosa si cerca:

1 Mi Piace