Qortora · Search · Indexed page

forum.italia.itFetched 2026-08-17T18:41:09Z

ANPR e PDND con accesso API - ANPR - Anagrafe Nazionale - Forum Italia

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 s…

Open original source · Full cached text

ANPR e PDND con accesso API - ANPR - Anagrafe Nazionale - Forum Italia = 40rem)" rel="stylesheet" data-target="chat_desktop" /> = 40rem)" rel="stylesheet" data-target="discourse-reactions_desktop" /> = 40rem)" rel="stylesheet" data-target="poll_desktop" /> ANPR e PDND con accesso API ANPR - Anagrafe Nazionale TheVise (Francesco Visentin) 16 Novembre 2023, 10:51am 1 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?! AlessioMarinelli (Alessio Marinelli) 21 Novembre 2023, 11:40am 2 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) TheVise (Francesco Visentin) 22 Novembre 2023, 7:54am 3 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. glauco (Glauco Rampogna) 22 Novembre 2023, 11:29am 4 Ciao, io ho interfacciato i servizi ANPR, scrivimi in privato la query e il msg di errore, vediamo se riesco a darti una mano. TheVise (Francesco Visentin) 22 Novembre 2023, 12:10pm 5 Guarda, ti giro il link della iussue che ho aperto su GitHub TheVise (Francesco Visentin) 22 Novembre 2023, 12:14pm 6 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. GiGoTs (Giulio) 3 Dicembre 2023, 7:53am 7 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, Marco_Migliori (Marco Migliori) 7 Dicembre 2023, 5:33pm 8 Link utile ma ormai vecchio e non aggiornato. In generale fare riferimento qui, ma poi dipende da cosa si cerca: 1 Mi Piace Luca_Montano (Luca Montano) 10 Ottobre 2025, 7:49am 9 Buongiorno, è possibile utilizzare per il token di audit informazioni relative ad un utente che si autentica su un’applicazione e che però non appartiene allo stesso ente del fruitore che ha fatto richiesta degli e-service di ANPR su PDND? Praticamente se un ente x che eroga un’applicazione y ha aderito a PDND ed ha eseguito l’iter su PDND per poter fruire degli e-service, ed un utente w di un ente z (anche non aderente a PDND) accede all’applicazione y, si possono utilizzare i dati di audit dell’utente w sfruttando la fruizione effettuata dall’ente x? Sulle linee guida si parla di dominio del fruitore, ma in questo caso il fruitore che fornisce un servizio a degli utenti può utilizzare i dati di questi utenti e riportarli all’interno del token di audit anche se tali utenti non appartengono all’ente? Spero di aver spiegato bene il dubbio. Grazie. Luca AMGefil-strapgef (Mario Abbruscato) 29 Ottobre 2025, 12:59pm 10 Durante l’invocazione dell’e-service C030 – Accertamento Identificativo Unico Nazionale tramite PDND / GovWay, otteniamo sempre: HTTP 400 – InteroperabilityInvalidRequest detail: “Received request is not conform to the required interoperability profile” Il token OAuth2 viene rilasciato correttamente da auth.interop.pagopa.it, ma il claim aud risulta: https://modipa.anpr.interno.it/govway/rest/in/MinInternoPortaANPR/C030-servizioAccertamentoIdUnicoNazionale/v1 mentre l’endpoint effettivo del servizio PDND è: https://modipa.anpr.interno.it/govway/rest/in/MinInternoPortaANPR-PDND/C030-servizioAccertamentoIdUnicoNazionale/v1/anpr-service-e002 Chiamando l’endpoint senza -PDND → 404 Not Found Chiamando quello con -PDND → 400 InteroperabilityInvalidRequest Tutti gli header PDND richiesti (Agid-JWT-Signature, Agid-JWT-TrackingEvidence, Digest, X-Request-Id, X-Correlation-Id) e il body JSON conforme sono presenti. Richiesta: potete verificare se l’audience configurata per il nostro client in PDND deve essere aggiornata a includere il suffisso -PDND, così da allinearla all’endpoint effettivo del servizio? Riferimento “govway_id”: “80d2b74b-b4c7-11f0-8a29-005056ae1d2a” Grazie