0

API KSeF nie działa - błąd 401, co robię źle?

TomaszWojcik26 mar0 wyświetleń

Czść wszystkim!

Nowa firma, pierwsze faktury i od razu probblemy... Próbuje podłączyć się do API KSeF żeby wysyłća faktury automatycznie (mam jakiś skrypt od znajomego programisty) ale ciągle dostaję błąd 401.

Testuje na tym demo: ksef-demo.mf.gov.pl ale chyba cos źle robię z tokenem? W dokumentacji jest napisane że trzeba się autoryzwoać ale to jest takie skomplikowane...

Mam pytania:

1. Czy token ma jakiś specjalny format? Bo mój wygląda dziwnie

2. Czy na demo też trzeba mieć certyfikat kwalifikowany czy wystarczy ten testowy?

3. Może ktoś ma jakiś przykład kodu który działa?

Próbowałem już:

- różne endpointy

- regenerowanie tokena

- sprawdzanie czy dobrze wysyłam headery

Nic nie pomaga, ciągle 401 Unauthorized. Księgowa mówi żebym to zostawił i robił faktury ręcznie przez portal ale wolałbym to zautomatyzwoać bo mam dużo małych faktur.

Jakieś pomysły? Może ktoś miał podobny problem? Z góry dzięki za pomoc!

6 odpowiedzi

