Cześć, mam kolejne pytanie. Idę zgodnie z logiką webinara wykonując następujące kroki:
- https://ksef-test.mf.gov.pl/api/online/Session/AuthorisationChallenge - korzystając z NIP1 jako kontekstu.
- https://ksef-test.mf.gov.pl/api/online/Session/InitSigned - podpisuję pieczęcią NIP1.
- https://ksef-test.mf.gov.pl/api/online/Credentials/Grant - nadaję poświadczenia do wysyłania i odczytywania faktur, podmiotowi NIP2.
- https://ksef-test.mf.gov.pl/api/online/Credentials/Status/elementReferenceNumber - sprawdzam status nadania poświadczeń, jak jest 200 to idę dalej.
- https://ksef-test.mf.gov.pl/api/online/Session/AuthorisationChallenge - ponownie robię challenge korzystając z NIP1 jako kontekstu.
- https://ksef-test.mf.gov.pl/api/online/Session/InitSigned - podpisuję jako podmiot NIP2
- https://ksef-test.mf.gov.pl/api/online/Credentials/GenerateToken - generuję token autoryzacyjny korzystając z tokena sesyjnego otrzymanego w kroku 6 (czyli jako NIP2)
- https://ksef-test.mf.gov.pl/api/online/Credentials/Status/elementReferenceNumber -sprawdzam status tokena.
W kroku 8 za każdym razem dostaje błąd: "processingCode":410,"processingDescription":"21301:Brak autoryzacji."
Przeglądając forum natrafiłem na informację, że tworzenie tokenu ma sens jedynie w sesji z pieczęcią. Faktycznie wtedy token działa jednak mam jakiś błąd przy szyfrowaniu. Poniżej załączę kod, którym szyfruję token. Gdyby ktoś mógł mi wskazać błąd to byłbym wdzięczny.
SZYFROWANIE TOKENU:
import java.security.KeyFactory
import java.security.spec.X509EncodedKeySpec
import javax.crypto.Cipher
import java.util.Base64
import java.text.SimpleDateFormat
import java.util.Date
timestamp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").parse(${challengeTime})
byte[] message = (${token}+"|"+timestamp.getTime()).getBytes()
def publicKeyPEM = """MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWosgHSpiRLadA0fQbzshi5TluliZfDsJujPlyYqp6A3qnzS3WmHxtwgO58uTbemQ1HCC2qwrMwuJqR6l8tgA4ilBMDbEEtkzgbjkJ6xoEqBptgxivP/ovOFYYoAnY6brZhXytCamSvjY9KI0g0McRk24pOueXT0cbb0tlwEEjVZ8NveQNKT2c1EEE2cjmW0XB3UlIBqNqiY2rWF86DcuFDTUy+KzSmTJTFvU/ENNyLTh5kkDOmB1SY1Zaw9/Q6+a4VJ0urKZPw+61jtzWmucp4CO2cfXg9qtF6cxFIrgfbtvLofGQg09Bh7Y6ZA5VfMRDVDYLjvHwDYUHg2dPIk0wIDAQAB"""
def keyFactory = KeyFactory.getInstance("RSA")
def publicKeyBytes = Base64.getDecoder().decode(publicKeyPEM.replaceAll("\\n", "").getBytes())
def publicKeySpec = new X509EncodedKeySpec(publicKeyBytes)
def publicKey = keyFactory.generatePublic(publicKeySpec)
def cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding")
cipher.init(Cipher.ENCRYPT_MODE, publicKey)
def encryptedData = cipher.doFinal(message)
def base64EncodedData = Base64.getEncoder().encodeToString(encryptedData)
Nadal jednak nie rozumiem jaki jest sens nadawania poświadczeń podmiotowi NIP2 skoro i tak token autoryzacyjny działa dla NIP1 i nie uwzględnia żadnej informacji o tym NIP2. W webinarze token autoryzacyjny został wygenerowany przy użyciu tokena sesyjnego uzyskanego w procesie uwierzytelniania podpisem, a nie pieczęcią.