[{"data":1,"prerenderedAt":2941},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-auth-overview":442,"-hu-auth-overview-surround":2936},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":88,"body":444,"description":2929,"extension":2930,"links":2931,"meta":2932,"navigation":2933,"path":89,"seo":2934,"stem":90,"__hash__":2935},"docs_hu\u002Fhu\u002F12.auth\u002F1.overview.md",{"type":445,"value":446,"toc":2916},"minimark",[447,455,484,539,571,578,593,597,625,652,655,669,762,867,899,903,916,996,1023,1769,1786,1790,1809,1974,1994,1999,2023,2230,2280,2284,2303,2509,2512,2531,2787,2813,2817,2835,2848,2852,2872,2893,2897,2912],[448,449,450,451,454],"p",{},"Importáld az ",[452,453,82],"code",{},"-ot, hogy JWT-t bocsáss ki, és bearer tokenből identityt csinálj:",[456,457,462],"pre",{"className":458,"code":459,"language":460,"meta":461,"style":461},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fauth\"\n","go","",[452,463,464],{"__ignoreMap":461},[465,466,469,473,477,481],"span",{"class":467,"line":468},"line",1,[465,470,472],{"class":471},"s7zQu","import",[465,474,476],{"class":475},"sMK4o"," \"",[465,478,480],{"class":479},"sBMFI","github.com\u002Fgp-system\u002Fauth",[465,482,483],{"class":475},"\"\n",[448,485,486,487,489,490,494,495,500,501,505,506,512,513,516,517,520,521,526,527,530,531,534,535,538],{},"Az ",[452,488,82],{}," egy önálló, stateless JWT-modul, ",[491,492,493],"strong",{},"semmilyen más gp-system csomagtól nem függ",", még az ",[496,497,498],"a",{"href":363},[452,499,358],{},"-től vagy a ",[496,502,503],{"href":392},[452,504,386],{},"-től sem: az egyetlen függősége a ",[496,507,511],{"href":508,"rel":509},"https:\u002F\u002Fgithub.com\u002Fgolang-jwt\u002Fjwt",[510],"nofollow","golang-jwt\u002Fjwt\u002Fv5",". Két dolgot ad: egy ",[491,514,515],{},"token-kibocsátót"," (JWT aláírás és ellenőrzés) és az ",[452,518,519],{},"Identify","-t, ami egy bearer tokenből ",[496,522,523],{"href":94},[452,524,525],{},"rbac.Identity","-t csinál. Innen minden authorizációs döntés (a ",[496,528,529],{"href":94},"szerep- és permission-ellenőrzés",", a ",[496,532,533],{"href":99},"policy-k",") már a tokentől függetlenül, az ",[452,536,537],{},"Identity"," fölött történik.",[540,541,486,542,544,545,547,548,551,552,555,556,559,560,563,564,566,567,570],"note",{},[452,543,82],{}," sosem ír HTTP választ, és az ",[452,546,519],{}," még csak ",[452,549,550],{},"*http.Request","-et sem vár: egy fejléc-",[491,553,554],{},"értéket"," vár. Ez bármilyen transportról használhatóvá teszi, nem csak ",[452,557,558],{},"net\u002Fhttp","-ről: egy WebSocket handshake-ből, egy gRPC interceptorból, ami metaadatot olvas, egy üzenetsor-fogyasztóból, ami a tokent egy üzenetfejlécben ellenőrzi. Minden hiba egy sima Go error (sentinel vagy kis típusos érték); a hívó dönti el, hogyan jelenítse meg. Teljes, futtatható példákért lásd az ",[496,561,562],{"href":104},"Önálló használat"," oldalt, HTTP-vel és anélkül is. A gpsystem kit erre épít rá egy ",[452,565,558],{}," middleware-t és RFC 9457 Problem-renderelést a ",[452,568,569],{},"server"," csomagjában.",[448,572,573,574,577],{},"Az autentikáció alapja itt a ",[491,575,576],{},"stateless JWT",": a login végpont aláírt tokent ad, minden további kérés a tokent hordozza, és a szerver semmilyen session-tárat nem tart: a token önmagában hordozza a subjectet, a szerepeket és a jogosultságokat.",[540,579,580,581,584,585,588,589,592],{},"A csomag a ",[496,582,511],{"href":508,"rel":583},[510],"-re épül, és nem rejti el: a claims-típusok a ",[452,586,587],{},"jwt.Claims"," interfészt implementálják, a saját claims struct a ",[452,590,591],{},"jwt.RegisteredClaims","-t ágyazza be. A modul itt centralizál, nem absztrahál: a JWT-ökoszisztéma tudásod egy az egyben használható.",[594,595,25],"h2",{"id":596},"telepítés",[456,598,602],{"className":599,"code":600,"language":601,"meta":461,"style":461},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com\u002Fgp-system\u002Fauth@v0.1.0   # a kit is ezt a taget használja\n# vagy: go get github.com\u002Fgp-system\u002Fauth@latest\n","sh",[452,603,604,619],{"__ignoreMap":461},[465,605,606,608,612,615],{"class":467,"line":468},[465,607,460],{"class":479},[465,609,611],{"class":610},"sfazB"," get",[465,613,614],{"class":610}," github.com\u002Fgp-system\u002Fauth@v0.1.0",[465,616,618],{"class":617},"sHwdD","   # a kit is ezt a taget használja\n",[465,620,622],{"class":467,"line":621},2,[465,623,624],{"class":617},"# vagy: go get github.com\u002Fgp-system\u002Fauth@latest\n",[448,626,486,627,629,630,633,634,637,638,641,642,645,646,648,649,651],{},[452,628,82],{}," egyetlen függősége a ",[496,631,511],{"href":508,"rel":632},[510],"; az ",[452,635,636],{},"auth\u002Frbac"," és az ",[452,639,640],{},"auth\u002Fpolicy"," alcsomag ugyanabban a modulban szállít, külön ",[452,643,644],{},"go get"," nem kell hozzájuk. Semmi nem igényli itt a gpsystem kitet vagy bármelyik más gp-system modult: lásd az ",[496,647,562],{"href":104}," oldalt egy olyan projekthez, ami csak a ",[452,650,480],{},"-ot importálja.",[594,653,204],{"id":654},"konfiguráció",[448,656,486,657,660,661,664,665,668],{},[452,658,659],{},"auth.Config"," env-ből töltődik; a generált projekt configjában a ",[452,662,663],{},"\u002F\u002F gpsystem:config"," anchor alá teszed, ",[452,666,667],{},"JWT_"," prefixszel:",[456,670,672],{"className":458,"code":671,"language":460,"meta":461,"style":461},"\u002F\u002F internal\u002Fplatform\u002Fconfig\u002Fconfig.go\ntype Config struct {\n    Server server.Config\n    DB     dbx.Config  `envPrefix:\"DB_\"`\n    JWT    auth.Config `envPrefix:\"JWT_\"`\n    \u002F\u002F gpsystem:config\n}\n",[452,673,674,679,693,708,730,750,756],{"__ignoreMap":461},[465,675,676],{"class":467,"line":468},[465,677,678],{"class":617},"\u002F\u002F internal\u002Fplatform\u002Fconfig\u002Fconfig.go\n",[465,680,681,684,687,690],{"class":467,"line":621},[465,682,683],{"class":475},"type",[465,685,686],{"class":479}," Config",[465,688,689],{"class":475}," struct",[465,691,692],{"class":475}," {\n",[465,694,696,700,702,705],{"class":467,"line":695},3,[465,697,699],{"class":698},"sTEyZ","    Server ",[465,701,569],{"class":479},[465,703,704],{"class":475},".",[465,706,707],{"class":479},"Config\n",[465,709,711,714,716,718,721,724,727],{"class":467,"line":710},4,[465,712,713],{"class":698},"    DB     ",[465,715,405],{"class":479},[465,717,704],{"class":475},[465,719,720],{"class":479},"Config",[465,722,723],{"class":475},"  `",[465,725,726],{"class":610},"envPrefix:\"DB_\"",[465,728,729],{"class":475},"`\n",[465,731,733,736,738,740,742,745,748],{"class":467,"line":732},5,[465,734,735],{"class":698},"    JWT    ",[465,737,82],{"class":479},[465,739,704],{"class":475},[465,741,720],{"class":479},[465,743,744],{"class":475}," `",[465,746,747],{"class":610},"envPrefix:\"JWT_\"",[465,749,729],{"class":475},[465,751,753],{"class":467,"line":752},6,[465,754,755],{"class":617},"    \u002F\u002F gpsystem:config\n",[465,757,759],{"class":467,"line":758},7,[465,760,761],{"class":475},"}\n",[763,764,765,781],"table",{},[766,767,768],"thead",{},[769,770,771,775,778],"tr",{},[772,773,774],"th",{},"Env-változó",[772,776,777],{},"Mező",[772,779,780],{},"Alapértelmezés",[782,783,784,802,819,837,852],"tbody",{},[769,785,786,792,797],{},[787,788,789],"td",{},[452,790,791],{},"JWT_SECRET",[787,793,794],{},[452,795,796],{},"Secret",[787,798,799],{},[491,800,801],{},"kötelező",[769,803,804,809,814],{},[787,805,806],{},[452,807,808],{},"JWT_ACCESS_TOKEN_TTL",[787,810,811],{},[452,812,813],{},"AccessTTL",[787,815,816],{},[452,817,818],{},"15m",[769,820,821,826,831],{},[787,822,823],{},[452,824,825],{},"JWT_REFRESH_TOKEN_TTL",[787,827,828],{},[452,829,830],{},"RefreshTTL",[787,832,833,836],{},[452,834,835],{},"168h"," (7 nap)",[769,838,839,844,849],{},[787,840,841],{},[452,842,843],{},"JWT_ISSUER",[787,845,846],{},[452,847,848],{},"Issuer",[787,850,851],{},"üres (az issuer-ellenőrzés kikapcsolva)",[769,853,854,859,864],{},[787,855,856],{},[452,857,858],{},"JWT_AUDIENCE",[787,860,861],{},[452,862,863],{},"Audience",[787,865,866],{},"üres (az audience-ellenőrzés kikapcsolva)",[868,869,870,871,873,874,876,877,880,881,883,884,886,887,889,890,886,893,896,897,704],"warning",{},"Állítsd be az ",[452,872,848],{},"-t és az ",[452,875,863],{},"-t, és ",[491,878,879],{},"service-enként és környezetenként külön"," ",[452,882,796],{},"-et használj: így egy másik service-nek vagy a staging környezetnek kiállított token nem játszható vissza a production API ellen. Ha az ",[452,885,848],{},"\u002F",[452,888,863],{}," be van állítva, a parse megköveteli az egyező ",[452,891,892],{},"iss",[452,894,895],{},"aud"," claimet. A teljes env-referencia: ",[496,898,204],{"href":205},[594,900,902],{"id":901},"token-kibocsátás-a-login-flow","Token-kibocsátás: a login flow",[448,904,905,906,909,910,912,913,915],{},"A kit standard claims-alakja a ",[452,907,908],{},"DefaultClaims",": a ",[452,911,525],{}," mezőivel kompatibilis, és a ",[452,914,591],{},"-t ágyazza be:",[456,917,919],{"className":458,"code":918,"language":460,"meta":461,"style":461},"type DefaultClaims struct {\n    Username    string   `json:\"username,omitempty\"`\n    Roles       []string `json:\"roles,omitempty\"`\n    Permissions []string `json:\"permissions,omitempty\"`\n    jwt.RegisteredClaims\n}\n",[452,920,921,932,949,966,982,992],{"__ignoreMap":461},[465,922,923,925,928,930],{"class":467,"line":468},[465,924,683],{"class":475},[465,926,927],{"class":479}," DefaultClaims",[465,929,689],{"class":475},[465,931,692],{"class":475},[465,933,934,937,941,944,947],{"class":467,"line":621},[465,935,936],{"class":698},"    Username    ",[465,938,940],{"class":939},"spNyl","string",[465,942,943],{"class":475},"   `",[465,945,946],{"class":610},"json:\"username,omitempty\"",[465,948,729],{"class":475},[465,950,951,954,957,959,961,964],{"class":467,"line":695},[465,952,953],{"class":698},"    Roles       ",[465,955,956],{"class":475},"[]",[465,958,940],{"class":939},[465,960,744],{"class":475},[465,962,963],{"class":610},"json:\"roles,omitempty\"",[465,965,729],{"class":475},[465,967,968,971,973,975,977,980],{"class":467,"line":710},[465,969,970],{"class":698},"    Permissions ",[465,972,956],{"class":475},[465,974,940],{"class":939},[465,976,744],{"class":475},[465,978,979],{"class":610},"json:\"permissions,omitempty\"",[465,981,729],{"class":475},[465,983,984,987,989],{"class":467,"line":732},[465,985,986],{"class":479},"    jwt",[465,988,704],{"class":475},[465,990,991],{"class":479},"RegisteredClaims\n",[465,993,994],{"class":467,"line":752},[465,995,761],{"class":475},[448,997,998,999,1002,1003,1006,1007,1006,1010,1006,1012,1015,1016,1018,1019,1022],{},"A ",[452,1000,1001],{},"NewDefaultClaims"," a registered claimeket (",[452,1004,1005],{},"iat",", ",[452,1008,1009],{},"exp",[452,1011,892],{},[452,1013,1014],{},"sub",", és ha konfigurált, ",[452,1017,895],{},") a configból bélyegzi ki; a ",[452,1020,1021],{},"TokenIssuer"," írja alá és parseolja a tokent. Így néz ki a shop login service-e vázlatosan:",[456,1024,1026],{"className":458,"code":1025,"language":460,"meta":461,"style":461},"\u002F\u002F internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fservice\u002Fauth.go (vázlat)\ntype Service struct {\n    jwt    auth.Config\n    issuer *auth.TokenIssuer[auth.DefaultClaims]\n    users  UserRepo\n    tokens RefreshTokenRepo\n}\n\nfunc New(jwtCfg auth.Config, users UserRepo, tokens RefreshTokenRepo) *Service {\n    return &Service{\n        jwt:    jwtCfg,\n        issuer: auth.NewTokenIssuer[auth.DefaultClaims](jwtCfg),\n        users:  users,\n        tokens: tokens,\n    }\n}\n\nfunc (s *Service) Login(ctx context.Context, email, password string) (LoginResult, error) {\n    user, err := s.users.FindByEmail(ctx, email)\n    if err != nil || !user.CheckPassword(password) {\n        return LoginResult{}, ErrInvalidCredentials\n    }\n\n    claims := auth.NewDefaultClaims(s.jwt, user.ID, user.Name,\n        user.Roles, user.Permissions) \u002F\u002F iat\u002Fexp\u002Fiss\u002Fsub kitöltve a configból\n    access, err := s.issuer.Sign(claims)\n    if err != nil {\n        return LoginResult{}, err\n    }\n\n    refresh, err := auth.NewRefreshToken() \u002F\u002F 32 bájt crypto\u002Frand, hexben\n    if err != nil {\n        return LoginResult{}, err\n    }\n    expiresAt := time.Now().Add(s.jwt.RefreshTTL)\n    if err := s.tokens.Store(ctx, user.ID, sha256Hex(refresh), expiresAt); err != nil {\n        return LoginResult{}, err\n    }\n\n    return LoginResult{AccessToken: access, RefreshToken: refresh}, nil\n}\n",[452,1027,1028,1033,1044,1055,1081,1089,1097,1101,1108,1160,1174,1189,1220,1233,1245,1251,1256,1261,1323,1361,1398,1413,1418,1423,1468,1493,1524,1537,1549,1554,1559,1584,1597,1608,1613,1649,1709,1720,1725,1730,1764],{"__ignoreMap":461},[465,1029,1030],{"class":467,"line":468},[465,1031,1032],{"class":617},"\u002F\u002F internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fadmin\u002Fservice\u002Fauth.go (vázlat)\n",[465,1034,1035,1037,1040,1042],{"class":467,"line":621},[465,1036,683],{"class":475},[465,1038,1039],{"class":479}," Service",[465,1041,689],{"class":475},[465,1043,692],{"class":475},[465,1045,1046,1049,1051,1053],{"class":467,"line":695},[465,1047,1048],{"class":698},"    jwt    ",[465,1050,82],{"class":479},[465,1052,704],{"class":475},[465,1054,707],{"class":479},[465,1056,1057,1060,1063,1065,1067,1069,1072,1074,1076,1078],{"class":467,"line":710},[465,1058,1059],{"class":698},"    issuer ",[465,1061,1062],{"class":475},"*",[465,1064,82],{"class":479},[465,1066,704],{"class":475},[465,1068,1021],{"class":479},[465,1070,1071],{"class":475},"[",[465,1073,82],{"class":479},[465,1075,704],{"class":475},[465,1077,908],{"class":479},[465,1079,1080],{"class":475},"]\n",[465,1082,1083,1086],{"class":467,"line":732},[465,1084,1085],{"class":698},"    users  ",[465,1087,1088],{"class":479},"UserRepo\n",[465,1090,1091,1094],{"class":467,"line":752},[465,1092,1093],{"class":698},"    tokens ",[465,1095,1096],{"class":479},"RefreshTokenRepo\n",[465,1098,1099],{"class":467,"line":758},[465,1100,761],{"class":475},[465,1102,1104],{"class":467,"line":1103},8,[465,1105,1107],{"emptyLinePlaceholder":1106},true,"\n",[465,1109,1111,1114,1118,1121,1125,1128,1130,1132,1135,1138,1141,1143,1146,1149,1152,1155,1158],{"class":467,"line":1110},9,[465,1112,1113],{"class":475},"func",[465,1115,1117],{"class":1116},"s2Zo4"," New",[465,1119,1120],{"class":475},"(",[465,1122,1124],{"class":1123},"sHdIc","jwtCfg",[465,1126,1127],{"class":479}," auth",[465,1129,704],{"class":475},[465,1131,720],{"class":479},[465,1133,1134],{"class":475},",",[465,1136,1137],{"class":1123}," users",[465,1139,1140],{"class":479}," UserRepo",[465,1142,1134],{"class":475},[465,1144,1145],{"class":1123}," tokens",[465,1147,1148],{"class":479}," RefreshTokenRepo",[465,1150,1151],{"class":475},")",[465,1153,1154],{"class":475}," *",[465,1156,1157],{"class":479},"Service",[465,1159,692],{"class":475},[465,1161,1163,1166,1169,1171],{"class":467,"line":1162},10,[465,1164,1165],{"class":471},"    return",[465,1167,1168],{"class":475}," &",[465,1170,1157],{"class":479},[465,1172,1173],{"class":475},"{\n",[465,1175,1177,1180,1183,1186],{"class":467,"line":1176},11,[465,1178,1179],{"class":698},"        jwt",[465,1181,1182],{"class":475},":",[465,1184,1185],{"class":698},"    jwtCfg",[465,1187,1188],{"class":475},",\n",[465,1190,1192,1195,1197,1199,1201,1204,1206,1208,1210,1212,1215,1217],{"class":467,"line":1191},12,[465,1193,1194],{"class":698},"        issuer",[465,1196,1182],{"class":475},[465,1198,1127],{"class":698},[465,1200,704],{"class":475},[465,1202,1203],{"class":1116},"NewTokenIssuer",[465,1205,1071],{"class":475},[465,1207,82],{"class":479},[465,1209,704],{"class":475},[465,1211,908],{"class":479},[465,1213,1214],{"class":475},"](",[465,1216,1124],{"class":698},[465,1218,1219],{"class":475},"),\n",[465,1221,1223,1226,1228,1231],{"class":467,"line":1222},13,[465,1224,1225],{"class":698},"        users",[465,1227,1182],{"class":475},[465,1229,1230],{"class":698},"  users",[465,1232,1188],{"class":475},[465,1234,1236,1239,1241,1243],{"class":467,"line":1235},14,[465,1237,1238],{"class":698},"        tokens",[465,1240,1182],{"class":475},[465,1242,1145],{"class":698},[465,1244,1188],{"class":475},[465,1246,1248],{"class":467,"line":1247},15,[465,1249,1250],{"class":475},"    }\n",[465,1252,1254],{"class":467,"line":1253},16,[465,1255,761],{"class":475},[465,1257,1259],{"class":467,"line":1258},17,[465,1260,1107],{"emptyLinePlaceholder":1106},[465,1262,1264,1266,1269,1272,1274,1276,1278,1281,1283,1286,1289,1291,1294,1296,1299,1301,1304,1307,1309,1311,1314,1316,1319,1321],{"class":467,"line":1263},18,[465,1265,1113],{"class":475},[465,1267,1268],{"class":475}," (",[465,1270,1271],{"class":1123},"s ",[465,1273,1062],{"class":475},[465,1275,1157],{"class":479},[465,1277,1151],{"class":475},[465,1279,1280],{"class":1116}," Login",[465,1282,1120],{"class":475},[465,1284,1285],{"class":1123},"ctx",[465,1287,1288],{"class":479}," context",[465,1290,704],{"class":475},[465,1292,1293],{"class":479},"Context",[465,1295,1134],{"class":475},[465,1297,1298],{"class":1123}," email",[465,1300,1134],{"class":475},[465,1302,1303],{"class":1123}," password",[465,1305,1306],{"class":939}," string",[465,1308,1151],{"class":475},[465,1310,1268],{"class":475},[465,1312,1313],{"class":479},"LoginResult",[465,1315,1134],{"class":475},[465,1317,1318],{"class":939}," error",[465,1320,1151],{"class":475},[465,1322,692],{"class":475},[465,1324,1326,1329,1331,1334,1337,1340,1342,1345,1347,1350,1352,1354,1356,1358],{"class":467,"line":1325},19,[465,1327,1328],{"class":698},"    user",[465,1330,1134],{"class":475},[465,1332,1333],{"class":698}," err ",[465,1335,1336],{"class":475},":=",[465,1338,1339],{"class":698}," s",[465,1341,704],{"class":475},[465,1343,1344],{"class":698},"users",[465,1346,704],{"class":475},[465,1348,1349],{"class":1116},"FindByEmail",[465,1351,1120],{"class":475},[465,1353,1285],{"class":698},[465,1355,1134],{"class":475},[465,1357,1298],{"class":698},[465,1359,1360],{"class":475},")\n",[465,1362,1364,1367,1369,1372,1375,1378,1381,1384,1386,1389,1391,1394,1396],{"class":467,"line":1363},20,[465,1365,1366],{"class":471},"    if",[465,1368,1333],{"class":698},[465,1370,1371],{"class":475},"!=",[465,1373,1374],{"class":475}," nil",[465,1376,1377],{"class":475}," ||",[465,1379,1380],{"class":475}," !",[465,1382,1383],{"class":698},"user",[465,1385,704],{"class":475},[465,1387,1388],{"class":1116},"CheckPassword",[465,1390,1120],{"class":475},[465,1392,1393],{"class":698},"password",[465,1395,1151],{"class":475},[465,1397,692],{"class":475},[465,1399,1401,1404,1407,1410],{"class":467,"line":1400},21,[465,1402,1403],{"class":471},"        return",[465,1405,1406],{"class":479}," LoginResult",[465,1408,1409],{"class":475},"{},",[465,1411,1412],{"class":698}," ErrInvalidCredentials\n",[465,1414,1416],{"class":467,"line":1415},22,[465,1417,1250],{"class":475},[465,1419,1421],{"class":467,"line":1420},23,[465,1422,1107],{"emptyLinePlaceholder":1106},[465,1424,1426,1429,1431,1433,1435,1437,1439,1442,1444,1447,1449,1452,1454,1457,1459,1461,1463,1466],{"class":467,"line":1425},24,[465,1427,1428],{"class":698},"    claims ",[465,1430,1336],{"class":475},[465,1432,1127],{"class":698},[465,1434,704],{"class":475},[465,1436,1001],{"class":1116},[465,1438,1120],{"class":475},[465,1440,1441],{"class":698},"s",[465,1443,704],{"class":475},[465,1445,1446],{"class":698},"jwt",[465,1448,1134],{"class":475},[465,1450,1451],{"class":698}," user",[465,1453,704],{"class":475},[465,1455,1456],{"class":698},"ID",[465,1458,1134],{"class":475},[465,1460,1451],{"class":698},[465,1462,704],{"class":475},[465,1464,1465],{"class":698},"Name",[465,1467,1188],{"class":475},[465,1469,1471,1474,1476,1479,1481,1483,1485,1488,1490],{"class":467,"line":1470},25,[465,1472,1473],{"class":698},"        user",[465,1475,704],{"class":475},[465,1477,1478],{"class":698},"Roles",[465,1480,1134],{"class":475},[465,1482,1451],{"class":698},[465,1484,704],{"class":475},[465,1486,1487],{"class":698},"Permissions",[465,1489,1151],{"class":475},[465,1491,1492],{"class":617}," \u002F\u002F iat\u002Fexp\u002Fiss\u002Fsub kitöltve a configból\n",[465,1494,1496,1499,1501,1503,1505,1507,1509,1512,1514,1517,1519,1522],{"class":467,"line":1495},26,[465,1497,1498],{"class":698},"    access",[465,1500,1134],{"class":475},[465,1502,1333],{"class":698},[465,1504,1336],{"class":475},[465,1506,1339],{"class":698},[465,1508,704],{"class":475},[465,1510,1511],{"class":698},"issuer",[465,1513,704],{"class":475},[465,1515,1516],{"class":1116},"Sign",[465,1518,1120],{"class":475},[465,1520,1521],{"class":698},"claims",[465,1523,1360],{"class":475},[465,1525,1527,1529,1531,1533,1535],{"class":467,"line":1526},27,[465,1528,1366],{"class":471},[465,1530,1333],{"class":698},[465,1532,1371],{"class":475},[465,1534,1374],{"class":475},[465,1536,692],{"class":475},[465,1538,1540,1542,1544,1546],{"class":467,"line":1539},28,[465,1541,1403],{"class":471},[465,1543,1406],{"class":479},[465,1545,1409],{"class":475},[465,1547,1548],{"class":698}," err\n",[465,1550,1552],{"class":467,"line":1551},29,[465,1553,1250],{"class":475},[465,1555,1557],{"class":467,"line":1556},30,[465,1558,1107],{"emptyLinePlaceholder":1106},[465,1560,1562,1565,1567,1569,1571,1573,1575,1578,1581],{"class":467,"line":1561},31,[465,1563,1564],{"class":698},"    refresh",[465,1566,1134],{"class":475},[465,1568,1333],{"class":698},[465,1570,1336],{"class":475},[465,1572,1127],{"class":698},[465,1574,704],{"class":475},[465,1576,1577],{"class":1116},"NewRefreshToken",[465,1579,1580],{"class":475},"()",[465,1582,1583],{"class":617}," \u002F\u002F 32 bájt crypto\u002Frand, hexben\n",[465,1585,1587,1589,1591,1593,1595],{"class":467,"line":1586},32,[465,1588,1366],{"class":471},[465,1590,1333],{"class":698},[465,1592,1371],{"class":475},[465,1594,1374],{"class":475},[465,1596,692],{"class":475},[465,1598,1600,1602,1604,1606],{"class":467,"line":1599},33,[465,1601,1403],{"class":471},[465,1603,1406],{"class":479},[465,1605,1409],{"class":475},[465,1607,1548],{"class":698},[465,1609,1611],{"class":467,"line":1610},34,[465,1612,1250],{"class":475},[465,1614,1616,1619,1621,1624,1626,1629,1632,1635,1637,1639,1641,1643,1645,1647],{"class":467,"line":1615},35,[465,1617,1618],{"class":698},"    expiresAt ",[465,1620,1336],{"class":475},[465,1622,1623],{"class":698}," time",[465,1625,704],{"class":475},[465,1627,1628],{"class":1116},"Now",[465,1630,1631],{"class":475},"().",[465,1633,1634],{"class":1116},"Add",[465,1636,1120],{"class":475},[465,1638,1441],{"class":698},[465,1640,704],{"class":475},[465,1642,1446],{"class":698},[465,1644,704],{"class":475},[465,1646,830],{"class":698},[465,1648,1360],{"class":475},[465,1650,1652,1654,1656,1658,1660,1662,1665,1667,1670,1672,1674,1676,1678,1680,1682,1684,1687,1689,1692,1695,1698,1701,1703,1705,1707],{"class":467,"line":1651},36,[465,1653,1366],{"class":471},[465,1655,1333],{"class":698},[465,1657,1336],{"class":475},[465,1659,1339],{"class":698},[465,1661,704],{"class":475},[465,1663,1664],{"class":698},"tokens",[465,1666,704],{"class":475},[465,1668,1669],{"class":1116},"Store",[465,1671,1120],{"class":475},[465,1673,1285],{"class":698},[465,1675,1134],{"class":475},[465,1677,1451],{"class":698},[465,1679,704],{"class":475},[465,1681,1456],{"class":698},[465,1683,1134],{"class":475},[465,1685,1686],{"class":1116}," sha256Hex",[465,1688,1120],{"class":475},[465,1690,1691],{"class":698},"refresh",[465,1693,1694],{"class":475},"),",[465,1696,1697],{"class":698}," expiresAt",[465,1699,1700],{"class":475},");",[465,1702,1333],{"class":698},[465,1704,1371],{"class":475},[465,1706,1374],{"class":475},[465,1708,692],{"class":475},[465,1710,1712,1714,1716,1718],{"class":467,"line":1711},37,[465,1713,1403],{"class":471},[465,1715,1406],{"class":479},[465,1717,1409],{"class":475},[465,1719,1548],{"class":698},[465,1721,1723],{"class":467,"line":1722},38,[465,1724,1250],{"class":475},[465,1726,1728],{"class":467,"line":1727},39,[465,1729,1107],{"emptyLinePlaceholder":1106},[465,1731,1733,1735,1737,1740,1743,1745,1748,1750,1753,1755,1758,1761],{"class":467,"line":1732},40,[465,1734,1165],{"class":471},[465,1736,1406],{"class":479},[465,1738,1739],{"class":475},"{",[465,1741,1742],{"class":698},"AccessToken",[465,1744,1182],{"class":475},[465,1746,1747],{"class":698}," access",[465,1749,1134],{"class":475},[465,1751,1752],{"class":698}," RefreshToken",[465,1754,1182],{"class":475},[465,1756,1757],{"class":698}," refresh",[465,1759,1760],{"class":475},"},",[465,1762,1763],{"class":475}," nil\n",[465,1765,1767],{"class":467,"line":1766},41,[465,1768,761],{"class":475},[868,1770,1771,1772,1774,1775,1778,1779,1781,1782,1785],{},"A refresh token kezelése a te sémád: a ",[452,1773,1577],{}," csak egy kriptográfiailag véletlen stringet ad, a kit nem tárolja. Szerveroldalon ",[491,1776,1777],{},"csak a hash-ét"," tárold (mint a jelszavaknál), és a ",[452,1780,830],{},"-t használd lejáratnak (a fenti ",[452,1783,1784],{},"sha256Hex"," a te helper-ed).",[594,1787,1789],{"id":1788},"identify-tokenből-identity","Identify: tokenből identity",[448,1791,486,1792,1794,1795,1798,1799,530,1802,1804,1805,1808],{},[452,1793,519],{}," azt a munkát végzi, amit egy middleware általában elrejt: kiveszi a bearer tokent egy ",[452,1796,1797],{},"Authorization"," fejléc-",[491,1800,1801],{},"értékből",[452,1803,1021],{},"-rel validálja (aláírás, lejárat, issuer\u002Faudience), és a claimekből ",[452,1806,1807],{},"*rbac.Identity","-t épít. Fejléc-értéket vár, nem requestet vagy response writert, és sikertelenség esetén sima errort ad vissza:",[456,1810,1812],{"className":458,"code":1811,"language":460,"meta":461,"style":461},"id, err := auth.Identify(issuer, auth.DefaultIdentity, authorizationHeader)\nswitch {\ncase err == nil:\n    \u002F\u002F id kitöltve; mehet tovább\ncase errors.Is(err, auth.ErrMissingToken):\n    \u002F\u002F nincs bearer token\ncase errors.Is(err, auth.ErrInvalidToken):\n    \u002F\u002F rossz aláírás, lejárt, rossz issuer\u002Faudience\ncase errors.Is(err, auth.ErrInvalidClaims):\n    \u002F\u002F a token érvényes, de a toIdentity elutasította a claimeket\n}\n",[452,1813,1814,1851,1858,1871,1876,1905,1910,1935,1940,1965,1970],{"__ignoreMap":461},[465,1815,1816,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1844,1846,1849],{"class":467,"line":468},[465,1817,1818],{"class":698},"id",[465,1820,1134],{"class":475},[465,1822,1333],{"class":698},[465,1824,1336],{"class":475},[465,1826,1127],{"class":698},[465,1828,704],{"class":475},[465,1830,519],{"class":1116},[465,1832,1120],{"class":475},[465,1834,1511],{"class":698},[465,1836,1134],{"class":475},[465,1838,1127],{"class":698},[465,1840,704],{"class":475},[465,1842,1843],{"class":698},"DefaultIdentity",[465,1845,1134],{"class":475},[465,1847,1848],{"class":698}," authorizationHeader",[465,1850,1360],{"class":475},[465,1852,1853,1856],{"class":467,"line":621},[465,1854,1855],{"class":471},"switch",[465,1857,692],{"class":475},[465,1859,1860,1863,1865,1868],{"class":467,"line":695},[465,1861,1862],{"class":471},"case",[465,1864,1333],{"class":698},[465,1866,1867],{"class":475},"==",[465,1869,1870],{"class":475}," nil:\n",[465,1872,1873],{"class":467,"line":710},[465,1874,1875],{"class":617},"    \u002F\u002F id kitöltve; mehet tovább\n",[465,1877,1878,1880,1883,1885,1888,1890,1893,1895,1897,1899,1902],{"class":467,"line":732},[465,1879,1862],{"class":471},[465,1881,1882],{"class":698}," errors",[465,1884,704],{"class":475},[465,1886,1887],{"class":1116},"Is",[465,1889,1120],{"class":475},[465,1891,1892],{"class":698},"err",[465,1894,1134],{"class":475},[465,1896,1127],{"class":698},[465,1898,704],{"class":475},[465,1900,1901],{"class":698},"ErrMissingToken",[465,1903,1904],{"class":475},"):\n",[465,1906,1907],{"class":467,"line":752},[465,1908,1909],{"class":617},"    \u002F\u002F nincs bearer token\n",[465,1911,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1933],{"class":467,"line":758},[465,1913,1862],{"class":471},[465,1915,1882],{"class":698},[465,1917,704],{"class":475},[465,1919,1887],{"class":1116},[465,1921,1120],{"class":475},[465,1923,1892],{"class":698},[465,1925,1134],{"class":475},[465,1927,1127],{"class":698},[465,1929,704],{"class":475},[465,1931,1932],{"class":698},"ErrInvalidToken",[465,1934,1904],{"class":475},[465,1936,1937],{"class":467,"line":1103},[465,1938,1939],{"class":617},"    \u002F\u002F rossz aláírás, lejárt, rossz issuer\u002Faudience\n",[465,1941,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1963],{"class":467,"line":1110},[465,1943,1862],{"class":471},[465,1945,1882],{"class":698},[465,1947,704],{"class":475},[465,1949,1887],{"class":1116},[465,1951,1120],{"class":475},[465,1953,1892],{"class":698},[465,1955,1134],{"class":475},[465,1957,1127],{"class":698},[465,1959,704],{"class":475},[465,1961,1962],{"class":698},"ErrInvalidClaims",[465,1964,1904],{"class":475},[465,1966,1967],{"class":467,"line":1162},[465,1968,1969],{"class":617},"    \u002F\u002F a token érvényes, de a toIdentity elutasította a claimeket\n",[465,1971,1972],{"class":467,"line":1176},[465,1973,761],{"class":475},[448,1975,486,1976,1979,1980,880,1982,1985,1986,1988,1989,1993],{},[452,1977,1978],{},"auth.DefaultIdentity"," a ",[452,1981,908],{},[452,1983,1984],{},"toIdentity"," függvénye; egy saját claims-típushoz saját ",[452,1987,1984],{},"-t írsz (lásd ",[496,1990,1992],{"href":1991},"#saj%C3%A1t-claims","Saját claims"," alább).",[1995,1996,1998],"h3",{"id":1997},"a-kittel-serverauthmiddleware","A kittel: server.AuthMiddleware",[448,2000,2001,2002,2004,2005,2007,2008,2011,2012,2015,2016,2019,2020,2022],{},"A gpsystem kit becsomagolja az ",[452,2003,519],{},"-t egy ",[452,2006,558],{}," middleware-be, és a hibáit RFC 9457 ",[496,2009,2010],{"href":396},"problem+json"," válaszként rendereli. A shop ",[452,2013,2014],{},"admin"," surface-e így kerül JWT + szerepvédelem mögé: a middleware-t a generált ",[452,2017,2018],{},"Register\u003CSurface>"," függvénybe fűzöd be, a többi surface érintése nélkül (lásd ",[496,2021,330],{"href":331},"):",[456,2024,2027],{"className":458,"code":2025,"filename":2026,"language":460,"meta":461,"style":461},"func RegisterAdmin(router chi.Router, deps Dependencies) {\n    adminSvc := adminservice.New()\n    adminHandler := adminhttp.New(adminSvc)\n    adminPolicies := adminpolicy.New()\n    router.Route(\"\u002Fadmin\u002Fshop\", func(r chi.Router) {\n        r.Use(server.AuthMiddleware(deps.Auth), server.RequireRole(\"admin\"))\n        shopadmingen.HandlerWithOptions(\u002F* ... a generált strict-handler bekötés változatlan ... *\u002F)\n    })\n}\n","internal\u002Fmodules\u002Fshop\u002Fregister.go",[452,2028,2029,2061,2079,2100,2116,2154,2204,2221,2226],{"__ignoreMap":461},[465,2030,2031,2033,2036,2038,2041,2044,2046,2049,2051,2054,2057,2059],{"class":467,"line":468},[465,2032,1113],{"class":475},[465,2034,2035],{"class":1116}," RegisterAdmin",[465,2037,1120],{"class":475},[465,2039,2040],{"class":1123},"router",[465,2042,2043],{"class":479}," chi",[465,2045,704],{"class":475},[465,2047,2048],{"class":479},"Router",[465,2050,1134],{"class":475},[465,2052,2053],{"class":1123}," deps",[465,2055,2056],{"class":479}," Dependencies",[465,2058,1151],{"class":475},[465,2060,692],{"class":475},[465,2062,2063,2066,2068,2071,2073,2076],{"class":467,"line":621},[465,2064,2065],{"class":698},"    adminSvc ",[465,2067,1336],{"class":475},[465,2069,2070],{"class":698}," adminservice",[465,2072,704],{"class":475},[465,2074,2075],{"class":1116},"New",[465,2077,2078],{"class":475},"()\n",[465,2080,2081,2084,2086,2089,2091,2093,2095,2098],{"class":467,"line":695},[465,2082,2083],{"class":698},"    adminHandler ",[465,2085,1336],{"class":475},[465,2087,2088],{"class":698}," adminhttp",[465,2090,704],{"class":475},[465,2092,2075],{"class":1116},[465,2094,1120],{"class":475},[465,2096,2097],{"class":698},"adminSvc",[465,2099,1360],{"class":475},[465,2101,2102,2105,2107,2110,2112,2114],{"class":467,"line":710},[465,2103,2104],{"class":698},"    adminPolicies ",[465,2106,1336],{"class":475},[465,2108,2109],{"class":698}," adminpolicy",[465,2111,704],{"class":475},[465,2113,2075],{"class":1116},[465,2115,2078],{"class":475},[465,2117,2118,2121,2123,2126,2128,2131,2134,2136,2138,2141,2144,2146,2148,2150,2152],{"class":467,"line":732},[465,2119,2120],{"class":698},"    router",[465,2122,704],{"class":475},[465,2124,2125],{"class":1116},"Route",[465,2127,1120],{"class":475},[465,2129,2130],{"class":475},"\"",[465,2132,2133],{"class":610},"\u002Fadmin\u002Fshop",[465,2135,2130],{"class":475},[465,2137,1134],{"class":475},[465,2139,2140],{"class":475}," func(",[465,2142,2143],{"class":1123},"r",[465,2145,2043],{"class":479},[465,2147,704],{"class":475},[465,2149,2048],{"class":479},[465,2151,1151],{"class":475},[465,2153,692],{"class":475},[465,2155,2156,2159,2161,2164,2166,2168,2170,2173,2175,2178,2180,2183,2185,2188,2190,2193,2195,2197,2199,2201],{"class":467,"line":752},[465,2157,2158],{"class":698},"        r",[465,2160,704],{"class":475},[465,2162,2163],{"class":1116},"Use",[465,2165,1120],{"class":475},[465,2167,569],{"class":698},[465,2169,704],{"class":475},[465,2171,2172],{"class":1116},"AuthMiddleware",[465,2174,1120],{"class":475},[465,2176,2177],{"class":698},"deps",[465,2179,704],{"class":475},[465,2181,2182],{"class":698},"Auth",[465,2184,1694],{"class":475},[465,2186,2187],{"class":698}," server",[465,2189,704],{"class":475},[465,2191,2192],{"class":1116},"RequireRole",[465,2194,1120],{"class":475},[465,2196,2130],{"class":475},[465,2198,2014],{"class":610},[465,2200,2130],{"class":475},[465,2202,2203],{"class":475},"))\n",[465,2205,2206,2209,2211,2214,2216,2219],{"class":467,"line":758},[465,2207,2208],{"class":698},"        shopadmingen",[465,2210,704],{"class":475},[465,2212,2213],{"class":1116},"HandlerWithOptions",[465,2215,1120],{"class":475},[465,2217,2218],{"class":617},"\u002F* ... a generált strict-handler bekötés változatlan ... *\u002F",[465,2220,1360],{"class":475},[465,2222,2223],{"class":467,"line":1103},[465,2224,2225],{"class":475},"    })\n",[465,2227,2228],{"class":467,"line":1110},[465,2229,761],{"class":475},[448,2231,486,2232,2234,2235,2238,2239,2242,2243,2246,2247,2250,2251,2254,2255,2258,2259,886,2262,886,2265,2268,2269,2271,2272,2275,2276,2279],{},[452,2233,659],{},"-ot a modul ",[452,2236,2237],{},"Dependencies"," structján keresztül adod be (a ",[452,2240,2241],{},"\u002F\u002F gpsystem:dependencies"," anchornál egy ",[452,2244,2245],{},"Auth auth.Config"," mező, a ",[452,2248,2249],{},"main.go","-ban ",[452,2252,2253],{},"Auth: cfg.JWT","). Így a ",[452,2256,2257],{},"register.go"," nem függ a platform-configtól. A ",[452,2260,2261],{},"server.AuthMiddleware",[452,2263,2264],{},"server.RequireRole",[452,2266,2267],{},"server.RequirePermission"," a kitben él, nem az ",[452,2270,82],{},"-ban: a teljes ",[452,2273,2274],{},"server.WriteError"," leképzésért lásd ",[496,2277,2278],{"href":259},"a kit servere"," oldalt.",[1995,2281,2283],{"id":2282},"vegyes-surface-ök-publikus-és-védett-műveletek-egymás-mellett","Vegyes surface-ök: publikus és védett műveletek egymás mellett",[448,2285,998,2286,880,2288,2291,2292,2294,2295,2298,2299,2302],{},[452,2287,2261],{},[491,2289,2290],{},"minden"," token nélküli kérést 401-el; egy csupa-védett surface-re (mint az ",[452,2293,2014],{},") pont ez kell. A shop ",[452,2296,2297],{},"api"," surface-e viszont vegyes: a terméklistázás anonim, a rendelés-műveletek viszont identityt igényelnek. Ilyenkor a token-parseolást tedd feltételessé, a taggelt műveletek 401-ét pedig bízd a ",[496,2300,2301],{"href":99},"policy-enforcerre",", ami identity nélkül úgyis elutasít:",[456,2304,2306],{"className":458,"code":2305,"language":460,"meta":461,"style":461},"authOptional := server.AuthMiddleware(deps.Auth)\nr.Use(func(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        if r.Header.Get(\"Authorization\") == \"\" {\n            next.ServeHTTP(w, r) \u002F\u002F anonim böngészés mehet; a taggelt műveleteket az enforcer 401-eli\n            return\n        }\n        authOptional(next).ServeHTTP(w, r) \u002F\u002F ha van token, legyen érvényes\n    })\n})\n",[452,2307,2308,2331,2363,2405,2440,2463,2468,2473,2500,2504],{"__ignoreMap":461},[465,2309,2310,2313,2315,2317,2319,2321,2323,2325,2327,2329],{"class":467,"line":468},[465,2311,2312],{"class":698},"authOptional ",[465,2314,1336],{"class":475},[465,2316,2187],{"class":698},[465,2318,704],{"class":475},[465,2320,2172],{"class":1116},[465,2322,1120],{"class":475},[465,2324,2177],{"class":698},[465,2326,704],{"class":475},[465,2328,2182],{"class":698},[465,2330,1360],{"class":475},[465,2332,2333,2335,2337,2339,2342,2345,2348,2350,2353,2355,2357,2359,2361],{"class":467,"line":621},[465,2334,2143],{"class":698},[465,2336,704],{"class":475},[465,2338,2163],{"class":1116},[465,2340,2341],{"class":475},"(func(",[465,2343,2344],{"class":1123},"next",[465,2346,2347],{"class":479}," http",[465,2349,704],{"class":475},[465,2351,2352],{"class":479},"Handler",[465,2354,1151],{"class":475},[465,2356,2347],{"class":479},[465,2358,704],{"class":475},[465,2360,2352],{"class":479},[465,2362,692],{"class":475},[465,2364,2365,2367,2369,2371,2374,2376,2379,2381,2383,2386,2388,2391,2393,2396,2398,2401,2403],{"class":467,"line":695},[465,2366,1165],{"class":471},[465,2368,2347],{"class":698},[465,2370,704],{"class":475},[465,2372,2373],{"class":1116},"HandlerFunc",[465,2375,2341],{"class":475},[465,2377,2378],{"class":1123},"w",[465,2380,2347],{"class":479},[465,2382,704],{"class":475},[465,2384,2385],{"class":479},"ResponseWriter",[465,2387,1134],{"class":475},[465,2389,2390],{"class":1123}," r",[465,2392,1154],{"class":475},[465,2394,2395],{"class":479},"http",[465,2397,704],{"class":475},[465,2399,2400],{"class":479},"Request",[465,2402,1151],{"class":475},[465,2404,692],{"class":475},[465,2406,2407,2410,2412,2414,2417,2419,2422,2424,2426,2428,2430,2432,2435,2438],{"class":467,"line":710},[465,2408,2409],{"class":471},"        if",[465,2411,2390],{"class":698},[465,2413,704],{"class":475},[465,2415,2416],{"class":698},"Header",[465,2418,704],{"class":475},[465,2420,2421],{"class":1116},"Get",[465,2423,1120],{"class":475},[465,2425,2130],{"class":475},[465,2427,1797],{"class":610},[465,2429,2130],{"class":475},[465,2431,1151],{"class":475},[465,2433,2434],{"class":475}," ==",[465,2436,2437],{"class":475}," \"\"",[465,2439,692],{"class":475},[465,2441,2442,2445,2447,2450,2452,2454,2456,2458,2460],{"class":467,"line":732},[465,2443,2444],{"class":698},"            next",[465,2446,704],{"class":475},[465,2448,2449],{"class":1116},"ServeHTTP",[465,2451,1120],{"class":475},[465,2453,2378],{"class":698},[465,2455,1134],{"class":475},[465,2457,2390],{"class":698},[465,2459,1151],{"class":475},[465,2461,2462],{"class":617}," \u002F\u002F anonim böngészés mehet; a taggelt műveleteket az enforcer 401-eli\n",[465,2464,2465],{"class":467,"line":752},[465,2466,2467],{"class":471},"            return\n",[465,2469,2470],{"class":467,"line":758},[465,2471,2472],{"class":475},"        }\n",[465,2474,2475,2478,2480,2482,2485,2487,2489,2491,2493,2495,2497],{"class":467,"line":1103},[465,2476,2477],{"class":1116},"        authOptional",[465,2479,1120],{"class":475},[465,2481,2344],{"class":698},[465,2483,2484],{"class":475},").",[465,2486,2449],{"class":1116},[465,2488,1120],{"class":475},[465,2490,2378],{"class":698},[465,2492,1134],{"class":475},[465,2494,2390],{"class":698},[465,2496,1151],{"class":475},[465,2498,2499],{"class":617}," \u002F\u002F ha van token, legyen érvényes\n",[465,2501,2502],{"class":467,"line":1110},[465,2503,2225],{"class":475},[465,2505,2506],{"class":467,"line":1162},[465,2507,2508],{"class":475},"})\n",[594,2510,1992],{"id":2511},"saját-claims",[448,2513,2514,2515,2517,2518,2520,2521,2523,2524,2527,2528,2530],{},"Ha a ",[452,2516,908],{}," kevés (például tenant-azonosítót hordozol a tokenben), definiáld a saját claims-típusodat, és írj saját ",[452,2519,1984],{}," függvényt az ",[452,2522,519],{},"-hoz (vagy a ",[452,2525,2526],{},"server.AuthMiddlewareFor","-hoz, ami ennek a kit-drótozott ",[452,2529,558],{}," párja):",[456,2532,2534],{"className":458,"code":2533,"language":460,"meta":461,"style":461},"type MyClaims struct {\n    TenantID string `json:\"tenant\"`\n    jwt.RegisteredClaims\n}\n\ntoIdentity := func(c MyClaims) (*rbac.Identity, error) {\n    return &rbac.Identity{\n        Subject: c.Subject,\n        Extra:   map[string]any{\"tenant\": c.TenantID},\n    }, nil\n}\n\nissuer := auth.NewTokenIssuer[MyClaims](cfg.JWT)\nmw := server.AuthMiddlewareFor(issuer, toIdentity) \u002F\u002F kit net\u002Fhttp middleware\nid, err := auth.Identify(issuer, toIdentity, authorizationHeader) \u002F\u002F vagy közvetlenül hívva\n",[452,2535,2536,2547,2561,2569,2573,2577,2611,2625,2642,2681,2688,2692,2696,2726,2754],{"__ignoreMap":461},[465,2537,2538,2540,2543,2545],{"class":467,"line":468},[465,2539,683],{"class":475},[465,2541,2542],{"class":479}," MyClaims",[465,2544,689],{"class":475},[465,2546,692],{"class":475},[465,2548,2549,2552,2554,2556,2559],{"class":467,"line":621},[465,2550,2551],{"class":698},"    TenantID ",[465,2553,940],{"class":939},[465,2555,744],{"class":475},[465,2557,2558],{"class":610},"json:\"tenant\"",[465,2560,729],{"class":475},[465,2562,2563,2565,2567],{"class":467,"line":695},[465,2564,986],{"class":479},[465,2566,704],{"class":475},[465,2568,991],{"class":479},[465,2570,2571],{"class":467,"line":710},[465,2572,761],{"class":475},[465,2574,2575],{"class":467,"line":732},[465,2576,1107],{"emptyLinePlaceholder":1106},[465,2578,2579,2582,2584,2586,2589,2591,2593,2596,2599,2601,2603,2605,2607,2609],{"class":467,"line":752},[465,2580,2581],{"class":698},"toIdentity ",[465,2583,1336],{"class":475},[465,2585,2140],{"class":475},[465,2587,2588],{"class":1123},"c",[465,2590,2542],{"class":479},[465,2592,1151],{"class":475},[465,2594,2595],{"class":475}," (*",[465,2597,2598],{"class":479},"rbac",[465,2600,704],{"class":475},[465,2602,537],{"class":479},[465,2604,1134],{"class":475},[465,2606,1318],{"class":939},[465,2608,1151],{"class":475},[465,2610,692],{"class":475},[465,2612,2613,2615,2617,2619,2621,2623],{"class":467,"line":758},[465,2614,1165],{"class":471},[465,2616,1168],{"class":475},[465,2618,2598],{"class":479},[465,2620,704],{"class":475},[465,2622,537],{"class":479},[465,2624,1173],{"class":475},[465,2626,2627,2630,2632,2635,2637,2640],{"class":467,"line":1103},[465,2628,2629],{"class":698},"        Subject",[465,2631,1182],{"class":475},[465,2633,2634],{"class":698}," c",[465,2636,704],{"class":475},[465,2638,2639],{"class":698},"Subject",[465,2641,1188],{"class":475},[465,2643,2644,2647,2649,2652,2654,2657,2660,2662,2664,2667,2669,2671,2673,2675,2678],{"class":467,"line":1110},[465,2645,2646],{"class":698},"        Extra",[465,2648,1182],{"class":475},[465,2650,2651],{"class":475},"   map[",[465,2653,940],{"class":939},[465,2655,2656],{"class":475},"]",[465,2658,2659],{"class":479},"any",[465,2661,1739],{"class":475},[465,2663,2130],{"class":475},[465,2665,2666],{"class":610},"tenant",[465,2668,2130],{"class":475},[465,2670,1182],{"class":475},[465,2672,2634],{"class":698},[465,2674,704],{"class":475},[465,2676,2677],{"class":698},"TenantID",[465,2679,2680],{"class":475},"},\n",[465,2682,2683,2686],{"class":467,"line":1162},[465,2684,2685],{"class":475},"    },",[465,2687,1763],{"class":475},[465,2689,2690],{"class":467,"line":1176},[465,2691,761],{"class":475},[465,2693,2694],{"class":467,"line":1191},[465,2695,1107],{"emptyLinePlaceholder":1106},[465,2697,2698,2701,2703,2705,2707,2709,2711,2714,2716,2719,2721,2724],{"class":467,"line":1222},[465,2699,2700],{"class":698},"issuer ",[465,2702,1336],{"class":475},[465,2704,1127],{"class":698},[465,2706,704],{"class":475},[465,2708,1203],{"class":1116},[465,2710,1071],{"class":475},[465,2712,2713],{"class":479},"MyClaims",[465,2715,1214],{"class":475},[465,2717,2718],{"class":698},"cfg",[465,2720,704],{"class":475},[465,2722,2723],{"class":698},"JWT",[465,2725,1360],{"class":475},[465,2727,2728,2731,2733,2735,2737,2740,2742,2744,2746,2749,2751],{"class":467,"line":1235},[465,2729,2730],{"class":698},"mw ",[465,2732,1336],{"class":475},[465,2734,2187],{"class":698},[465,2736,704],{"class":475},[465,2738,2739],{"class":1116},"AuthMiddlewareFor",[465,2741,1120],{"class":475},[465,2743,1511],{"class":698},[465,2745,1134],{"class":475},[465,2747,2748],{"class":698}," toIdentity",[465,2750,1151],{"class":475},[465,2752,2753],{"class":617}," \u002F\u002F kit net\u002Fhttp middleware\n",[465,2755,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784],{"class":467,"line":1247},[465,2757,1818],{"class":698},[465,2759,1134],{"class":475},[465,2761,1333],{"class":698},[465,2763,1336],{"class":475},[465,2765,1127],{"class":698},[465,2767,704],{"class":475},[465,2769,519],{"class":1116},[465,2771,1120],{"class":475},[465,2773,1511],{"class":698},[465,2775,1134],{"class":475},[465,2777,2748],{"class":698},[465,2779,1134],{"class":475},[465,2781,1848],{"class":698},[465,2783,1151],{"class":475},[465,2785,2786],{"class":617}," \u002F\u002F vagy közvetlenül hívva\n",[448,2788,998,2789,2791,2792,1006,2794,2796,2797,2799,2800,2803,2804,2806,2807,2809,2810,2812],{},[452,2790,2261],{}," pontosan a ",[452,2793,2526],{},[452,2795,908],{},"-szel és ",[452,2798,1978],{},"-vel előre bekötve, így mindkettő ugyanazt a ",[452,2801,2802],{},"func(http.Handler) http.Handler"," alakot és ",[452,2805,537],{},"-építési kontraktust osztja; az ",[452,2808,2739],{},"-hoz csak akkor nyúlj, ha a ",[452,2811,908],{}," nem elég.",[594,2814,2816],{"id":2815},"hs256-és-a-titok-kezelése","HS256 és a titok kezelése",[448,2818,2819,2820,2823,2824,2827,2828,2831,2832,2834],{},"Az aláírás ",[491,2821,2822],{},"HS256"," (megosztott titok). A parse rögzíti az algoritmust (",[452,2825,2826],{},"WithValidMethods","), megköveteli a lejáratot (",[452,2829,2830],{},"WithExpirationRequired","), és ha konfigurált, ellenőrzi az issuert és az audience-t, így az alg-confusion támadások és az aláíratlan tokenek elutasítódnak. A ",[452,2833,1021],{}," API claims-generikus, ezért aszimmetrikus algoritmusok később törés nélkül jöhetnek.",[448,2836,2837,2838,2841,2842,2845,2846,2279],{},"A titok legyen hosszú és véletlen (pl. ",[452,2839,2840],{},"openssl rand -hex 32","), és secret-kezelőből érkezzen: sose kerüljön a repóba. A ",[452,2843,2844],{},".env"," csak lokális fejlesztésre való; lásd a ",[496,2847,654],{"href":229},[594,2849,2851],{"id":2850},"önállóan-kit-nélkül","Önállóan, kit nélkül",[448,2853,2854,2855,2858,2859,637,2861,886,2863,2866,2867,2869,2870,2279],{},"A fentiekhez semmi nem kell a ",[452,2856,2857],{},"server.Run","-ból vagy bármelyik más kit-csomagból. Az ",[452,2860,519],{},[452,2862,2598],{},[452,2864,2865],{},"policy"," sentinel errorok minden, ami egy csupasz ",[452,2868,558],{}," service-hez (vagy egy nem-HTTP-shez) kell, saját hibarendereléssel: teljes, futtatható példákért lásd az ",[496,2871,562],{"href":104},[448,2873,2874,2875,2877,2878,2881,2882,2884,2885,2888,2889,2892],{},"A következő réteg: a tokenből lett ",[452,2876,537],{}," fölötti ",[496,2879,2880],{"href":94},"szerep- és permission-ellenőrzések",", és a kérésenkénti ",[496,2883,533],{"href":99},". 3rd-party (Discord\u002FFacebook\u002FApple\u002FGoogle) bejelentkezéshez az ",[452,2886,2887],{},"add auth"," generált moduljának saját ",[496,2890,2891],{"href":278},"social login rétege"," tartozik, ugyanezt a token-kibocsátást hívva.",[594,2894,2896],{"id":2895},"használt-patternek","Használt patternek",[448,2898,2899,1268,2902,1006,2905,2908,2909,704],{},[491,2900,2901],{},"Generikusok a claims-típus fölött",[452,2903,2904],{},"TokenIssuer[C jwt.Claims]",[452,2906,2907],{},"Identify[C]","): ",[496,2910,238],{"href":2911},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#generikusok-a-claims-t%C3%ADpus-f%C3%B6l%C3%B6tt",[2913,2914,2915],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":461,"searchDepth":621,"depth":621,"links":2917},[2918,2919,2920,2921,2925,2926,2927,2928],{"id":596,"depth":621,"text":25},{"id":654,"depth":621,"text":204},{"id":901,"depth":621,"text":902},{"id":1788,"depth":621,"text":1789,"children":2922},[2923,2924],{"id":1997,"depth":695,"text":1998},{"id":2282,"depth":695,"text":2283},{"id":2511,"depth":621,"text":1992},{"id":2815,"depth":621,"text":2816},{"id":2850,"depth":621,"text":2851},{"id":2895,"depth":621,"text":2896},"JWT-kibocsátás és egy transport-független Identify függvény: stateless auth, framework nélkül.","md",null,{},{"icon":91},{"title":88,"description":2929},"GeOVatu0qNh6ESypXWNxkqT-N9UvvQwQqU4ErIpVx6I",[2937,2939],{"title":77,"path":78,"stem":79,"description":2938,"icon":80,"children":-1},"Task scheduling kódban, cron-eventek és jobok, replika-biztosan, Valkey-lease leader-electionnel.",{"title":93,"path":94,"stem":95,"description":2940,"icon":96,"children":-1},"Szerep- és permission-ellenőrzések a contextben utazó Identity fölött: route-guardokkal és service-rétegbeli lekérdezéssel.",1785445881930]