Ktoś się rozprawił z logowaniem za pomocą tokenu?
Wziąłem ich templatkę (InitSessionTokenRequestExample.xml), podmieniłem Identifier, Challange i zaszyfrowany (mam nadzeję, że prawidłowo) Token i wysłałem, ale interfejs zwraca "Błąd wewnętrzny (A)". Gdzieś wcześniej na tym wątku widziałem, że to jest odpowiednik "Bad request", ale średnio rozumiem co by to miało oznaczać w tym przypadku.
Fakt faktem mogę mieć nieprawidłowo zaszyfrowany token, ale komunikat błędu chyba by jednoznacznie na to wskazywał. Ktoś ma na to pomysł?
Edit:
Do zakodowania tokenu posłużyłem się informacjami z tej strony: https://microeducate.tech/how-to-load-the-rsa-public-key-from-file-in-c/
(Jeśli ktoś ma lepsze źródło/sposób żeby szyfrować token to z chęcią przygarnę)
RSACryptoServiceProvider rsa = DecodeX509PublicKey(Convert.FromBase64String("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWosgHSpiRLadA0fQbzshi5TluliZfDsJujPlyYqp6A3qnzS3WmHxtwgO58uTbemQ1HCC2qwrMwuJqR6l8tgA4ilBMDbEEtkzgbjkJ6xoEqBptgxivP/ovOFYYoAnY6brZhXytCamSvjY9KI0g0McRk24pOueXT0cbb0tlwEEjVZ8NveQNKT2c1EEE2cjmW0XB3UlIBqNqiY2rWF86DcuFDTUy+KzSmTJTFvU/ENNyLTh5kkDOmB1SY1Zaw9/Q6+a4VJ0urKZPw+61jtzWmucp4CO2cfXg9qtF6cxFIrgfbtvLofGQg09Bh7Y6ZA5VfMRDVDYLjvHwDYUHg2dPIk0wIDAQAB"));
string CODEDTOKEN = (Convert.ToBase64String(rsa.Encrypt(Encoding.ASCII.GetBytes(token), false)));
gdzie 'token' to token zwrócony przez api.
Szablon pliku wziąłem z: https://ksef.mf.gov.pl/document/InitSessionTokenRequestExample/1.0
Zmieniałem jedynie trzy rzeczy: <Challange>, <Identifier> (jestem raczej pewny, że obie są prawidłowe, bo robiłem to samo podczas logowania profilem zaufanym i wszystko się zgadzało) oraz <Token> (wrzucam CODEDTOKEN z wstawionego wcześniej kodu).
Nie ruszałem natomiast sekcji Encryption - jest taka jak w pobranym pliku
Edit2:
Edit3:
Plik .xml wygląda tak:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:InitSessionTokenRequest
xmlns="http://ksef.mf.gov.pl/schema/gtw/svc/online/types/2021/10/01/0001"
xmlns:ns2="http://ksef.mf.gov.pl/schema/gtw/svc/types/2021/10/01/0001"
xmlns:ns3="http://ksef.mf.gov.pl/schema/gtw/svc/online/auth/request/2021/10/01/0001">
<ns3:Context>
<Challenge>20220323-CR-1C6F8A5791-E964BE4B8A-77</Challenge>
<Identifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:SubjectIdentifierByCompanyType">
<ns2:Identifier>6310012429</ns2:Identifier>
</Identifier>
<DocumentType>
<ns2:Service>KSeF</ns2:Service>
<ns2:FormCode>
<ns2:SystemCode>FA (1)</ns2:SystemCode>
<ns2:SchemaVersion>1-0E</ns2:SchemaVersion>
<ns2:TargetNamespace>http://crd.gov.pl/wzor/2021/11/29/11089/</ns2:TargetNamespace>
<ns2:Value>FA</ns2:Value>
</ns2:FormCode>
</DocumentType>
<Token>sd+QNY0SKC8u4K554JVQqvbhdCe+f/kEy7n5SSxsj5X8/bYzOaD8IjWP90hP7ReKT2gK2KbVLcPqXBfhavZgNWdyckbLF2YAI9X5xeLvOuJlKCmNyEK60m/lGNZ3UvktyrWwKyeqbadlctVRIrH2ZwYPEYLvvoUVAwh4xc6tjubE0h+UCtH9vp2IjtYrNu0UbaS2v7sxRbEGLLYeUK1eNSxwC7gHUgzQNT+LZ/gB9QxIVDEIkNRbmwpAwqOB47vjdWh71uaUmMxEJPZwo+DY/XbQ+g5b6+lYtpixRJ8J9qCtWtyt0vuj7X1ENDJEapNtFQQgDaiZSlqxDo4HBuikpA==</Token>
</ns3:Context>
</ns3:InitSessionTokenRequest>
Edit5:
Metoda którą szyfruję RSA:
public string RsaEncryptWithPublic(string clearText, string publicKey)
{
var bytesToEncrypt = Encoding.UTF8.GetBytes(clearText);
var encryptEngine = new Pkcs1Encoding(new RsaEngine());
using (var txtreader = new StringReader(publicKey))
{
var keyParameter = (AsymmetricKeyParameter)new PemReader(txtreader).ReadObject();
encryptEngine.Init(true, keyParameter);
}
var encrypted = Convert.ToBase64String(encryptEngine.ProcessBlock(bytesToEncrypt, 0, bytesToEncrypt.Length));
return encrypted;
}
Szyfrowanie: (gdzie timestamp to data otrzymana w challange'u, a token wygenerowanym tokenem dla podmiotu)
long unixMilisecondsTimestamp = new DateTimeOffset(timestamp).ToUnixTimeMilliseconds();
String toEncrypt = $"{token}|{unixMilisecondsTimestamp.ToString()}";
String CODEDTOKEN = RsaEncryptWithPublic(toEncrypt, "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWosgHSpiRLadA0fQbzshi5TluliZfDsJujPlyYqp6A3qnzS3WmHxtwgO58uTbemQ1HCC2qwrMwuJqR6l8tgA4ilBMDbEEtkzgbjkJ6xoEqBptgxivP/ovOFYYoAnY6brZhXytCamSvjY9KI0g0McRk24pOueXT0cbb0tlwEEjVZ8NveQNKT2c1EEE2cjmW0XB3UlIBqNqiY2rWF86DcuFDTUy+KzSmTJTFvU/ENNyLTh5kkDOmB1SY1Zaw9/Q6+a4VJ0urKZPw+61jtzWmucp4CO2cfXg9qtF6cxFIrgfbtvLofGQg09Bh7Y6ZA5VfMRDVDYLjvHwDYUHg2dPIk0wIDAQAB\r\n-----END PUBLIC KEY-----");
Czas otrzymany w challange'u (odpowiedź dostałem 8:56 naszego czasu) i jego reprezentacja po przerobieniu metodą z paru linii wyżej: "1648108611842"