[{"data":1,"prerenderedAt":2717},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-auth-standalone":442,"-hu-auth-standalone-surround":2712},[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":103,"body":444,"description":2705,"extension":2706,"links":2707,"meta":2708,"navigation":2709,"path":104,"seo":2710,"stem":105,"__hash__":2711},"docs_hu\u002Fhu\u002F12.auth\u002F4.standalone.md",{"type":445,"value":446,"toc":2697},"minimark",[447,472,511,519,543,548,905,909,923,1507,1524,1528,1538,1785,1792,1874,1878,1889,2446,2450,2468,2634,2643,2647,2693],[448,449,450,451,455,456,459,460,463,464,467,468,471],"p",{},"Az előző három oldalon minden működik a gpsystem kit nélkül, ",[452,453,454],"code",{},"server.WriteError"," nélkül, és bármelyik más ",[452,457,458],{},"gp-system\u002F*"," modul nélkül. Ez az oldal ennek az állításnak a konkrét változata: egy projekt, aminek a ",[452,461,462],{},"go.mod","-ja csak a ",[452,465,466],{},"github.com\u002Fgp-system\u002Fauth","-ot igényli, a saját ",[452,469,470],{},"net\u002Fhttp"," middleware-ét, saját szerep-ellenőrzését, saját policy-registryjét és saját hibarendelését kézzel drótozva.",[473,474,479],"pre",{"className":475,"code":476,"language":477,"meta":478,"style":478},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go mod init example.com\u002Fstandalone-demo\ngo get github.com\u002Fgp-system\u002Fauth\n","sh","",[452,480,481,500],{"__ignoreMap":478},[482,483,486,490,494,497],"span",{"class":484,"line":485},"line",1,[482,487,489],{"class":488},"sBMFI","go",[482,491,493],{"class":492},"sfazB"," mod",[482,495,496],{"class":492}," init",[482,498,499],{"class":492}," example.com\u002Fstandalone-demo\n",[482,501,503,505,508],{"class":484,"line":502},2,[482,504,489],{"class":488},[482,506,507],{"class":492}," get",[482,509,510],{"class":492}," github.com\u002Fgp-system\u002Fauth\n",[473,512,517],{"className":513,"code":515,"language":516},[514],"language-text","require github.com\u002Fgp-system\u002Fauth v0.1.0\n","text",[452,518,515],{"__ignoreMap":478},[448,520,521,522,524,525,524,527,529,530,532,533,463,535,542],{},"Nincs ",[452,523,358],{},", nincs ",[452,526,386],{},[452,528,405],{},", semmi más: az ",[452,531,82],{}," saját ",[452,534,462],{},[536,537,541],"a",{"href":538,"rel":539},"https:\u002F\u002Fgithub.com\u002Fgolang-jwt\u002Fjwt",[540],"nofollow","golang-jwt\u002Fjwt\u002Fv5","-t igényli, és ez az egyetlen dolog, ami a tiedben is landol.",[544,545,547],"h2",{"id":546},"token-kibocsátás-és-ellenőrzés","Token kibocsátás és ellenőrzés",[473,549,552],{"className":550,"code":551,"language":489,"meta":478,"style":478},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"time\"\n\n    \"github.com\u002Fgp-system\u002Fauth\"\n)\n\nvar issuer = auth.NewTokenIssuer[auth.DefaultClaims](auth.Config{\n    Secret:    \"dev-secret-change-me\", \u002F\u002F valós kódban: env-ből\u002Fsecret-kezelőből\n    AccessTTL: 15 * time.Minute,\n    Issuer:    \"standalone-demo\",\n})\n\nfunc issueToken(userID, username string, roles, permissions []string) (string, error) {\n    claims := auth.NewDefaultClaims(auth.Config{Issuer: \"standalone-demo\", AccessTTL: 15 * time.Minute},\n        userID, username, roles, permissions)\n    return issuer.Sign(claims)\n}\n",[452,553,554,563,569,579,591,596,605,611,616,662,686,712,729,735,740,799,858,878,899],{"__ignoreMap":478},[482,555,556,560],{"class":484,"line":485},[482,557,559],{"class":558},"sMK4o","package",[482,561,562],{"class":488}," main\n",[482,564,565],{"class":484,"line":502},[482,566,568],{"emptyLinePlaceholder":567},true,"\n",[482,570,572,576],{"class":484,"line":571},3,[482,573,575],{"class":574},"s7zQu","import",[482,577,578],{"class":558}," (\n",[482,580,582,585,588],{"class":484,"line":581},4,[482,583,584],{"class":558},"    \"",[482,586,587],{"class":488},"time",[482,589,590],{"class":558},"\"\n",[482,592,594],{"class":484,"line":593},5,[482,595,568],{"emptyLinePlaceholder":567},[482,597,599,601,603],{"class":484,"line":598},6,[482,600,584],{"class":558},[482,602,466],{"class":488},[482,604,590],{"class":558},[482,606,608],{"class":484,"line":607},7,[482,609,610],{"class":558},")\n",[482,612,614],{"class":484,"line":613},8,[482,615,568],{"emptyLinePlaceholder":567},[482,617,619,622,626,629,632,635,639,642,644,646,649,652,654,656,659],{"class":484,"line":618},9,[482,620,621],{"class":558},"var",[482,623,625],{"class":624},"sTEyZ"," issuer ",[482,627,628],{"class":558},"=",[482,630,631],{"class":624}," auth",[482,633,634],{"class":558},".",[482,636,638],{"class":637},"s2Zo4","NewTokenIssuer",[482,640,641],{"class":558},"[",[482,643,82],{"class":488},[482,645,634],{"class":558},[482,647,648],{"class":488},"DefaultClaims",[482,650,651],{"class":558},"](",[482,653,82],{"class":488},[482,655,634],{"class":558},[482,657,658],{"class":488},"Config",[482,660,661],{"class":558},"{\n",[482,663,665,668,671,673,676,679,682],{"class":484,"line":664},10,[482,666,667],{"class":624},"    Secret",[482,669,670],{"class":558},":",[482,672,584],{"class":558},[482,674,675],{"class":492},"dev-secret-change-me",[482,677,678],{"class":558},"\"",[482,680,681],{"class":558},",",[482,683,685],{"class":684},"sHwdD"," \u002F\u002F valós kódban: env-ből\u002Fsecret-kezelőből\n",[482,687,689,692,694,698,701,704,706,709],{"class":484,"line":688},11,[482,690,691],{"class":624},"    AccessTTL",[482,693,670],{"class":558},[482,695,697],{"class":696},"sbssI"," 15",[482,699,700],{"class":558}," *",[482,702,703],{"class":624}," time",[482,705,634],{"class":558},[482,707,708],{"class":624},"Minute",[482,710,711],{"class":558},",\n",[482,713,715,718,720,722,725,727],{"class":484,"line":714},12,[482,716,717],{"class":624},"    Issuer",[482,719,670],{"class":558},[482,721,584],{"class":558},[482,723,724],{"class":492},"standalone-demo",[482,726,678],{"class":558},[482,728,711],{"class":558},[482,730,732],{"class":484,"line":731},13,[482,733,734],{"class":558},"})\n",[482,736,738],{"class":484,"line":737},14,[482,739,568],{"emptyLinePlaceholder":567},[482,741,743,746,749,752,756,758,761,765,767,770,772,775,778,781,784,787,789,791,794,796],{"class":484,"line":742},15,[482,744,745],{"class":558},"func",[482,747,748],{"class":637}," issueToken",[482,750,751],{"class":558},"(",[482,753,755],{"class":754},"sHdIc","userID",[482,757,681],{"class":558},[482,759,760],{"class":754}," username",[482,762,764],{"class":763},"spNyl"," string",[482,766,681],{"class":558},[482,768,769],{"class":754}," roles",[482,771,681],{"class":558},[482,773,774],{"class":754}," permissions",[482,776,777],{"class":558}," []",[482,779,780],{"class":763},"string",[482,782,783],{"class":558},")",[482,785,786],{"class":558}," (",[482,788,780],{"class":763},[482,790,681],{"class":558},[482,792,793],{"class":763}," error",[482,795,783],{"class":558},[482,797,798],{"class":558}," {\n",[482,800,802,805,808,810,812,815,817,819,821,823,826,829,831,834,836,838,840,843,845,847,849,851,853,855],{"class":484,"line":801},16,[482,803,804],{"class":624},"    claims ",[482,806,807],{"class":558},":=",[482,809,631],{"class":624},[482,811,634],{"class":558},[482,813,814],{"class":637},"NewDefaultClaims",[482,816,751],{"class":558},[482,818,82],{"class":488},[482,820,634],{"class":558},[482,822,658],{"class":488},[482,824,825],{"class":558},"{",[482,827,828],{"class":624},"Issuer",[482,830,670],{"class":558},[482,832,833],{"class":558}," \"",[482,835,724],{"class":492},[482,837,678],{"class":558},[482,839,681],{"class":558},[482,841,842],{"class":624}," AccessTTL",[482,844,670],{"class":558},[482,846,697],{"class":696},[482,848,700],{"class":558},[482,850,703],{"class":624},[482,852,634],{"class":558},[482,854,708],{"class":624},[482,856,857],{"class":558},"},\n",[482,859,861,864,866,868,870,872,874,876],{"class":484,"line":860},17,[482,862,863],{"class":624},"        userID",[482,865,681],{"class":558},[482,867,760],{"class":624},[482,869,681],{"class":558},[482,871,769],{"class":624},[482,873,681],{"class":558},[482,875,774],{"class":624},[482,877,610],{"class":558},[482,879,881,884,887,889,892,894,897],{"class":484,"line":880},18,[482,882,883],{"class":574},"    return",[482,885,886],{"class":624}," issuer",[482,888,634],{"class":558},[482,890,891],{"class":637},"Sign",[482,893,751],{"class":558},[482,895,896],{"class":624},"claims",[482,898,610],{"class":558},[482,900,902],{"class":484,"line":901},19,[482,903,904],{"class":558},"}\n",[544,906,908],{"id":907},"kézzel-írt-nethttp-middleware","Kézzel írt net\u002Fhttp middleware",[448,910,911,912,915,916,919,920,922],{},"Az ",[452,913,914],{},"Identify"," végzi a parseolást és az identity-leképzést; te döntöd el, mi történjen sikertelenség esetén. Itt magunk írunk egy kis JSON body-t, ",[452,917,918],{},"errors.Is","-szel választva státuszkódot, ",[452,921,386],{}," nélkül:",[473,924,926],{"className":550,"code":925,"language":489,"meta":478,"style":478},"package main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"errors\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgp-system\u002Fauth\"\n    \"github.com\u002Fgp-system\u002Fauth\u002Frbac\"\n)\n\nfunc requireAuth(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        id, err := auth.Identify(issuer, auth.DefaultIdentity, r.Header.Get(\"Authorization\"))\n        if err != nil {\n            writeAuthError(w, err)\n            return\n        }\n        next.ServeHTTP(w, r.WithContext(rbac.WithIdentity(r.Context(), id)))\n    })\n}\n\nfunc writeAuthError(w http.ResponseWriter, err error) {\n    status := http.StatusInternalServerError\n    switch {\n    case errors.Is(err, auth.ErrMissingToken),\n        errors.Is(err, auth.ErrInvalidToken),\n        errors.Is(err, auth.ErrInvalidClaims):\n        status = http.StatusUnauthorized\n    }\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    w.WriteHeader(status)\n    _ = json.NewEncoder(w).Encode(map[string]string{\"error\": err.Error()})\n}\n",[452,927,928,934,938,944,953,962,970,974,982,991,995,999,1029,1072,1130,1145,1161,1166,1171,1223,1229,1234,1239,1267,1282,1290,1321,1346,1371,1386,1392,1428,1445,1502],{"__ignoreMap":478},[482,929,930,932],{"class":484,"line":485},[482,931,559],{"class":558},[482,933,562],{"class":488},[482,935,936],{"class":484,"line":502},[482,937,568],{"emptyLinePlaceholder":567},[482,939,940,942],{"class":484,"line":571},[482,941,575],{"class":574},[482,943,578],{"class":558},[482,945,946,948,951],{"class":484,"line":581},[482,947,584],{"class":558},[482,949,950],{"class":488},"encoding\u002Fjson",[482,952,590],{"class":558},[482,954,955,957,960],{"class":484,"line":593},[482,956,584],{"class":558},[482,958,959],{"class":488},"errors",[482,961,590],{"class":558},[482,963,964,966,968],{"class":484,"line":598},[482,965,584],{"class":558},[482,967,470],{"class":488},[482,969,590],{"class":558},[482,971,972],{"class":484,"line":607},[482,973,568],{"emptyLinePlaceholder":567},[482,975,976,978,980],{"class":484,"line":613},[482,977,584],{"class":558},[482,979,466],{"class":488},[482,981,590],{"class":558},[482,983,984,986,989],{"class":484,"line":618},[482,985,584],{"class":558},[482,987,988],{"class":488},"github.com\u002Fgp-system\u002Fauth\u002Frbac",[482,990,590],{"class":558},[482,992,993],{"class":484,"line":664},[482,994,610],{"class":558},[482,996,997],{"class":484,"line":688},[482,998,568],{"emptyLinePlaceholder":567},[482,1000,1001,1003,1006,1008,1011,1014,1016,1019,1021,1023,1025,1027],{"class":484,"line":714},[482,1002,745],{"class":558},[482,1004,1005],{"class":637}," requireAuth",[482,1007,751],{"class":558},[482,1009,1010],{"class":754},"next",[482,1012,1013],{"class":488}," http",[482,1015,634],{"class":558},[482,1017,1018],{"class":488},"Handler",[482,1020,783],{"class":558},[482,1022,1013],{"class":488},[482,1024,634],{"class":558},[482,1026,1018],{"class":488},[482,1028,798],{"class":558},[482,1030,1031,1033,1035,1037,1040,1043,1046,1048,1050,1053,1055,1058,1060,1063,1065,1068,1070],{"class":484,"line":731},[482,1032,883],{"class":574},[482,1034,1013],{"class":624},[482,1036,634],{"class":558},[482,1038,1039],{"class":637},"HandlerFunc",[482,1041,1042],{"class":558},"(func(",[482,1044,1045],{"class":754},"w",[482,1047,1013],{"class":488},[482,1049,634],{"class":558},[482,1051,1052],{"class":488},"ResponseWriter",[482,1054,681],{"class":558},[482,1056,1057],{"class":754}," r",[482,1059,700],{"class":558},[482,1061,1062],{"class":488},"http",[482,1064,634],{"class":558},[482,1066,1067],{"class":488},"Request",[482,1069,783],{"class":558},[482,1071,798],{"class":558},[482,1073,1074,1077,1079,1082,1084,1086,1088,1090,1092,1095,1097,1099,1101,1104,1106,1108,1110,1113,1115,1118,1120,1122,1125,1127],{"class":484,"line":737},[482,1075,1076],{"class":624},"        id",[482,1078,681],{"class":558},[482,1080,1081],{"class":624}," err ",[482,1083,807],{"class":558},[482,1085,631],{"class":624},[482,1087,634],{"class":558},[482,1089,914],{"class":637},[482,1091,751],{"class":558},[482,1093,1094],{"class":624},"issuer",[482,1096,681],{"class":558},[482,1098,631],{"class":624},[482,1100,634],{"class":558},[482,1102,1103],{"class":624},"DefaultIdentity",[482,1105,681],{"class":558},[482,1107,1057],{"class":624},[482,1109,634],{"class":558},[482,1111,1112],{"class":624},"Header",[482,1114,634],{"class":558},[482,1116,1117],{"class":637},"Get",[482,1119,751],{"class":558},[482,1121,678],{"class":558},[482,1123,1124],{"class":492},"Authorization",[482,1126,678],{"class":558},[482,1128,1129],{"class":558},"))\n",[482,1131,1132,1135,1137,1140,1143],{"class":484,"line":742},[482,1133,1134],{"class":574},"        if",[482,1136,1081],{"class":624},[482,1138,1139],{"class":558},"!=",[482,1141,1142],{"class":558}," nil",[482,1144,798],{"class":558},[482,1146,1147,1150,1152,1154,1156,1159],{"class":484,"line":801},[482,1148,1149],{"class":637},"            writeAuthError",[482,1151,751],{"class":558},[482,1153,1045],{"class":624},[482,1155,681],{"class":558},[482,1157,1158],{"class":624}," err",[482,1160,610],{"class":558},[482,1162,1163],{"class":484,"line":860},[482,1164,1165],{"class":574},"            return\n",[482,1167,1168],{"class":484,"line":880},[482,1169,1170],{"class":558},"        }\n",[482,1172,1173,1176,1178,1181,1183,1185,1187,1189,1191,1194,1196,1199,1201,1204,1206,1209,1211,1214,1217,1220],{"class":484,"line":901},[482,1174,1175],{"class":624},"        next",[482,1177,634],{"class":558},[482,1179,1180],{"class":637},"ServeHTTP",[482,1182,751],{"class":558},[482,1184,1045],{"class":624},[482,1186,681],{"class":558},[482,1188,1057],{"class":624},[482,1190,634],{"class":558},[482,1192,1193],{"class":637},"WithContext",[482,1195,751],{"class":558},[482,1197,1198],{"class":624},"rbac",[482,1200,634],{"class":558},[482,1202,1203],{"class":637},"WithIdentity",[482,1205,751],{"class":558},[482,1207,1208],{"class":624},"r",[482,1210,634],{"class":558},[482,1212,1213],{"class":637},"Context",[482,1215,1216],{"class":558},"(),",[482,1218,1219],{"class":624}," id",[482,1221,1222],{"class":558},")))\n",[482,1224,1226],{"class":484,"line":1225},20,[482,1227,1228],{"class":558},"    })\n",[482,1230,1232],{"class":484,"line":1231},21,[482,1233,904],{"class":558},[482,1235,1237],{"class":484,"line":1236},22,[482,1238,568],{"emptyLinePlaceholder":567},[482,1240,1242,1244,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265],{"class":484,"line":1241},23,[482,1243,745],{"class":558},[482,1245,1246],{"class":637}," writeAuthError",[482,1248,751],{"class":558},[482,1250,1045],{"class":754},[482,1252,1013],{"class":488},[482,1254,634],{"class":558},[482,1256,1052],{"class":488},[482,1258,681],{"class":558},[482,1260,1158],{"class":754},[482,1262,793],{"class":763},[482,1264,783],{"class":558},[482,1266,798],{"class":558},[482,1268,1270,1273,1275,1277,1279],{"class":484,"line":1269},24,[482,1271,1272],{"class":624},"    status ",[482,1274,807],{"class":558},[482,1276,1013],{"class":624},[482,1278,634],{"class":558},[482,1280,1281],{"class":624},"StatusInternalServerError\n",[482,1283,1285,1288],{"class":484,"line":1284},25,[482,1286,1287],{"class":574},"    switch",[482,1289,798],{"class":558},[482,1291,1293,1296,1299,1301,1304,1306,1309,1311,1313,1315,1318],{"class":484,"line":1292},26,[482,1294,1295],{"class":574},"    case",[482,1297,1298],{"class":624}," errors",[482,1300,634],{"class":558},[482,1302,1303],{"class":637},"Is",[482,1305,751],{"class":558},[482,1307,1308],{"class":624},"err",[482,1310,681],{"class":558},[482,1312,631],{"class":624},[482,1314,634],{"class":558},[482,1316,1317],{"class":624},"ErrMissingToken",[482,1319,1320],{"class":558},"),\n",[482,1322,1324,1327,1329,1331,1333,1335,1337,1339,1341,1344],{"class":484,"line":1323},27,[482,1325,1326],{"class":624},"        errors",[482,1328,634],{"class":558},[482,1330,1303],{"class":637},[482,1332,751],{"class":558},[482,1334,1308],{"class":624},[482,1336,681],{"class":558},[482,1338,631],{"class":624},[482,1340,634],{"class":558},[482,1342,1343],{"class":624},"ErrInvalidToken",[482,1345,1320],{"class":558},[482,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1368],{"class":484,"line":1348},28,[482,1350,1326],{"class":624},[482,1352,634],{"class":558},[482,1354,1303],{"class":637},[482,1356,751],{"class":558},[482,1358,1308],{"class":624},[482,1360,681],{"class":558},[482,1362,631],{"class":624},[482,1364,634],{"class":558},[482,1366,1367],{"class":624},"ErrInvalidClaims",[482,1369,1370],{"class":558},"):\n",[482,1372,1374,1377,1379,1381,1383],{"class":484,"line":1373},29,[482,1375,1376],{"class":624},"        status ",[482,1378,628],{"class":558},[482,1380,1013],{"class":624},[482,1382,634],{"class":558},[482,1384,1385],{"class":624},"StatusUnauthorized\n",[482,1387,1389],{"class":484,"line":1388},30,[482,1390,1391],{"class":558},"    }\n",[482,1393,1395,1398,1400,1402,1405,1408,1410,1412,1415,1417,1419,1421,1424,1426],{"class":484,"line":1394},31,[482,1396,1397],{"class":624},"    w",[482,1399,634],{"class":558},[482,1401,1112],{"class":637},[482,1403,1404],{"class":558},"().",[482,1406,1407],{"class":637},"Set",[482,1409,751],{"class":558},[482,1411,678],{"class":558},[482,1413,1414],{"class":492},"Content-Type",[482,1416,678],{"class":558},[482,1418,681],{"class":558},[482,1420,833],{"class":558},[482,1422,1423],{"class":492},"application\u002Fjson",[482,1425,678],{"class":558},[482,1427,610],{"class":558},[482,1429,1431,1433,1435,1438,1440,1443],{"class":484,"line":1430},32,[482,1432,1397],{"class":624},[482,1434,634],{"class":558},[482,1436,1437],{"class":637},"WriteHeader",[482,1439,751],{"class":558},[482,1441,1442],{"class":624},"status",[482,1444,610],{"class":558},[482,1446,1448,1451,1453,1456,1458,1461,1463,1465,1468,1471,1474,1476,1479,1481,1483,1485,1488,1490,1492,1494,1496,1499],{"class":484,"line":1447},33,[482,1449,1450],{"class":624},"    _ ",[482,1452,628],{"class":558},[482,1454,1455],{"class":624}," json",[482,1457,634],{"class":558},[482,1459,1460],{"class":637},"NewEncoder",[482,1462,751],{"class":558},[482,1464,1045],{"class":624},[482,1466,1467],{"class":558},").",[482,1469,1470],{"class":637},"Encode",[482,1472,1473],{"class":558},"(map[",[482,1475,780],{"class":763},[482,1477,1478],{"class":558},"]",[482,1480,780],{"class":763},[482,1482,825],{"class":558},[482,1484,678],{"class":558},[482,1486,1487],{"class":492},"error",[482,1489,678],{"class":558},[482,1491,670],{"class":558},[482,1493,1158],{"class":624},[482,1495,634],{"class":558},[482,1497,1498],{"class":637},"Error",[482,1500,1501],{"class":558},"()})\n",[482,1503,1505],{"class":484,"line":1504},34,[482,1506,904],{"class":558},[448,1508,1509,1510,1513,1514,1517,1518,1520,1521,1523],{},"Ez nem az egyetlen lehetséges alak: egy middleware ugyanígy rendere lhet ",[452,1511,1512],{},"text\u002Fplain","-t ",[452,1515,1516],{},"http.Error","-ral, vagy újrahasznosíthatja a kódbázisod már meglévő hibakezelési konvencióját. Az ",[452,1519,82],{},"-nak nincs erről véleménye; csak azt garantálja, hogy az ",[452,1522,918],{}," működik a három sentinel ellen.",[544,1525,1527],{"id":1526},"szerep-ellenőrzés-middleware-nélkül","Szerep-ellenőrzés middleware nélkül",[448,1529,911,1530,1533,1534,1537],{},[452,1531,1532],{},"rbac.CheckRole","\u002F",[452,1535,1536],{},"CheckPermission"," sima függvények; közvetlenül hívhatók egy handlerben, guard middleware nélkül is:",[473,1539,1541],{"className":550,"code":1540,"language":489,"meta":478,"style":478},"func adminOnly(next http.HandlerFunc) http.HandlerFunc {\n    return func(w http.ResponseWriter, r *http.Request) {\n        id := rbac.FromContext(r.Context())\n        if err := rbac.CheckRole(id, \"admin\"); err != nil {\n            status := http.StatusForbidden\n            if errors.Is(err, rbac.ErrUnauthenticated) {\n                status = http.StatusUnauthorized\n            }\n            http.Error(w, err.Error(), status)\n            return\n        }\n        next(w, r)\n    }\n}\n",[452,1542,1543,1570,1601,1627,1667,1681,1709,1722,1727,1755,1759,1763,1777,1781],{"__ignoreMap":478},[482,1544,1545,1547,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568],{"class":484,"line":485},[482,1546,745],{"class":558},[482,1548,1549],{"class":637}," adminOnly",[482,1551,751],{"class":558},[482,1553,1010],{"class":754},[482,1555,1013],{"class":488},[482,1557,634],{"class":558},[482,1559,1039],{"class":488},[482,1561,783],{"class":558},[482,1563,1013],{"class":488},[482,1565,634],{"class":558},[482,1567,1039],{"class":488},[482,1569,798],{"class":558},[482,1571,1572,1574,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599],{"class":484,"line":502},[482,1573,883],{"class":574},[482,1575,1576],{"class":558}," func(",[482,1578,1045],{"class":754},[482,1580,1013],{"class":488},[482,1582,634],{"class":558},[482,1584,1052],{"class":488},[482,1586,681],{"class":558},[482,1588,1057],{"class":754},[482,1590,700],{"class":558},[482,1592,1062],{"class":488},[482,1594,634],{"class":558},[482,1596,1067],{"class":488},[482,1598,783],{"class":558},[482,1600,798],{"class":558},[482,1602,1603,1606,1608,1611,1613,1616,1618,1620,1622,1624],{"class":484,"line":571},[482,1604,1605],{"class":624},"        id ",[482,1607,807],{"class":558},[482,1609,1610],{"class":624}," rbac",[482,1612,634],{"class":558},[482,1614,1615],{"class":637},"FromContext",[482,1617,751],{"class":558},[482,1619,1208],{"class":624},[482,1621,634],{"class":558},[482,1623,1213],{"class":637},[482,1625,1626],{"class":558},"())\n",[482,1628,1629,1631,1633,1635,1637,1639,1642,1644,1647,1649,1651,1654,1656,1659,1661,1663,1665],{"class":484,"line":581},[482,1630,1134],{"class":574},[482,1632,1081],{"class":624},[482,1634,807],{"class":558},[482,1636,1610],{"class":624},[482,1638,634],{"class":558},[482,1640,1641],{"class":637},"CheckRole",[482,1643,751],{"class":558},[482,1645,1646],{"class":624},"id",[482,1648,681],{"class":558},[482,1650,833],{"class":558},[482,1652,1653],{"class":492},"admin",[482,1655,678],{"class":558},[482,1657,1658],{"class":558},");",[482,1660,1081],{"class":624},[482,1662,1139],{"class":558},[482,1664,1142],{"class":558},[482,1666,798],{"class":558},[482,1668,1669,1672,1674,1676,1678],{"class":484,"line":593},[482,1670,1671],{"class":624},"            status ",[482,1673,807],{"class":558},[482,1675,1013],{"class":624},[482,1677,634],{"class":558},[482,1679,1680],{"class":624},"StatusForbidden\n",[482,1682,1683,1686,1688,1690,1692,1694,1696,1698,1700,1702,1705,1707],{"class":484,"line":598},[482,1684,1685],{"class":574},"            if",[482,1687,1298],{"class":624},[482,1689,634],{"class":558},[482,1691,1303],{"class":637},[482,1693,751],{"class":558},[482,1695,1308],{"class":624},[482,1697,681],{"class":558},[482,1699,1610],{"class":624},[482,1701,634],{"class":558},[482,1703,1704],{"class":624},"ErrUnauthenticated",[482,1706,783],{"class":558},[482,1708,798],{"class":558},[482,1710,1711,1714,1716,1718,1720],{"class":484,"line":607},[482,1712,1713],{"class":624},"                status ",[482,1715,628],{"class":558},[482,1717,1013],{"class":624},[482,1719,634],{"class":558},[482,1721,1385],{"class":624},[482,1723,1724],{"class":484,"line":613},[482,1725,1726],{"class":558},"            }\n",[482,1728,1729,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1753],{"class":484,"line":618},[482,1730,1731],{"class":624},"            http",[482,1733,634],{"class":558},[482,1735,1498],{"class":637},[482,1737,751],{"class":558},[482,1739,1045],{"class":624},[482,1741,681],{"class":558},[482,1743,1158],{"class":624},[482,1745,634],{"class":558},[482,1747,1498],{"class":637},[482,1749,1216],{"class":558},[482,1751,1752],{"class":624}," status",[482,1754,610],{"class":558},[482,1756,1757],{"class":484,"line":664},[482,1758,1165],{"class":574},[482,1760,1761],{"class":484,"line":688},[482,1762,1170],{"class":558},[482,1764,1765,1767,1769,1771,1773,1775],{"class":484,"line":714},[482,1766,1175],{"class":637},[482,1768,751],{"class":558},[482,1770,1045],{"class":624},[482,1772,681],{"class":558},[482,1774,1057],{"class":624},[482,1776,610],{"class":558},[482,1778,1779],{"class":484,"line":731},[482,1780,1391],{"class":558},[482,1782,1783],{"class":484,"line":737},[482,1784,904],{"class":558},[448,1786,1787,1788,1791],{},"Fűzd be a ",[452,1789,1790],{},"requireAuth"," után:",[473,1793,1795],{"className":550,"code":1794,"language":489,"meta":478,"style":478},"mux := http.NewServeMux()\nmux.Handle(\"\u002Fadmin\u002Freports\", requireAuth(adminOnly(handleReports)))\nhttp.ListenAndServe(\":8080\", mux)\n",[452,1796,1797,1814,1849],{"__ignoreMap":478},[482,1798,1799,1802,1804,1806,1808,1811],{"class":484,"line":485},[482,1800,1801],{"class":624},"mux ",[482,1803,807],{"class":558},[482,1805,1013],{"class":624},[482,1807,634],{"class":558},[482,1809,1810],{"class":637},"NewServeMux",[482,1812,1813],{"class":558},"()\n",[482,1815,1816,1819,1821,1824,1826,1828,1831,1833,1835,1837,1839,1842,1844,1847],{"class":484,"line":502},[482,1817,1818],{"class":624},"mux",[482,1820,634],{"class":558},[482,1822,1823],{"class":637},"Handle",[482,1825,751],{"class":558},[482,1827,678],{"class":558},[482,1829,1830],{"class":492},"\u002Fadmin\u002Freports",[482,1832,678],{"class":558},[482,1834,681],{"class":558},[482,1836,1005],{"class":637},[482,1838,751],{"class":558},[482,1840,1841],{"class":637},"adminOnly",[482,1843,751],{"class":558},[482,1845,1846],{"class":624},"handleReports",[482,1848,1222],{"class":558},[482,1850,1851,1853,1855,1858,1860,1862,1865,1867,1869,1872],{"class":484,"line":571},[482,1852,1062],{"class":624},[482,1854,634],{"class":558},[482,1856,1857],{"class":637},"ListenAndServe",[482,1859,751],{"class":558},[482,1861,678],{"class":558},[482,1863,1864],{"class":492},":8080",[482,1866,678],{"class":558},[482,1868,681],{"class":558},[482,1870,1871],{"class":624}," mux",[482,1873,610],{"class":558},[544,1875,1877],{"id":1876},"policy-registry-kézzel-bekötve","Policy-registry, kézzel bekötve",[448,1879,1880,1881,1884,1885,1888],{},"A ",[452,1882,1883],{},"policy.Enforcer"," az oapi-codegen strict-server alakját célozza, de semmi nem akadályozza, hogy egy kézzel épített végponthoz közvetlenül egy ",[452,1886,1887],{},"Registry","-t hívj:",[473,1890,1892],{"className":550,"code":1891,"language":489,"meta":478,"style":478},"package main\n\nimport (\n    \"context\"\n    \"errors\"\n    \"net\u002Fhttp\"\n\n    \"github.com\u002Fgp-system\u002Fauth\u002Fpolicy\"\n    \"github.com\u002Fgp-system\u002Fauth\u002Frbac\"\n)\n\nvar orderPolicies = func() *policy.Registry {\n    reg := policy.NewRegistry()\n    reg.Register(\"orders.view\", func(_ context.Context, id *rbac.Identity, req any) error {\n        orderOwnerID := req.(string) \u002F\u002F valós kódban: a rendelés-rekordból kikeresve\n        if id.HasRole(\"admin\") || orderOwnerID == id.Subject {\n            return nil\n        }\n        return policy.Deny(\"you can only view your own orders\")\n    })\n    return reg\n}()\n\nfunc handleGetOrder(w http.ResponseWriter, r *http.Request) {\n    id := rbac.FromContext(r.Context())\n    fn, _ := orderPolicies.Get(\"orders.view\")\n    if err := fn(r.Context(), id, lookupOrderOwner(r)); err != nil {\n        var d *policy.Denial\n        if errors.As(err, &d) {\n            http.Error(w, d.Detail, http.StatusForbidden)\n            return\n        }\n        http.Error(w, \"internal error\", http.StatusInternalServerError)\n        return\n    }\n    \u002F\u002F ... a rendelés kiírása\n}\n",[452,1893,1894,1900,1904,1910,1919,1927,1935,1939,1948,1956,1960,1964,1987,2004,2064,2083,2122,2130,2134,2157,2161,2168,2173,2177,2210,2233,2262,2306,2324,2351,2384,2388,2392,2425,2430,2435,2441],{"__ignoreMap":478},[482,1895,1896,1898],{"class":484,"line":485},[482,1897,559],{"class":558},[482,1899,562],{"class":488},[482,1901,1902],{"class":484,"line":502},[482,1903,568],{"emptyLinePlaceholder":567},[482,1905,1906,1908],{"class":484,"line":571},[482,1907,575],{"class":574},[482,1909,578],{"class":558},[482,1911,1912,1914,1917],{"class":484,"line":581},[482,1913,584],{"class":558},[482,1915,1916],{"class":488},"context",[482,1918,590],{"class":558},[482,1920,1921,1923,1925],{"class":484,"line":593},[482,1922,584],{"class":558},[482,1924,959],{"class":488},[482,1926,590],{"class":558},[482,1928,1929,1931,1933],{"class":484,"line":598},[482,1930,584],{"class":558},[482,1932,470],{"class":488},[482,1934,590],{"class":558},[482,1936,1937],{"class":484,"line":607},[482,1938,568],{"emptyLinePlaceholder":567},[482,1940,1941,1943,1946],{"class":484,"line":613},[482,1942,584],{"class":558},[482,1944,1945],{"class":488},"github.com\u002Fgp-system\u002Fauth\u002Fpolicy",[482,1947,590],{"class":558},[482,1949,1950,1952,1954],{"class":484,"line":618},[482,1951,584],{"class":558},[482,1953,988],{"class":488},[482,1955,590],{"class":558},[482,1957,1958],{"class":484,"line":664},[482,1959,610],{"class":558},[482,1961,1962],{"class":484,"line":688},[482,1963,568],{"emptyLinePlaceholder":567},[482,1965,1966,1968,1971,1973,1976,1978,1981,1983,1985],{"class":484,"line":714},[482,1967,621],{"class":558},[482,1969,1970],{"class":624}," orderPolicies ",[482,1972,628],{"class":558},[482,1974,1975],{"class":558}," func()",[482,1977,700],{"class":558},[482,1979,1980],{"class":488},"policy",[482,1982,634],{"class":558},[482,1984,1887],{"class":488},[482,1986,798],{"class":558},[482,1988,1989,1992,1994,1997,1999,2002],{"class":484,"line":731},[482,1990,1991],{"class":624},"    reg ",[482,1993,807],{"class":558},[482,1995,1996],{"class":624}," policy",[482,1998,634],{"class":558},[482,2000,2001],{"class":637},"NewRegistry",[482,2003,1813],{"class":558},[482,2005,2006,2009,2011,2014,2016,2018,2021,2023,2025,2027,2030,2033,2035,2037,2039,2041,2043,2045,2047,2050,2052,2055,2058,2060,2062],{"class":484,"line":737},[482,2007,2008],{"class":624},"    reg",[482,2010,634],{"class":558},[482,2012,2013],{"class":637},"Register",[482,2015,751],{"class":558},[482,2017,678],{"class":558},[482,2019,2020],{"class":492},"orders.view",[482,2022,678],{"class":558},[482,2024,681],{"class":558},[482,2026,1576],{"class":558},[482,2028,2029],{"class":754},"_",[482,2031,2032],{"class":488}," context",[482,2034,634],{"class":558},[482,2036,1213],{"class":488},[482,2038,681],{"class":558},[482,2040,1219],{"class":754},[482,2042,700],{"class":558},[482,2044,1198],{"class":488},[482,2046,634],{"class":558},[482,2048,2049],{"class":488},"Identity",[482,2051,681],{"class":558},[482,2053,2054],{"class":754}," req",[482,2056,2057],{"class":488}," any",[482,2059,783],{"class":558},[482,2061,793],{"class":763},[482,2063,798],{"class":558},[482,2065,2066,2069,2071,2073,2076,2078,2080],{"class":484,"line":742},[482,2067,2068],{"class":624},"        orderOwnerID ",[482,2070,807],{"class":558},[482,2072,2054],{"class":624},[482,2074,2075],{"class":558},".(",[482,2077,780],{"class":763},[482,2079,783],{"class":558},[482,2081,2082],{"class":684}," \u002F\u002F valós kódban: a rendelés-rekordból kikeresve\n",[482,2084,2085,2087,2089,2091,2094,2096,2098,2100,2102,2104,2107,2110,2113,2115,2117,2120],{"class":484,"line":801},[482,2086,1134],{"class":574},[482,2088,1219],{"class":624},[482,2090,634],{"class":558},[482,2092,2093],{"class":637},"HasRole",[482,2095,751],{"class":558},[482,2097,678],{"class":558},[482,2099,1653],{"class":492},[482,2101,678],{"class":558},[482,2103,783],{"class":558},[482,2105,2106],{"class":558}," ||",[482,2108,2109],{"class":624}," orderOwnerID ",[482,2111,2112],{"class":558},"==",[482,2114,1219],{"class":624},[482,2116,634],{"class":558},[482,2118,2119],{"class":624},"Subject ",[482,2121,661],{"class":558},[482,2123,2124,2127],{"class":484,"line":860},[482,2125,2126],{"class":574},"            return",[482,2128,2129],{"class":558}," nil\n",[482,2131,2132],{"class":484,"line":880},[482,2133,1170],{"class":558},[482,2135,2136,2139,2141,2143,2146,2148,2150,2153,2155],{"class":484,"line":901},[482,2137,2138],{"class":574},"        return",[482,2140,1996],{"class":624},[482,2142,634],{"class":558},[482,2144,2145],{"class":637},"Deny",[482,2147,751],{"class":558},[482,2149,678],{"class":558},[482,2151,2152],{"class":492},"you can only view your own orders",[482,2154,678],{"class":558},[482,2156,610],{"class":558},[482,2158,2159],{"class":484,"line":1225},[482,2160,1228],{"class":558},[482,2162,2163,2165],{"class":484,"line":1231},[482,2164,883],{"class":574},[482,2166,2167],{"class":624}," reg\n",[482,2169,2170],{"class":484,"line":1236},[482,2171,2172],{"class":558},"}()\n",[482,2174,2175],{"class":484,"line":1241},[482,2176,568],{"emptyLinePlaceholder":567},[482,2178,2179,2181,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208],{"class":484,"line":1269},[482,2180,745],{"class":558},[482,2182,2183],{"class":637}," handleGetOrder",[482,2185,751],{"class":558},[482,2187,1045],{"class":754},[482,2189,1013],{"class":488},[482,2191,634],{"class":558},[482,2193,1052],{"class":488},[482,2195,681],{"class":558},[482,2197,1057],{"class":754},[482,2199,700],{"class":558},[482,2201,1062],{"class":488},[482,2203,634],{"class":558},[482,2205,1067],{"class":488},[482,2207,783],{"class":558},[482,2209,798],{"class":558},[482,2211,2212,2215,2217,2219,2221,2223,2225,2227,2229,2231],{"class":484,"line":1284},[482,2213,2214],{"class":624},"    id ",[482,2216,807],{"class":558},[482,2218,1610],{"class":624},[482,2220,634],{"class":558},[482,2222,1615],{"class":637},[482,2224,751],{"class":558},[482,2226,1208],{"class":624},[482,2228,634],{"class":558},[482,2230,1213],{"class":637},[482,2232,1626],{"class":558},[482,2234,2235,2238,2240,2243,2245,2248,2250,2252,2254,2256,2258,2260],{"class":484,"line":1292},[482,2236,2237],{"class":624},"    fn",[482,2239,681],{"class":558},[482,2241,2242],{"class":624}," _ ",[482,2244,807],{"class":558},[482,2246,2247],{"class":624}," orderPolicies",[482,2249,634],{"class":558},[482,2251,1117],{"class":637},[482,2253,751],{"class":558},[482,2255,678],{"class":558},[482,2257,2020],{"class":492},[482,2259,678],{"class":558},[482,2261,610],{"class":558},[482,2263,2264,2267,2269,2271,2274,2276,2278,2280,2282,2284,2286,2288,2291,2293,2295,2298,2300,2302,2304],{"class":484,"line":1323},[482,2265,2266],{"class":574},"    if",[482,2268,1081],{"class":624},[482,2270,807],{"class":558},[482,2272,2273],{"class":637}," fn",[482,2275,751],{"class":558},[482,2277,1208],{"class":624},[482,2279,634],{"class":558},[482,2281,1213],{"class":637},[482,2283,1216],{"class":558},[482,2285,1219],{"class":624},[482,2287,681],{"class":558},[482,2289,2290],{"class":637}," lookupOrderOwner",[482,2292,751],{"class":558},[482,2294,1208],{"class":624},[482,2296,2297],{"class":558},"));",[482,2299,1081],{"class":624},[482,2301,1139],{"class":558},[482,2303,1142],{"class":558},[482,2305,798],{"class":558},[482,2307,2308,2311,2314,2317,2319,2321],{"class":484,"line":1348},[482,2309,2310],{"class":558},"        var",[482,2312,2313],{"class":624}," d ",[482,2315,2316],{"class":558},"*",[482,2318,1980],{"class":488},[482,2320,634],{"class":558},[482,2322,2323],{"class":488},"Denial\n",[482,2325,2326,2328,2330,2332,2335,2337,2339,2341,2344,2347,2349],{"class":484,"line":1373},[482,2327,1134],{"class":574},[482,2329,1298],{"class":624},[482,2331,634],{"class":558},[482,2333,2334],{"class":637},"As",[482,2336,751],{"class":558},[482,2338,1308],{"class":624},[482,2340,681],{"class":558},[482,2342,2343],{"class":558}," &",[482,2345,2346],{"class":624},"d",[482,2348,783],{"class":558},[482,2350,798],{"class":558},[482,2352,2353,2355,2357,2359,2361,2363,2365,2368,2370,2373,2375,2377,2379,2382],{"class":484,"line":1388},[482,2354,1731],{"class":624},[482,2356,634],{"class":558},[482,2358,1498],{"class":637},[482,2360,751],{"class":558},[482,2362,1045],{"class":624},[482,2364,681],{"class":558},[482,2366,2367],{"class":624}," d",[482,2369,634],{"class":558},[482,2371,2372],{"class":624},"Detail",[482,2374,681],{"class":558},[482,2376,1013],{"class":624},[482,2378,634],{"class":558},[482,2380,2381],{"class":624},"StatusForbidden",[482,2383,610],{"class":558},[482,2385,2386],{"class":484,"line":1394},[482,2387,1165],{"class":574},[482,2389,2390],{"class":484,"line":1430},[482,2391,1170],{"class":558},[482,2393,2394,2397,2399,2401,2403,2405,2407,2409,2412,2414,2416,2418,2420,2423],{"class":484,"line":1447},[482,2395,2396],{"class":624},"        http",[482,2398,634],{"class":558},[482,2400,1498],{"class":637},[482,2402,751],{"class":558},[482,2404,1045],{"class":624},[482,2406,681],{"class":558},[482,2408,833],{"class":558},[482,2410,2411],{"class":492},"internal error",[482,2413,678],{"class":558},[482,2415,681],{"class":558},[482,2417,1013],{"class":624},[482,2419,634],{"class":558},[482,2421,2422],{"class":624},"StatusInternalServerError",[482,2424,610],{"class":558},[482,2426,2427],{"class":484,"line":1504},[482,2428,2429],{"class":574},"        return\n",[482,2431,2433],{"class":484,"line":2432},35,[482,2434,1391],{"class":558},[482,2436,2438],{"class":484,"line":2437},36,[482,2439,2440],{"class":684},"    \u002F\u002F ... a rendelés kiírása\n",[482,2442,2444],{"class":484,"line":2443},37,[482,2445,904],{"class":558},[544,2447,2449],{"id":2448},"semmi-http-egy-websocket-handshake","Semmi HTTP: egy WebSocket handshake",[448,2451,911,2452,2454,2455,2459,2460,2463,2464,2467],{},[452,2453,914],{}," fejléc-",[2456,2457,2458],"strong",{},"értéket"," vár, nem ",[452,2461,2462],{},"*http.Request","-et, így ugyanaz a hívás működik bárhol, ahol egy bearer token felbukkan: egy WebSocket handshake ",[452,2465,2466],{},"Sec-WebSocket-Protocol"," trükkjében, egy első üzenetben a socketen, gRPC metaadatban, bármiben.",[473,2469,2471],{"className":550,"code":2470,"language":489,"meta":478,"style":478},"func acceptConnection(authorizationValue string) (*rbac.Identity, error) {\n    id, err := auth.Identify(issuer, auth.DefaultIdentity, authorizationValue)\n    if err != nil {\n        return nil, err \u002F\u002F a hívó dönti el, hogyan zárja a kapcsolatot \u002F küldjön control frame-et\n    }\n    if err := rbac.CheckPermission(id, \"realtime.connect\"); err != nil {\n        return nil, err\n    }\n    return id, nil\n}\n",[452,2472,2473,2506,2542,2554,2566,2570,2607,2616,2620,2630],{"__ignoreMap":478},[482,2474,2475,2477,2480,2482,2485,2487,2489,2492,2494,2496,2498,2500,2502,2504],{"class":484,"line":485},[482,2476,745],{"class":558},[482,2478,2479],{"class":637}," acceptConnection",[482,2481,751],{"class":558},[482,2483,2484],{"class":754},"authorizationValue",[482,2486,764],{"class":763},[482,2488,783],{"class":558},[482,2490,2491],{"class":558}," (*",[482,2493,1198],{"class":488},[482,2495,634],{"class":558},[482,2497,2049],{"class":488},[482,2499,681],{"class":558},[482,2501,793],{"class":763},[482,2503,783],{"class":558},[482,2505,798],{"class":558},[482,2507,2508,2511,2513,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2540],{"class":484,"line":502},[482,2509,2510],{"class":624},"    id",[482,2512,681],{"class":558},[482,2514,1081],{"class":624},[482,2516,807],{"class":558},[482,2518,631],{"class":624},[482,2520,634],{"class":558},[482,2522,914],{"class":637},[482,2524,751],{"class":558},[482,2526,1094],{"class":624},[482,2528,681],{"class":558},[482,2530,631],{"class":624},[482,2532,634],{"class":558},[482,2534,1103],{"class":624},[482,2536,681],{"class":558},[482,2538,2539],{"class":624}," authorizationValue",[482,2541,610],{"class":558},[482,2543,2544,2546,2548,2550,2552],{"class":484,"line":571},[482,2545,2266],{"class":574},[482,2547,1081],{"class":624},[482,2549,1139],{"class":558},[482,2551,1142],{"class":558},[482,2553,798],{"class":558},[482,2555,2556,2558,2561,2563],{"class":484,"line":581},[482,2557,2138],{"class":574},[482,2559,2560],{"class":558}," nil,",[482,2562,1081],{"class":624},[482,2564,2565],{"class":684},"\u002F\u002F a hívó dönti el, hogyan zárja a kapcsolatot \u002F küldjön control frame-et\n",[482,2567,2568],{"class":484,"line":593},[482,2569,1391],{"class":558},[482,2571,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2595,2597,2599,2601,2603,2605],{"class":484,"line":598},[482,2573,2266],{"class":574},[482,2575,1081],{"class":624},[482,2577,807],{"class":558},[482,2579,1610],{"class":624},[482,2581,634],{"class":558},[482,2583,1536],{"class":637},[482,2585,751],{"class":558},[482,2587,1646],{"class":624},[482,2589,681],{"class":558},[482,2591,833],{"class":558},[482,2593,2594],{"class":492},"realtime.connect",[482,2596,678],{"class":558},[482,2598,1658],{"class":558},[482,2600,1081],{"class":624},[482,2602,1139],{"class":558},[482,2604,1142],{"class":558},[482,2606,798],{"class":558},[482,2608,2609,2611,2613],{"class":484,"line":607},[482,2610,2138],{"class":574},[482,2612,2560],{"class":558},[482,2614,2615],{"class":624}," err\n",[482,2617,2618],{"class":484,"line":613},[482,2619,1391],{"class":558},[482,2621,2622,2624,2626,2628],{"class":484,"line":618},[482,2623,883],{"class":574},[482,2625,1219],{"class":624},[482,2627,681],{"class":558},[482,2629,2129],{"class":558},[482,2631,2632],{"class":484,"line":664},[482,2633,904],{"class":558},[448,2635,2636,2637,1533,2639,2642],{},"Itt nincs mit response-ba írni, tehát nincs mit adaptálni: a fenti HTTP-példák ",[452,2638,918],{},[452,2640,2641],{},"errors.As"," szókincse változatlanul alkalmazható.",[544,2644,2646],{"id":2645},"amit-a-kit-hozzáad","Amit a kit hozzáad",[448,2648,2649,2650,2653,2654,2657,2658,1533,2661,2657,2664,2666,2667,1533,2669,2671,2672,2675,2676,2679,2680,2682,2683,2685,2686,2688,2689,2692],{},"A gpsystem kit ",[452,2651,2652],{},"server"," csomagja (",[452,2655,2656],{},"server.AuthMiddleware",", ",[452,2659,2660],{},"server.RequireRole",[452,2662,2663],{},"RequirePermission",[452,2665,454],{},") pontosan a fenti ",[452,2668,1790],{},[452,2670,1841],{},"\u002Fhibarenderelő kód, egyszer megírva és minden generált projekt között megosztva, RFC 9457 ",[536,2673,2674],{"href":396},"problem+json","-ként renderelve az itt bemutatott ad hoc JSON\u002Fplain-text helyett. Ehhez a bekötéshez lásd az ",[536,2677,88],{"href":2678},"\u002Fhu\u002Fauth\u002Foverview#a-kittel-serverauthmiddleware"," oldalt. Az ",[452,2681,82],{},", az ",[452,2684,1198],{}," és a ",[452,2687,1980],{}," semmiben nem változik, amikor hozzáadod a kitet: ugyanazokra a sentinelekre és ugyanarra a ",[452,2690,2691],{},"*policy.Denial","-ra illeszkedik a kit glue-ja is.",[2694,2695,2696],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":478,"searchDepth":502,"depth":502,"links":2698},[2699,2700,2701,2702,2703,2704],{"id":546,"depth":502,"text":547},{"id":907,"depth":502,"text":908},{"id":1526,"depth":502,"text":1527},{"id":1876,"depth":502,"text":1877},{"id":2448,"depth":502,"text":2449},{"id":2645,"depth":502,"text":2646},"Teljes, futtatható példa, ami az auth-on kívül semmilyen gp-system függőséget nem igényel: HTTP-vel és anélkül is.","md",null,{},{"icon":106},{"title":103,"description":2705},"A0nVXD_6331JkrainljLldOtzTE9bQ5F1C8Z3No59u0",[2713,2715],{"title":98,"path":99,"stem":100,"description":2714,"icon":101,"children":-1},"Kérésenkénti, user-szintű engedélyezés a szerepek fölött: a kontraktusban deklarálva, generált kódból kikényszerítve.",{"title":108,"path":109,"stem":110,"description":2716,"icon":111,"children":-1},"A markbates\u002Fgoth (Discord, Facebook, Google) bekötése egy sima net\u002Fhttp alkalmazásba, ami tokenekhez csak a gp-system\u002Fauth-ot igényli, gpsystem tooling nélkül.",1785445887070]