[{"data":1,"prerenderedAt":978},["ShallowReactive",2],{"docs:doc:\u002Fpl\u002Fdocs\u002Fpierwsze-kroki\u002Fszybki-start":3,"docs:pages:docs_pl":909},{"id":4,"title":5,"alt":6,"body":7,"description":900,"extension":901,"key":902,"meta":903,"navigation":285,"order":373,"path":904,"placeholder":905,"seo":906,"stem":907,"__hash__":908},"docs_pl\u002Fpl\u002Fdocs\u002Fpierwsze-kroki\u002Fszybki-start.md","Szybki start","\u002Fen\u002Fdocs\u002Fgetting-started\u002Fquickstart",{"type":8,"value":9,"toc":890},"minimark",[10,28,36,41,60,63,103,110,117,121,140,143,177,184,203,207,232,239,243,257,478,489,496,521,525,528,553,715,736,740,826,830,844,853,870,874,886],[11,12,15],"callout",{"title":13,"type":14},"Paczek nie ma jeszcze w repozytoriach","warning",[16,17,18,19,23,24,27],"p",{},"SDK są w wersji ",[20,21,22],"code",{},"0.1.0"," i trafią do npm oraz PyPI razem z wydaniem ",[20,25,26],{},"1.0.0",".\nPolecenia poniżej to te, którymi będzie się je instalować.",[16,29,30,31,35],{},"Na końcu tej strony przeglądarka zaloguje się do Twojej własnej aplikacji i\nprzekaże Twojemu kodowi token dostępu. Wszystko dzieje się w ",[32,33,34],"strong",{},"sandboksie",",\ngdzie użytkowników możesz kasować bez żalu.",[37,38,40],"h2",{"id":39},"_1-załóż-aplikację","1. Załóż aplikację",[16,42,43,44,51,52,55,56,59],{},"Zaloguj się do ",[45,46,50],"a",{"href":47,"rel":48},"https:\u002F\u002Fapp.kleora.io",[49],"nofollow","konsoli",". Konto bez żadnej\naplikacji wita kreator w trzech krokach, którego drugi krok to formularz\ntworzenia; jeśli masz już jakąś aplikację, kolejną zakładasz przyciskiem ",[32,53,54],{},"Utwórz aplikację"," na liście\n",[32,57,58],{},"Aplikacje",".",[16,61,62],{},"Z nazwy powstaje slug, a ze sluga dwa stałe adresy:",[64,65,66,79],"table",{},[67,68,69],"thead",{},[70,71,72,76],"tr",{},[73,74,75],"th",{},"Środowisko",[73,77,78],{},"Adres",[80,81,82,93],"tbody",{},[70,83,84,88],{},[85,86,87],"td",{},"Produkcja",[85,89,90],{},[20,91,92],{},"https:\u002F\u002Facme.kleora.eu",[70,94,95,98],{},[85,96,97],{},"Sandbox",[85,99,100],{},[20,101,102],{},"https:\u002F\u002Facme.sandbox.kleora.eu",[16,104,105,106,109],{},"To są adresy wydawcy (issuer) tej aplikacji. Sluga nie da się później zmienić:\nto on stoi w polu ",[20,107,108],{},"iss"," każdego wydanego tokenu i to jego zapamiętała każda\nusługa, która kiedykolwiek sprawdziła Twój token. Wybierz go tak uważnie jak\ndomenę.",[16,111,112,113,116],{},"Po zakończeniu kreatora trafiasz na przegląd środowiska ",[32,114,115],{},"sandbox"," — a tam są\ntrzy wartości potrzebne na dalszej części tej strony: issuer, identyfikator\ndomyślnego klienta i adres dokumentu discovery.",[37,118,120],{"id":119},"_2-zarejestruj-adresy-powrotne","2. Zarejestruj adresy powrotne",[16,122,123,124,127,128,131,132,135,136,139],{},"Wejdź w ",[32,125,126],{},"Integracja → Klienci"," i otwórz klienta o nazwie ",[32,129,130],{},"Default",". Jest to\nklient typu ",[20,133,134],{},"spa",", tworzony razem z aplikacją, i ",[32,137,138],{},"nie ma ani jednego adresu\npowrotnego",". Dopóki go nie dodasz, endpoint autoryzacyjny nie ma dokąd odesłać\nprzeglądarki.",[16,141,142],{},"Dodaj dwa, których użyje Twój serwer deweloperski:",[64,144,145,155],{},[67,146,147],{},[70,148,149,152],{},[73,150,151],{},"Pole",[73,153,154],{},"Wartość",[80,156,157,167],{},[70,158,159,162],{},[85,160,161],{},"Redirect URI",[85,163,164],{},[20,165,166],{},"http:\u002F\u002Flocalhost:5173\u002Fcallback",[70,168,169,172],{},[85,170,171],{},"Post-logout redirect URI",[85,173,174],{},[20,175,176],{},"http:\u002F\u002Flocalhost:5173\u002F",[16,178,179,180,183],{},"Oba są porównywane ",[32,181,182],{},"dokładnie",". Ukośnik na końcu, inny port albo dodatkowy\nparametr w query to z punktu widzenia endpointu autoryzacyjnego zupełnie inny\nadres.",[11,185,188],{"title":186,"type":187},"Zwykły http:\u002F\u002F to udogodnienie wyłącznie sandboksowe","note",[16,189,190,191,194,195,198,199,202],{},"Środowisko sandbox przyjmuje ",[20,192,193],{},"http:\u002F\u002Flocalhost"," i ",[20,196,197],{},"http:\u002F\u002F127.0.0.1"," na dowolnym\nporcie i dowolnej ścieżce. Produkcja przyjmuje wyłącznie ",[20,200,201],{},"https:\u002F\u002F",", więc\nlokalnego adresu, na którym pracujesz, nie da się tam przenieść — produkcja ma\nwłasną listę.",[37,204,206],{"id":205},"_3-zainstaluj-sdk-przeglądarkowe","3. Zainstaluj SDK przeglądarkowe",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-bash shiki shiki-themes github-light","npm install @kleora-io\u002Fbrowser\n","bash","",[20,215,216],{"__ignoreMap":213},[217,218,221,225,229],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"s7eDp","npm",[217,226,228],{"class":227},"sYBdl"," install",[217,230,231],{"class":227}," @kleora-io\u002Fbrowser\n",[16,233,234,235,59],{},"Paczka nie ma zależności w czasie działania i jest publikowana wyłącznie jako\nmoduły ES. Pozostałe cztery opisuje\n",[45,236,238],{"href":237},"\u002Fpl\u002Fdocs\u002Fpierwsze-kroki\u002Finstalacja","Instalacja SDK",[37,240,242],{"id":241},"_4-zaloguj-się","4. Zaloguj się",[16,244,245,246,194,249,252,253,256],{},"Do klienta trafiają trzy wartości: ",[32,247,248],{},"issuer",[32,250,251],{},"identyfikator klienta"," ze\nstrony przeglądu oraz ",[32,254,255],{},"redirect URI"," zarejestrowany przed chwilą.",[208,258,262],{"className":259,"code":260,"language":261,"meta":213,"style":213},"language-ts shiki shiki-themes github-light","import { createKleora } from '@kleora-io\u002Fbrowser'\n\nconst kleora = createKleora({\n  issuer: 'https:\u002F\u002Facme.sandbox.kleora.eu',\n  clientId: '\u003Cclient_id>',\n  redirectUri: location.origin + '\u002Fcallback',\n})\n\nif (location.pathname === '\u002Fcallback') {\n  await kleora.handleRedirectCallback()\n} else if (!(await kleora.checkSession())) {\n  await kleora.loginWithRedirect()\n}\n\nconst user = kleora.getUser()\nconst token = await kleora.getAccessToken()\n","ts",[20,263,264,280,287,306,318,329,343,349,354,371,386,418,430,436,441,458],{"__ignoreMap":213},[217,265,266,270,274,277],{"class":219,"line":220},[217,267,269],{"class":268},"sD7c4","import",[217,271,273],{"class":272},"sgsFI"," { createKleora } ",[217,275,276],{"class":268},"from",[217,278,279],{"class":227}," '@kleora-io\u002Fbrowser'\n",[217,281,283],{"class":219,"line":282},2,[217,284,286],{"emptyLinePlaceholder":285},true,"\n",[217,288,290,293,297,300,303],{"class":219,"line":289},3,[217,291,292],{"class":268},"const",[217,294,296],{"class":295},"sYu0t"," kleora",[217,298,299],{"class":268}," =",[217,301,302],{"class":223}," createKleora",[217,304,305],{"class":272},"({\n",[217,307,309,312,315],{"class":219,"line":308},4,[217,310,311],{"class":272},"  issuer: ",[217,313,314],{"class":227},"'https:\u002F\u002Facme.sandbox.kleora.eu'",[217,316,317],{"class":272},",\n",[217,319,321,324,327],{"class":219,"line":320},5,[217,322,323],{"class":272},"  clientId: ",[217,325,326],{"class":227},"'\u003Cclient_id>'",[217,328,317],{"class":272},[217,330,332,335,338,341],{"class":219,"line":331},6,[217,333,334],{"class":272},"  redirectUri: location.origin ",[217,336,337],{"class":268},"+",[217,339,340],{"class":227}," '\u002Fcallback'",[217,342,317],{"class":272},[217,344,346],{"class":219,"line":345},7,[217,347,348],{"class":272},"})\n",[217,350,352],{"class":219,"line":351},8,[217,353,286],{"emptyLinePlaceholder":285},[217,355,357,360,363,366,368],{"class":219,"line":356},9,[217,358,359],{"class":268},"if",[217,361,362],{"class":272}," (location.pathname ",[217,364,365],{"class":268},"===",[217,367,340],{"class":227},[217,369,370],{"class":272},") {\n",[217,372,374,377,380,383],{"class":219,"line":373},10,[217,375,376],{"class":268},"  await",[217,378,379],{"class":272}," kleora.",[217,381,382],{"class":223},"handleRedirectCallback",[217,384,385],{"class":272},"()\n",[217,387,389,392,395,398,401,404,407,410,412,415],{"class":219,"line":388},11,[217,390,391],{"class":272},"} ",[217,393,394],{"class":268},"else",[217,396,397],{"class":268}," if",[217,399,400],{"class":272}," (",[217,402,403],{"class":268},"!",[217,405,406],{"class":272},"(",[217,408,409],{"class":268},"await",[217,411,379],{"class":272},[217,413,414],{"class":223},"checkSession",[217,416,417],{"class":272},"())) {\n",[217,419,421,423,425,428],{"class":219,"line":420},12,[217,422,376],{"class":268},[217,424,379],{"class":272},[217,426,427],{"class":223},"loginWithRedirect",[217,429,385],{"class":272},[217,431,433],{"class":219,"line":432},13,[217,434,435],{"class":272},"}\n",[217,437,439],{"class":219,"line":438},14,[217,440,286],{"emptyLinePlaceholder":285},[217,442,444,446,449,451,453,456],{"class":219,"line":443},15,[217,445,292],{"class":268},[217,447,448],{"class":295}," user",[217,450,299],{"class":268},[217,452,379],{"class":272},[217,454,455],{"class":223},"getUser",[217,457,385],{"class":272},[217,459,461,463,466,468,471,473,476],{"class":219,"line":460},16,[217,462,292],{"class":268},[217,464,465],{"class":295}," token",[217,467,299],{"class":268},[217,469,470],{"class":268}," await",[217,472,379],{"class":272},[217,474,475],{"class":223},"getAccessToken",[217,477,385],{"class":272},[16,479,480,481,484,485,488],{},"Uruchom. Przeglądarka wychodzi na hostowaną stronę logowania Twojej aplikacji,\ngdzie możesz od razu założyć pierwszego użytkownika — samodzielna rejestracja\njest w nowym środowisku włączona — i wraca na ",[20,482,483],{},"\u002Fcallback"," z kodem\nautoryzacyjnym. ",[20,486,487],{},"handleRedirectCallback()"," wymienia go na tokeny, sprawdza ID\ntoken, zapisuje wynik i usuwa kod z paska adresu.",[16,490,491,492,495],{},"Wylogowanie to jedno wywołanie, a ",[20,493,494],{},"returnTo"," musi być jednym z zarejestrowanych\nadresów po wylogowaniu:",[208,497,499],{"className":259,"code":498,"language":261,"meta":213,"style":213},"await kleora.logout({ returnTo: location.origin + '\u002F' })\n",[20,500,501],{"__ignoreMap":213},[217,502,503,505,507,510,513,515,518],{"class":219,"line":220},[217,504,409],{"class":268},[217,506,379],{"class":272},[217,508,509],{"class":223},"logout",[217,511,512],{"class":272},"({ returnTo: location.origin ",[217,514,337],{"class":268},[217,516,517],{"class":227}," '\u002F'",[217,519,520],{"class":272}," })\n",[37,522,524],{"id":523},"_5-sprawdź-token-w-swoim-api","5. Sprawdź token w swoim API",[16,526,527],{},"Token dostępu to podpisany JWT. Twoje API sprawdza go względem zestawu kluczy\npublikowanego przez Twój issuer — bez odpytywania nas i bez współdzielonego\nsekretu.",[11,529,531],{"title":530,"type":187},"Co podać jako audience",[16,532,533,534,537,538,541,542,545,546,549,550,59],{},"Pole ",[20,535,536],{},"aud"," tokenu to ",[20,539,540],{},"[client_id]",", a po ustawieniu na środowisku własnego\n",[20,543,544],{},"api_audience"," — ",[20,547,548],{},"[client_id, api_audience]",". Świeże środowisko nie ma go\nwcale, więc dopóki go nie ustawisz, jako audience podawaj ",[32,551,552],{},"identyfikator\nklienta",[554,555,556,633],"code-tabs",{},[557,558,559],"template",{"v-slot:ts":213},[208,560,562],{"className":259,"code":561,"language":261,"meta":213,"style":213},"import { authenticate } from '@kleora-io\u002Fnode'\n\nconst claims = await authenticate(request, {\n  issuer: 'https:\u002F\u002Facme.sandbox.kleora.eu',\n  audience: '\u003Cclient_id>',\n})\n\nconsole.log(claims.sub, claims.tenant, claims.permissions)\n",[20,563,564,576,580,597,605,614,618,622],{"__ignoreMap":213},[217,565,566,568,571,573],{"class":219,"line":220},[217,567,269],{"class":268},[217,569,570],{"class":272}," { authenticate } ",[217,572,276],{"class":268},[217,574,575],{"class":227}," '@kleora-io\u002Fnode'\n",[217,577,578],{"class":219,"line":282},[217,579,286],{"emptyLinePlaceholder":285},[217,581,582,584,587,589,591,594],{"class":219,"line":289},[217,583,292],{"class":268},[217,585,586],{"class":295}," claims",[217,588,299],{"class":268},[217,590,470],{"class":268},[217,592,593],{"class":223}," authenticate",[217,595,596],{"class":272},"(request, {\n",[217,598,599,601,603],{"class":219,"line":308},[217,600,311],{"class":272},[217,602,314],{"class":227},[217,604,317],{"class":272},[217,606,607,610,612],{"class":219,"line":320},[217,608,609],{"class":272},"  audience: ",[217,611,326],{"class":227},[217,613,317],{"class":272},[217,615,616],{"class":219,"line":331},[217,617,348],{"class":272},[217,619,620],{"class":219,"line":345},[217,621,286],{"emptyLinePlaceholder":285},[217,623,624,627,630],{"class":219,"line":351},[217,625,626],{"class":272},"console.",[217,628,629],{"class":223},"log",[217,631,632],{"class":272},"(claims.sub, claims.tenant, claims.permissions)\n",[557,634,635],{"v-slot:python":213},[208,636,640],{"className":637,"code":638,"language":639,"meta":213,"style":213},"language-python shiki shiki-themes github-light","from kleora import verify_access_token\n\nclaims = verify_access_token(\n    token,\n    issuer=\"https:\u002F\u002Facme.sandbox.kleora.eu\",\n    audience=\"\u003Cclient_id>\",\n)\n\nprint(claims.sub, claims.tenant, claims.permissions)\n","python",[20,641,642,654,658,669,674,687,699,704,708],{"__ignoreMap":213},[217,643,644,646,649,651],{"class":219,"line":220},[217,645,276],{"class":268},[217,647,648],{"class":272}," kleora ",[217,650,269],{"class":268},[217,652,653],{"class":272}," verify_access_token\n",[217,655,656],{"class":219,"line":282},[217,657,286],{"emptyLinePlaceholder":285},[217,659,660,663,666],{"class":219,"line":289},[217,661,662],{"class":272},"claims ",[217,664,665],{"class":268},"=",[217,667,668],{"class":272}," verify_access_token(\n",[217,670,671],{"class":219,"line":308},[217,672,673],{"class":272},"    token,\n",[217,675,676,680,682,685],{"class":219,"line":320},[217,677,679],{"class":678},"sqxcx","    issuer",[217,681,665],{"class":268},[217,683,684],{"class":227},"\"https:\u002F\u002Facme.sandbox.kleora.eu\"",[217,686,317],{"class":272},[217,688,689,692,694,697],{"class":219,"line":331},[217,690,691],{"class":678},"    audience",[217,693,665],{"class":268},[217,695,696],{"class":227},"\"\u003Cclient_id>\"",[217,698,317],{"class":272},[217,700,701],{"class":219,"line":345},[217,702,703],{"class":272},")\n",[217,705,706],{"class":219,"line":351},[217,707,286],{"emptyLinePlaceholder":285},[217,709,710,713],{"class":219,"line":356},[217,711,712],{"class":295},"print",[217,714,632],{"class":272},[16,716,717,720,721,724,725,728,729,194,732,735],{},[20,718,719],{},"authenticate"," przyjmuje cokolwiek, co ma własność ",[20,722,723],{},"headers.authorization",",\nwięc zadziała z dowolnym frameworkiem w Node; ",[20,726,727],{},"@kleora-io\u002Fnode"," dostarcza\nteż middleware dla Express i Fastify. ",[20,730,731],{},"claims.roles",[20,733,734],{},"claims.permissions"," są\njuż w tokenie, więc autoryzacja żądania kosztuje tyle, co sprawdzenie elementu\nna liście.",[37,737,739],{"id":738},"co-sdk-robi-za-ciebie","Co SDK robi za Ciebie",[64,741,742,752],{},[67,743,744],{},[70,745,746,749],{},[73,747,748],{},"Wywołanie",[73,750,751],{},"Czym się zajmuje",[80,753,754,772,786,796,806,816],{},[70,755,756,761],{},[85,757,758],{},[20,759,760],{},"loginWithRedirect()",[85,762,763,764,767,768,771],{},"Generuje ",[20,765,766],{},"state",", ",[20,769,770],{},"nonce"," i weryfikator PKCE, po czym przechodzi na endpoint autoryzacyjny.",[70,773,774,778],{},[85,775,776],{},[20,777,487],{},[85,779,780,781,194,783,785],{},"Sprawdza ",[20,782,766],{},[20,784,108],{},", wymienia kod, weryfikuje ID token, zapisuje tokeny, czyści adres.",[70,787,788,793],{},[85,789,790],{},[20,791,792],{},"getAccessToken()",[85,794,795],{},"Oddaje token z pamięci, dopóki do jego wygaśnięcia zostało więcej niż 30 sekund; potem odświeża. Tokeny odświeżania rotują przy każdym użyciu.",[70,797,798,803],{},[85,799,800],{},[20,801,802],{},"checkSession()",[85,804,805],{},"Odtwarza sesję przy wczytaniu strony, po cichu, bez pokazywania logowania od nowa.",[70,807,808,813],{},[85,809,810],{},[20,811,812],{},"logout({ returnTo })",[85,814,815],{},"Czyści stan lokalny i kończy sesję u wydawcy.",[70,817,818,823],{},[85,819,820],{},[20,821,822],{},"onAuthChange(cb)",[85,824,825],{},"Odpala się przy zalogowaniu, wylogowaniu i odświeżeniu tokenu. Zwraca funkcję odsubskrybowania.",[37,827,829],{"id":828},"gdzie-leżą-tokeny","Gdzie leżą tokeny",[16,831,832,833,835,836,839,840,843],{},"Domyślnie oba tokeny są trzymane w pamięci, w domknięciu. Nic nie przeżywa\nprzeładowania strony — i właśnie dlatego przy wczytaniu wywołuje się\n",[20,834,802],{},". Opcja ",[20,837,838],{},"storage: 'session'"," dodatkowo odkłada token\nodświeżania w ",[20,841,842],{},"sessionStorage",", który należy do jednej karty i znika razem z\nnią.",[16,845,846,852],{},[32,847,848,851],{},[20,849,850],{},"localStorage"," nie jest opcją i nie będzie."," Trwa w nieskończoność, dzielą\ngo wszystkie karty tego samego origin i czyta go każdy skrypt, jaki się tam\nkiedykolwiek wykona — w tym ten, który jutro przyjedzie w zależności wdrożonej\ndziś.",[11,854,856],{"title":855,"type":187},"Dlaczego na localhoście zawsze widać przekierowanie",[16,857,858,860,861,194,864,867,868,59],{},[20,859,802],{}," odtwarza sesję po cichu, wczytując wydawcę w ukrytej ramce.\nDziała to tylko wtedy, gdy aplikacja i jej issuer są tą samą witryną (same\nsite). ",[20,862,863],{},"localhost:5173",[20,865,866],{},"acme.sandbox.kleora.eu"," nią nie są, więc na\nmaszynie deweloperskiej każde przeładowanie idzie widocznym objazdem przez\nstronę logowania — bez pytania o hasło. W obrębie jednej karty problem znika\nprzy ",[20,869,838],{},[37,871,873],{"id":872},"dalej","Dalej",[875,876,877,883],"ul",{},[878,879,880,882],"li",{},[45,881,238],{"href":237}," — Nuxt, Node, Python i\nDjango.",[878,884,885],{},"TOTP, zaproszenia do przestrzeni roboczych czy oznaczenie strony logowania\nwłasną marką włączysz z konsoli; żadna z tych rzeczy nie zmienia kodu powyżej.",[887,888,889],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":213,"searchDepth":289,"depth":289,"links":891},[892,893,894,895,896,897,898,899],{"id":39,"depth":282,"text":40},{"id":119,"depth":282,"text":120},{"id":205,"depth":282,"text":206},{"id":241,"depth":282,"text":242},{"id":523,"depth":282,"text":524},{"id":738,"depth":282,"text":739},{"id":828,"depth":282,"text":829},{"id":872,"depth":282,"text":873},"Załóż aplikację, podłącz SDK przeglądarkowe i zaloguj się po raz pierwszy — w całości w sandboksie.","md","getting-started\u002Fquickstart",{},"\u002Fpl\u002Fdocs\u002Fpierwsze-kroki\u002Fszybki-start",false,{"title":5,"description":900},"pl\u002Fdocs\u002Fpierwsze-kroki\u002Fszybki-start","3VK9AkKB26rXVur4XWgf5F4WEKKVz28tsns9HlIl1S4",[910,916,921,925,926,932,938,943,948,953,958,963,968,973],{"path":911,"title":912,"description":913,"order":914,"key":915},"\u002Fpl\u002Fdocs","Dokumentacja Kleora","Dodaj hostowane logowanie do swojej aplikacji, sprawdź token w swoim API i zarządzaj użytkownikami, przestrzeniami roboczymi i rolami z jednej konsoli.",0,"index",{"path":917,"title":918,"description":919,"order":373,"key":920},"\u002Fpl\u002Fdocs\u002Fpierwsze-kroki","Pierwsze kroki","Od pustego projektu do działającego logowania — i paczki, które do tego prowadzą.","getting-started\u002Findex",{"path":237,"title":238,"description":922,"order":923,"key":924},"Pięć paczek, które publikujemy, do czego służy każda z nich i jakiej konfiguracji wymaga.",20,"getting-started\u002Finstallation",{"path":904,"title":5,"description":900,"order":373,"key":902},{"path":927,"title":928,"description":929,"order":930,"key":931},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Farchitektura","Jak zbudowana jest Kleora","Kształt usługi hostowanej — jeden adres na środowisko, dwie powierzchnie API i miejsce, w którym leży stan. Oraz dlaczego hostowania u siebie dzisiaj nie wspieramy.",30,"guides\u002Farchitecture",{"path":933,"title":934,"description":935,"order":936,"key":937},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fframeworki\u002Fexpress","Express","Sprawdzanie tokenu dostępu we własnym API — middleware, uprawnienia i trzy odpowiedzi, jakie może mieć odmowa.",40,"guides\u002Fquickstarts\u002Fexpress",{"path":939,"title":940,"description":941,"order":373,"key":942},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fframeworki","Szybki start dla frameworków","Po jednej stronie na stos — Next.js, Nuxt, Express i zwykła przeglądarka — i dwa adresy powrotne, które łączą je wszystkie.","guides\u002Fquickstarts\u002Findex",{"path":944,"title":945,"description":946,"order":923,"key":947},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fframeworki\u002Fnextjs","Next.js","SDK przeglądarkowe w aplikacji na App Router — leniwy klient, trasa powrotna i sprawdzanie tokenu w route handlerze.","guides\u002Fquickstarts\u002Fnextjs",{"path":949,"title":950,"description":951,"order":930,"key":952},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fframeworki\u002Fnuxt","Nuxt","Moduł dla Nuxt — dwie linijki konfiguracji, strona powrotu, której nie piszesz, i middleware chroniący stronę z jej własnych metadanych.","guides\u002Fquickstarts\u002Fnuxt",{"path":954,"title":955,"description":956,"order":373,"key":957},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fframeworki\u002Fprzegladarka","Zwykła przeglądarka","Jedna instancja klienta, jedna trasa powrotna i token dostępu do każdego żądania, które wysyła Twoja aplikacja.","guides\u002Fquickstarts\u002Fbrowser",{"path":959,"title":960,"description":961,"order":923,"key":962},"\u002Fpl\u002Fdocs\u002Fprzewodniki","Przewodniki","Jak podłączyć usługę Kleora do swojego stosu, jakich słów używa produkt i jak zbudowana jest usługa hostowana.","guides\u002Findex",{"path":964,"title":965,"description":966,"order":923,"key":967},"\u002Fpl\u002Fdocs\u002Fprzewodniki\u002Fpojecia","Przestrzenie robocze, role i środowiska","Pięć słów, z których zbudowany jest produkt, to, które z nich niosą Twoje tokeny, i jak zmiana roli dociera do działającej aplikacji.","guides\u002Fconcepts",{"path":969,"title":970,"description":971,"order":930,"key":972},"\u002Fpl\u002Fdocs\u002Freferencje","Referencje","Materiały referencyjne dla API HTTP i paczek SDK.","reference\u002Findex",{"path":974,"title":975,"description":976,"order":373,"key":977},"\u002Fpl\u002Fdocs\u002Freferencje\u002Fpodswietlanie","Podświetlanie kodu","Po jednym bloku na każdą wstępnie wczytaną gramatykę Shiki — próbka, nie strona referencyjna.","reference\u002Fcode-highlighting",1790698197897]