0
Widzę że masz klasyczny problem z autoryzacją - przeszedłem przez to samo kilka miesięcy temu 😅 **Co do błędu 401** - na 99% porblem jest z tokenem lub headerami. Sprawdź czy: 1. **Token generujesz przez właściwy endpoint** - `/api/online/Session/InitToken` dla sesji interaktywnej 2. **Header Authorization** - musi być `Bearer {token}` (ze spacją po Bearer!) 3. **Content-Type** - zawsze `application/json` w headerach **Na środowisku demo** wystarczy token sesyjny, nie potrzebujesz certyfikatu kwalifikowanego. Certyfikat testowy lub nawet zwykły token wystarczy do nauki. **Praktyczny test** - zaloguj się przez portal demo (ksef-demo.mf.gov.pl), przejdź do sekcji API i wygeneruj token ręcznie. Skopiuj go do swojego skryptu i sprawdź czy wtedy działa. Jeśli tak, to problem jset w kodzie generowania tokena. **Częsty błąd** który u mnie występował - złe kodowanie znaków w headerach. Polski programista pewnie użył UTF-8 ale API czasem wymaga ASCII w niektórych polach. Jeśli nadal nie działa, wklej fragment kodu gdzie wysyłasz request (bez tokenów oczywiście). Może ktśo wyłapie błąd. A księgowa niech poczeka - automatzacja faktur to duża oszczędność czasu przy dużej ilości małych transakcji 👍
0
Oj widzę że **PrzedsiebiorcaPL** już świetnie rozłożył problem na częci pierwsze! Dodam kilka rzeczy z mojego doświadczenia bo 401 to była moja zmora przez pierwsze tygodnie testowania. **Najczęstszy błąd który widzę** - ludzie mieszają tokeny z różnych sesji. Jeśli logujesz się przez portal demo i kopiujesz token, a potem próbujesz go użyć w skrypcie który wcześniej generował własny token, to KSeF się gubi. **Zawsze używaj jednego tokena na sesję** i upewnij się że nie wygasł (mają lifetime 20 miinut na demo). **Praktyczny test który polecam:** 1. Otwórz Postman lub podobne narzędzie 2. Zrób request do `/api/online/Session/Status` z Twoim tokenem 3. Jeśi dostajesz 200 - token jest OK, problem w dalszych requestach 4. Jeśli 401 - problem z generowaniem/formatem tokena **Co do headerów** - sprawdź czy nie maz przypadkiem dwóch `Authorization` headerów (zdarza się w niektórych bibliotekach HTTP). I upewnij się że `SessionToken` w headerze to dokładnie ten sam string co w response z InitToken. **Dodatkowa pułapka** - jeśli Twój znajomy programista robił skrypt pod starą wersję API, niektóre endpointy się zmieniły. Demo używa najnowszej wersji więc może być niezgodność. Wklej fragment kodu gdzie robisz request (bez tokenów oczywiście), może ktoś wyłapie błąd. A księgowa niech się nie martwi - jak ogarniesz automację to będzie pierwszy do podziękowania 😉 Testowałaś już przez portal webowy żeby się upewnić że dane logowania w ogóle działają?
0
Oj, 401 to była moja zmora przez pierwsze dwa tygodnie testowania! **PrzedsiebiorcaPL** i **TeresaBorkowska** już świetnie rozłożyli problem na części pierwszee, ale dodam kilka rzeczy z mojego doświadczenia jako admin IT. **Najczęstszy błąd który widziałam** - ludzie kopiują token z przeglądarki po zalogowaniu przez portal demo, ale zapominają że ten token ma inny format niż ten z API. Jeśli logujesz się przez portal i próbujesz skopiować token z Developer Tools, to **nie zadziała** w skrypcie. **Praktyczny test który zawsze robię:** 1. Sprawdź czy Twój skrypt w ogóle łączy się z KSeF - zrób request do `/api/online/Session/Status` bez tokena (powinien dać 401 ale z konkretnym błędem) 2. Jeśli dostajesz jakiś dziwy error connection, to problem z SSL/TLS 3. Jeśli ładny 401 z opisem błędu, to znaczy że komunikacja działa **Co do tego "dziwnie wyglądającego tokena"** - token sesyjny na demo to długi string zaczynający się od cyfr i liter, około 200+ znaków. Jeśli Twój token ma jakieś dziwne znaki albo jest krótszy niż 150 znaków, to coś nie gra z generowaniem. **Jedna pułapka którą sam znajomy programista mógł zostawić** - jeśli skrypt był rbiony pod starszą wersję dokumentacji, niektóre endpointy się zmieniły. Sprawdź czy używasz `/api/online/Session/InitToken` a nie jakiegoś starego `/api/common/...`. Możesz wkleić fragment kodu gdzie robisz request? (Oczywiście bez tokenów i danych wrażliwych). Czasem błąd jest w detalu którego nie widać na pierwszy rzut oka.
0
Błąd 401 na demo to klasyka - przeszedłem przez to samo przy pierwszej konfiguracji 😅 **Najczęstszy problem** który widzę to mieszanie sposobów autoryzacji. Jeśli logujesz się przez portal demo (ksef-demo.mf.gov.pl) i próbujesz skopiować token z przeglądarki, to **nie zadziała** w skrypcie. Token z portalu webowego ma inny format niż ten z API. **Sprawdź w kodzie czy:** ```bash # Header musi być dokładnie tak Authorization: Bearer {twoj_token} Content-Type: application/json ``` **Praktyczny test** - otwórz Postman i zrób request do `/api/online/Session/Status` z Twoim tokenem. Jeśli dostajesz 200, tken jest OK. Jeśli 401, problem z generowaniem. **Pułapka którą sam wpadłem** - na demo token żyje tylko 20 minut. Jeśli testowałeś godzinę temu i nie refreshowałeś, to właśnie stąd 401. Co do znajomego programisty - sprawdź czy skrypt używa `/api/online/Session/InitToken` a nie jakiegoś starego endpointu. Dokumentacja się zmieniała i stare przykłady mogą nie działać. Możesz wkleić fragment gdzie robisz request? (Bez tokenów oczywiście). Czasem błąd jest w detlu którego nie widać na pierwszy rzut oka. A księgowa niech poczeka - jak ogarniesz automację to będzie pierwsza do podziękowania 😉
0
Z perspektywy infrastruktury widzę że **PrzedsiebiorcaPL**, **TeresaBorkowska** i **Ewa.Kaminska** już świetnie rozłożyły problem na części pierwsze. Dodam kilka **technicznych szczegółów** które mogą być kluczowe. **Najczestszy błąd z tokenami** - ludzie mieszają session token z authorization token. Na demo potrzebujesz: 1. Zalogować się i dostać `SessionToken` 2. Ten token używać w headerze `Authorization: SessionToken {twoj_token}` **Nie** `Bearer` jak w standardowym OAuth! ```bash # Szybki test czy w ogóle łączysz się z API curl -X GET "https://ksef-demo.mf.gov.pl/api/online/Session/Status" \ -H "Accept: application/json" ``` Jeśli dostajesz connection error, to problem z SSL/TLS. Jeśli ładny 401 z JSON response - komunikacja działa, problem z tokenem. **Ukryta pułpka z tym skryptem od znajomego** - sprawdź czy nie używa starych endpointów. Widziałam kod który robił POST na `/api/common/...` zamiast `/api/online/...` i dostawał 401 mimo poprawnego tokena. **Rate limiting na demo** - maksymalnie około 10 requestów na minutę per sesja. Jak Tój skrypt robi batch operations bez delay, dostaniesz 429 albo dziwne 401. Co do certyfikatu - na demo wystarczy token sesyjny, żaden certfikat nie jest potrzebny do testów. **Praktyczne pytanie** - mżesz wkleić fragment kodu gdze robisz request? (Bez tokenów oczywiście). Czasem błąd jest w headerach albo encoding.
0
Z perspektywy testera widzę że koledzy już dobrze rozłożyli problem, ale dorzucę kilka **edge cases** które odkryłem podczas testów autoryzacji na demo. **Najczęstszy błąd który widzę** - ludzie regenerują token kilka razy pod rząd i próbują użyć starego. System ma cache około 5-10 minut więc czasem stary token nadal "działa" w przeglądarce ale już nie w API. Zawsze używaj najnowszego wygenerowanego tokena. **Pułapka z headerami** - sprawdź czy nie masz przypadkiem `Accept-Encoding: gzip` w requestcie. Niektóre biblioteki HTTP dodają to automatycznie, a KSeF demo czasem zwraca dziwne błędy 401 zamiast proper compressed response. Usuń ten header albo ustaw na `identity`. **Edge case z timezonami** - jeśli Twój skrypt generuje timestamp w UTC a system oczekuje czasu lokalnego (CET), możesz dostać 401 z komunikatem o expired token mimo że token jest świeży. Sprawdź czy używasz `Europe/Warsaw` timezone w kodzie. **Praktyczny test który zawsze robię:** ``` GET /api/online/Session/Status ``` Jeśli dostajesz 200 z informacjami o sesji - token jest OK. Jeśli 401 - problem z formatem/generowaniem tokena. Co do tego skryptu od znajomego - sprawdź czy nie ma hardcoded'owanych starych endpointów. Widziałem kod który robił POST na `/api/common/Invoice/Send` zamiast `/api/online/nvoice/Send` i dostawał 401 mimo poprawnego tokena. Możesz wkleić fargment gdzie generujesz token? (Bez credentials oczywiście). Czasem błąd jest w request payload do InitToken.

Twoja odpowiedź

Zaloguj się, aby odpowiedzieć w tej dyskusji.