[{"data":1,"prerenderedAt":2355},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-auth-social-standalone":442,"-hu-auth-social-standalone-surround":2350},[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":108,"body":444,"description":2343,"extension":2344,"links":2345,"meta":2346,"navigation":2347,"path":109,"seo":2348,"stem":110,"__hash__":2349},"docs_hu\u002Fhu\u002F12.auth\u002F5.social-standalone.md",{"type":445,"value":446,"toc":2336},"minimark",[447,480,522,571,576,602,606,1014,1021,1025,1046,1286,1298,1302,1336,2283,2301,2305,2332],[448,449,450,451,455,456,460,461,464,465,471,472,479],"p",{},"A ",[452,453,454],"a",{"href":278},"social login"," oldal a ",[457,458,459],"code",{},"--social","-lal generált kódot mutatja be egy gpsystem projekten belül. Ez az oldal ugyanennek az ötletnek az önálló változata: egy sima ",[457,462,463],{},"net\u002Fhttp"," alkalmazás, gpsystem CLI és oapi-codegen strict-server réteg nélkül, ami a ",[452,466,470],{"href":467,"rel":468},"https:\u002F\u002Fgithub.com\u002Fmarkbates\u002Fgoth",[469],"nofollow","markbates\u002Fgoth","-tal beszél a Discorddal, Facebookkal és Google-lel, a ",[452,473,476],{"href":474,"rel":475},"https:\u002F\u002Fgithub.com\u002Fgp-system\u002Fauth",[469],[457,477,478],{},"gp-system\u002Fauth","-tal pedig ugyanazt a JWT\u002Frefresh párt állítja elő, mint amit egy email+jelszó bejelentkezés adna.",[481,482,450,483,486,487,491,492,494,495,497,498,501,502,505,506,508,509,511,512,515,516,518,519,521],"note",{},[457,484,485],{},"goth"," itt ",[488,489,490],"strong",{},"a te projekted"," függősége, nem az ",[457,493,82],{},"-é: az ",[457,496,82],{}," saját ",[457,499,500],{},"go.mod","-ja csak a ",[457,503,504],{},"golang-jwt\u002Fjwt\u002Fv5","-öt igényli (lásd ",[452,507,103],{"href":104},"). Ezen a példa semmit nem változtat; a ",[457,510,485],{}," és a ",[457,513,514],{},"gorilla\u002Fsessions"," a te ",[457,517,500],{},"-odban landol, nem az ",[457,520,82],{},"-éban.",[523,524,529],"pre",{"className":525,"code":526,"language":527,"meta":528,"style":528},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go mod init example.com\u002Fsocial-demo\ngo get github.com\u002Fgp-system\u002Fauth\ngo get github.com\u002Fmarkbates\u002Fgoth\n","sh","",[457,530,531,550,561],{"__ignoreMap":528},[532,533,536,540,544,547],"span",{"class":534,"line":535},"line",1,[532,537,539],{"class":538},"sBMFI","go",[532,541,543],{"class":542},"sfazB"," mod",[532,545,546],{"class":542}," init",[532,548,549],{"class":542}," example.com\u002Fsocial-demo\n",[532,551,553,555,558],{"class":534,"line":552},2,[532,554,539],{"class":538},[532,556,557],{"class":542}," get",[532,559,560],{"class":542}," github.com\u002Fgp-system\u002Fauth\n",[532,562,564,566,568],{"class":534,"line":563},3,[532,565,539],{"class":538},[532,567,557],{"class":542},[532,569,570],{"class":542}," github.com\u002Fmarkbates\u002Fgoth\n",[572,573,575],"h2",{"id":574},"miért-egyszerűbb-ez-mint-a-generált-változat","Miért egyszerűbb ez, mint a generált változat",[448,577,578,579,582,583,586,587,590,591,594,595,597,598,601],{},"A kit generált ",[457,580,581],{},"social"," csomagja saját ",[457,584,585],{},"state"," paramétert ír alá szerver oldali session helyett, mert az oapi-codegen strict-server handler szignatúrája (",[457,588,589],{},"func(ctx, req) (resp, error)",") sosem ad hozzáférést a nyers ",[457,592,593],{},"http.ResponseWriter","-hez, így nincs hol cookie-t beállítani a begin és a callback kérés között. Egy kézzel épített ",[457,596,463],{}," alkalmazásnak nincs ilyen megkötése: használhatja a goth saját ",[457,599,600],{},"gothic"," segédcsomagját változtatás nélkül, cookie-session-nel együtt, pontosan úgy, ahogy a goth saját dokumentációja is feltételezi.",[572,603,605],{"id":604},"providerek-regisztrálása","Providerek regisztrálása",[523,607,610],{"className":608,"code":609,"language":539,"meta":528,"style":528},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"os\"\n\n    \"github.com\u002Fmarkbates\u002Fgoth\"\n    \"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fdiscord\"\n    \"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Ffacebook\"\n    \"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fgoogle\"\n)\n\nconst baseURL = \"http:\u002F\u002Flocalhost:8080\"\n\nfunc registerProviders() {\n    goth.UseProviders(\n        discord.New(os.Getenv(\"DISCORD_CLIENT_ID\"), os.Getenv(\"DISCORD_CLIENT_SECRET\"),\n            baseURL+\"\u002Fauth\u002Fdiscord\u002Fcallback\", discord.ScopeIdentify, discord.ScopeEmail),\n        facebook.New(os.Getenv(\"FACEBOOK_CLIENT_ID\"), os.Getenv(\"FACEBOOK_CLIENT_SECRET\"),\n            baseURL+\"\u002Fauth\u002Ffacebook\u002Fcallback\", \"email\"),\n        google.New(os.Getenv(\"GOOGLE_CLIENT_ID\"), os.Getenv(\"GOOGLE_CLIENT_SECRET\"),\n            baseURL+\"\u002Fauth\u002Fgoogle\u002Fcallback\", \"email\", \"profile\"),\n    )\n}\n",[457,611,612,621,627,636,648,653,663,673,683,693,699,704,725,730,746,761,814,852,898,923,969,1002,1008],{"__ignoreMap":528},[532,613,614,618],{"class":534,"line":535},[532,615,617],{"class":616},"sMK4o","package",[532,619,620],{"class":538}," main\n",[532,622,623],{"class":534,"line":552},[532,624,626],{"emptyLinePlaceholder":625},true,"\n",[532,628,629,633],{"class":534,"line":563},[532,630,632],{"class":631},"s7zQu","import",[532,634,635],{"class":616}," (\n",[532,637,639,642,645],{"class":534,"line":638},4,[532,640,641],{"class":616},"    \"",[532,643,644],{"class":538},"os",[532,646,647],{"class":616},"\"\n",[532,649,651],{"class":534,"line":650},5,[532,652,626],{"emptyLinePlaceholder":625},[532,654,656,658,661],{"class":534,"line":655},6,[532,657,641],{"class":616},[532,659,660],{"class":538},"github.com\u002Fmarkbates\u002Fgoth",[532,662,647],{"class":616},[532,664,666,668,671],{"class":534,"line":665},7,[532,667,641],{"class":616},[532,669,670],{"class":538},"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fdiscord",[532,672,647],{"class":616},[532,674,676,678,681],{"class":534,"line":675},8,[532,677,641],{"class":616},[532,679,680],{"class":538},"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Ffacebook",[532,682,647],{"class":616},[532,684,686,688,691],{"class":534,"line":685},9,[532,687,641],{"class":616},[532,689,690],{"class":538},"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fgoogle",[532,692,647],{"class":616},[532,694,696],{"class":534,"line":695},10,[532,697,698],{"class":616},")\n",[532,700,702],{"class":534,"line":701},11,[532,703,626],{"emptyLinePlaceholder":625},[532,705,707,710,714,717,720,723],{"class":534,"line":706},12,[532,708,709],{"class":616},"const",[532,711,713],{"class":712},"sTEyZ"," baseURL ",[532,715,716],{"class":616},"=",[532,718,719],{"class":616}," \"",[532,721,722],{"class":542},"http:\u002F\u002Flocalhost:8080",[532,724,647],{"class":616},[532,726,728],{"class":534,"line":727},13,[532,729,626],{"emptyLinePlaceholder":625},[532,731,733,736,740,743],{"class":534,"line":732},14,[532,734,735],{"class":616},"func",[532,737,739],{"class":738},"s2Zo4"," registerProviders",[532,741,742],{"class":616},"()",[532,744,745],{"class":616}," {\n",[532,747,749,752,755,758],{"class":534,"line":748},15,[532,750,751],{"class":712},"    goth",[532,753,754],{"class":616},".",[532,756,757],{"class":738},"UseProviders",[532,759,760],{"class":616},"(\n",[532,762,764,767,769,772,775,777,779,782,784,787,790,792,795,798,800,802,804,806,809,811],{"class":534,"line":763},16,[532,765,766],{"class":712},"        discord",[532,768,754],{"class":616},[532,770,771],{"class":738},"New",[532,773,774],{"class":616},"(",[532,776,644],{"class":712},[532,778,754],{"class":616},[532,780,781],{"class":738},"Getenv",[532,783,774],{"class":616},[532,785,786],{"class":616},"\"",[532,788,789],{"class":542},"DISCORD_CLIENT_ID",[532,791,786],{"class":616},[532,793,794],{"class":616},"),",[532,796,797],{"class":712}," os",[532,799,754],{"class":616},[532,801,781],{"class":738},[532,803,774],{"class":616},[532,805,786],{"class":616},[532,807,808],{"class":542},"DISCORD_CLIENT_SECRET",[532,810,786],{"class":616},[532,812,813],{"class":616},"),\n",[532,815,817,820,823,825,828,830,833,836,838,841,843,845,847,850],{"class":534,"line":816},17,[532,818,819],{"class":712},"            baseURL",[532,821,822],{"class":616},"+",[532,824,786],{"class":616},[532,826,827],{"class":542},"\u002Fauth\u002Fdiscord\u002Fcallback",[532,829,786],{"class":616},[532,831,832],{"class":616},",",[532,834,835],{"class":712}," discord",[532,837,754],{"class":616},[532,839,840],{"class":712},"ScopeIdentify",[532,842,832],{"class":616},[532,844,835],{"class":712},[532,846,754],{"class":616},[532,848,849],{"class":712},"ScopeEmail",[532,851,813],{"class":616},[532,853,855,858,860,862,864,866,868,870,872,874,877,879,881,883,885,887,889,891,894,896],{"class":534,"line":854},18,[532,856,857],{"class":712},"        facebook",[532,859,754],{"class":616},[532,861,771],{"class":738},[532,863,774],{"class":616},[532,865,644],{"class":712},[532,867,754],{"class":616},[532,869,781],{"class":738},[532,871,774],{"class":616},[532,873,786],{"class":616},[532,875,876],{"class":542},"FACEBOOK_CLIENT_ID",[532,878,786],{"class":616},[532,880,794],{"class":616},[532,882,797],{"class":712},[532,884,754],{"class":616},[532,886,781],{"class":738},[532,888,774],{"class":616},[532,890,786],{"class":616},[532,892,893],{"class":542},"FACEBOOK_CLIENT_SECRET",[532,895,786],{"class":616},[532,897,813],{"class":616},[532,899,901,903,905,907,910,912,914,916,919,921],{"class":534,"line":900},19,[532,902,819],{"class":712},[532,904,822],{"class":616},[532,906,786],{"class":616},[532,908,909],{"class":542},"\u002Fauth\u002Ffacebook\u002Fcallback",[532,911,786],{"class":616},[532,913,832],{"class":616},[532,915,719],{"class":616},[532,917,918],{"class":542},"email",[532,920,786],{"class":616},[532,922,813],{"class":616},[532,924,926,929,931,933,935,937,939,941,943,945,948,950,952,954,956,958,960,962,965,967],{"class":534,"line":925},20,[532,927,928],{"class":712},"        google",[532,930,754],{"class":616},[532,932,771],{"class":738},[532,934,774],{"class":616},[532,936,644],{"class":712},[532,938,754],{"class":616},[532,940,781],{"class":738},[532,942,774],{"class":616},[532,944,786],{"class":616},[532,946,947],{"class":542},"GOOGLE_CLIENT_ID",[532,949,786],{"class":616},[532,951,794],{"class":616},[532,953,797],{"class":712},[532,955,754],{"class":616},[532,957,781],{"class":738},[532,959,774],{"class":616},[532,961,786],{"class":616},[532,963,964],{"class":542},"GOOGLE_CLIENT_SECRET",[532,966,786],{"class":616},[532,968,813],{"class":616},[532,970,972,974,976,978,981,983,985,987,989,991,993,995,998,1000],{"class":534,"line":971},21,[532,973,819],{"class":712},[532,975,822],{"class":616},[532,977,786],{"class":616},[532,979,980],{"class":542},"\u002Fauth\u002Fgoogle\u002Fcallback",[532,982,786],{"class":616},[532,984,832],{"class":616},[532,986,719],{"class":616},[532,988,918],{"class":542},[532,990,786],{"class":616},[532,992,832],{"class":616},[532,994,719],{"class":616},[532,996,997],{"class":542},"profile",[532,999,786],{"class":616},[532,1001,813],{"class":616},[532,1003,1005],{"class":534,"line":1004},22,[532,1006,1007],{"class":616},"    )\n",[532,1009,1011],{"class":534,"line":1010},23,[532,1012,1013],{"class":616},"}\n",[448,1015,1016,1017,754],{},"Minden provider saját alkalmazás-konzoljában (Discord Developer Portal, Meta for Developers, Google Cloud Console) be kell állítani a megfelelő callback URL-t, pontosan úgy, mint a ",[452,1018,1020],{"href":1019},"\u002Fhu\u002Fkit\u002Fsocial-login#provider-oldali-beallitas-es-env-valtozok","generált változat provider-oldali beállítás táblázatában",[572,1022,1024],{"id":1023},"routing-gothic-kal","Routing gothic-kal",[448,1026,450,1027,511,1030,1033,1034,1037,1038,1041,1042,1045],{},[457,1028,1029],{},"gothic.BeginAuthHandler",[457,1031,1032],{},"gothic.CompleteUserAuth"," közvetlenül a kérésből olvassa ki a provider nevét; a Go ",[457,1035,1036],{},"net\u002Fhttp.ServeMux"," route mintáival (Go 1.22+) a ",[457,1039,1040],{},"req.PathValue(\"provider\")"," már az egyik hely, amit a ",[457,1043,1044],{},"gothic.GetProviderName"," ellenőriz, így egy sima stdlib mux is elég, router könyvtár nélkül:",[523,1047,1049],{"className":608,"code":1048,"language":539,"meta":528,"style":528},"package main\n\nimport (\n    \"net\u002Fhttp\"\n    \"os\"\n\n    \"github.com\u002Fgorilla\u002Fsessions\"\n    \"github.com\u002Fmarkbates\u002Fgoth\u002Fgothic\"\n)\n\nfunc main() {\n    gothic.Store = sessions.NewCookieStore([]byte(os.Getenv(\"SESSION_SECRET\")))\n    registerProviders()\n\n    mux := http.NewServeMux()\n    mux.HandleFunc(\"GET \u002Fauth\u002F{provider}\", gothic.BeginAuthHandler)\n    mux.HandleFunc(\"GET \u002Fauth\u002F{provider}\u002Fcallback\", handleCallback)\n    http.ListenAndServe(\":8080\", mux)\n}\n",[457,1050,1051,1057,1061,1067,1075,1083,1087,1096,1105,1109,1113,1124,1171,1179,1183,1201,1232,1256,1282],{"__ignoreMap":528},[532,1052,1053,1055],{"class":534,"line":535},[532,1054,617],{"class":616},[532,1056,620],{"class":538},[532,1058,1059],{"class":534,"line":552},[532,1060,626],{"emptyLinePlaceholder":625},[532,1062,1063,1065],{"class":534,"line":563},[532,1064,632],{"class":631},[532,1066,635],{"class":616},[532,1068,1069,1071,1073],{"class":534,"line":638},[532,1070,641],{"class":616},[532,1072,463],{"class":538},[532,1074,647],{"class":616},[532,1076,1077,1079,1081],{"class":534,"line":650},[532,1078,641],{"class":616},[532,1080,644],{"class":538},[532,1082,647],{"class":616},[532,1084,1085],{"class":534,"line":655},[532,1086,626],{"emptyLinePlaceholder":625},[532,1088,1089,1091,1094],{"class":534,"line":665},[532,1090,641],{"class":616},[532,1092,1093],{"class":538},"github.com\u002Fgorilla\u002Fsessions",[532,1095,647],{"class":616},[532,1097,1098,1100,1103],{"class":534,"line":675},[532,1099,641],{"class":616},[532,1101,1102],{"class":538},"github.com\u002Fmarkbates\u002Fgoth\u002Fgothic",[532,1104,647],{"class":616},[532,1106,1107],{"class":534,"line":685},[532,1108,698],{"class":616},[532,1110,1111],{"class":534,"line":695},[532,1112,626],{"emptyLinePlaceholder":625},[532,1114,1115,1117,1120,1122],{"class":534,"line":701},[532,1116,735],{"class":616},[532,1118,1119],{"class":738}," main",[532,1121,742],{"class":616},[532,1123,745],{"class":616},[532,1125,1126,1129,1131,1134,1136,1139,1141,1144,1147,1151,1153,1155,1157,1159,1161,1163,1166,1168],{"class":534,"line":706},[532,1127,1128],{"class":712},"    gothic",[532,1130,754],{"class":616},[532,1132,1133],{"class":712},"Store ",[532,1135,716],{"class":616},[532,1137,1138],{"class":712}," sessions",[532,1140,754],{"class":616},[532,1142,1143],{"class":738},"NewCookieStore",[532,1145,1146],{"class":616},"([]",[532,1148,1150],{"class":1149},"spNyl","byte",[532,1152,774],{"class":616},[532,1154,644],{"class":712},[532,1156,754],{"class":616},[532,1158,781],{"class":738},[532,1160,774],{"class":616},[532,1162,786],{"class":616},[532,1164,1165],{"class":542},"SESSION_SECRET",[532,1167,786],{"class":616},[532,1169,1170],{"class":616},")))\n",[532,1172,1173,1176],{"class":534,"line":727},[532,1174,1175],{"class":738},"    registerProviders",[532,1177,1178],{"class":616},"()\n",[532,1180,1181],{"class":534,"line":732},[532,1182,626],{"emptyLinePlaceholder":625},[532,1184,1185,1188,1191,1194,1196,1199],{"class":534,"line":748},[532,1186,1187],{"class":712},"    mux ",[532,1189,1190],{"class":616},":=",[532,1192,1193],{"class":712}," http",[532,1195,754],{"class":616},[532,1197,1198],{"class":738},"NewServeMux",[532,1200,1178],{"class":616},[532,1202,1203,1206,1208,1211,1213,1215,1218,1220,1222,1225,1227,1230],{"class":534,"line":763},[532,1204,1205],{"class":712},"    mux",[532,1207,754],{"class":616},[532,1209,1210],{"class":738},"HandleFunc",[532,1212,774],{"class":616},[532,1214,786],{"class":616},[532,1216,1217],{"class":542},"GET \u002Fauth\u002F{provider}",[532,1219,786],{"class":616},[532,1221,832],{"class":616},[532,1223,1224],{"class":712}," gothic",[532,1226,754],{"class":616},[532,1228,1229],{"class":712},"BeginAuthHandler",[532,1231,698],{"class":616},[532,1233,1234,1236,1238,1240,1242,1244,1247,1249,1251,1254],{"class":534,"line":816},[532,1235,1205],{"class":712},[532,1237,754],{"class":616},[532,1239,1210],{"class":738},[532,1241,774],{"class":616},[532,1243,786],{"class":616},[532,1245,1246],{"class":542},"GET \u002Fauth\u002F{provider}\u002Fcallback",[532,1248,786],{"class":616},[532,1250,832],{"class":616},[532,1252,1253],{"class":712}," handleCallback",[532,1255,698],{"class":616},[532,1257,1258,1261,1263,1266,1268,1270,1273,1275,1277,1280],{"class":534,"line":854},[532,1259,1260],{"class":712},"    http",[532,1262,754],{"class":616},[532,1264,1265],{"class":738},"ListenAndServe",[532,1267,774],{"class":616},[532,1269,786],{"class":616},[532,1271,1272],{"class":542},":8080",[532,1274,786],{"class":616},[532,1276,832],{"class":616},[532,1278,1279],{"class":712}," mux",[532,1281,698],{"class":616},[532,1283,1284],{"class":534,"line":900},[532,1285,1013],{"class":616},[448,1287,450,1288,1290,1291,1293,1294,1297],{},[457,1289,1165],{}," írja alá azt a cookie-t, amiben a ",[457,1292,600],{}," az OAuth-session-t tárolja a begin és a callback kérés között; ugyanúgy kezeld, mint a ",[457,1295,1296],{},"JWT_SECRET","-et: környezetenként más érték, sosem commitolva.",[572,1299,1301],{"id":1300},"a-callback-gothuser-egy-gp-systemauth-tokenné","A callback: goth.User egy gp-system\u002Fauth tokenné",[448,1303,1304,1305,1307,1308,1310,1311,1314,1315,1318,1319,1318,1322,1318,1325,1318,1328,1331,1332,1335],{},"Ez az a rész, ami az ",[457,1306,82],{},"-hoz ér. A ",[457,1309,1032],{}," egy ",[457,1312,1313],{},"goth.User","-t ad vissza (a ",[457,1316,1317],{},"Provider",", ",[457,1320,1321],{},"UserID",[457,1323,1324],{},"Email",[457,1326,1327],{},"Name",[457,1329,1330],{},"AvatarURL"," mezőivel); a lenti ",[457,1333,1334],{},"findOrCreateUser"," az a hely, ahol a generált változat által dokumentált ugyanazt a keresési szabályt alkalmaznád (elsőként provider + provider-kulcs egyezés, azután email, elutasítás egy nem-verifikált helyi fiókhoz való hozzákötésnél), csak kézzel megírva, generálás helyett:",[523,1337,1339],{"className":608,"code":1338,"language":539,"meta":528,"style":528},"package main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"net\u002Fhttp\"\n    \"time\"\n\n    \"github.com\u002Fgp-system\u002Fauth\"\n    \"github.com\u002Fmarkbates\u002Fgoth\"\n    \"github.com\u002Fmarkbates\u002Fgoth\u002Fgothic\"\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:    \"social-demo\",\n})\n\nfunc handleCallback(w http.ResponseWriter, r *http.Request) {\n    gothUser, err := gothic.CompleteUserAuth(w, r)\n    if err != nil {\n        http.Error(w, \"social login failed\", http.StatusUnauthorized)\n        return\n    }\n\n    user, err := findOrCreateUser(gothUser)\n    if err != nil {\n        http.Error(w, \"internal error\", http.StatusInternalServerError)\n        return\n    }\n\n    claims := auth.NewDefaultClaims(auth.Config{Issuer: \"social-demo\", AccessTTL: 15 * time.Minute},\n        user.ID, user.Username, user.Roles, user.Permissions)\n    token, err := issuer.Sign(claims)\n    if err != nil {\n        http.Error(w, \"internal error\", http.StatusInternalServerError)\n        return\n    }\n\n    refresh, err := auth.NewRefreshToken()\n    if err != nil {\n        http.Error(w, \"internal error\", http.StatusInternalServerError)\n        return\n    }\n    \u002F\u002F itt tárold el a refresh hash-ét user.ID-hoz kötve, ugyanúgy, ahogy egy email+jelszó bejelentkezés is tenné\n\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    json.NewEncoder(w).Encode(map[string]string{\"accessToken\": token, \"refreshToken\": refresh})\n}\n\n\u002F\u002F a findOrCreateUser a saját perzisztenciád, nem az auth vagy a goth része.\n\u002F\u002F Keress először (provider, gothUser.UserID) alapján (visszatérő felhasználó);\n\u002F\u002F aztán email alapján (kösd hozzá egy létező, verifikált fiókhoz, vagy utasítsd\n\u002F\u002F el, ha az az email egy nem-verifikálthoz tartozik); egyébként hozz létre egy\n\u002F\u002F új, előre verifikált felhasználót, mert a provider már kezeskedett az email\n\u002F\u002F címért.\nfunc findOrCreateUser(gothUser goth.User) (localUser, error) {\n    panic(\"gyakorlatként meghagyva: a saját users táblád\")\n}\n\ntype localUser struct {\n    ID          string\n    Username    string\n    Roles       []string\n    Permissions []string\n}\n",[457,1340,1341,1347,1351,1357,1366,1374,1383,1387,1396,1404,1412,1416,1420,1461,1482,1507,1523,1528,1532,1571,1600,1615,1649,1654,1660,1665,1687,1700,1733,1738,1743,1748,1805,1846,1873,1886,1917,1922,1927,1932,1953,1966,1997,2002,2007,2013,2018,2055,2117,2122,2127,2133,2139,2145,2151,2157,2163,2199,2216,2221,2226,2240,2249,2257,2268,2278],{"__ignoreMap":528},[532,1342,1343,1345],{"class":534,"line":535},[532,1344,617],{"class":616},[532,1346,620],{"class":538},[532,1348,1349],{"class":534,"line":552},[532,1350,626],{"emptyLinePlaceholder":625},[532,1352,1353,1355],{"class":534,"line":563},[532,1354,632],{"class":631},[532,1356,635],{"class":616},[532,1358,1359,1361,1364],{"class":534,"line":638},[532,1360,641],{"class":616},[532,1362,1363],{"class":538},"encoding\u002Fjson",[532,1365,647],{"class":616},[532,1367,1368,1370,1372],{"class":534,"line":650},[532,1369,641],{"class":616},[532,1371,463],{"class":538},[532,1373,647],{"class":616},[532,1375,1376,1378,1381],{"class":534,"line":655},[532,1377,641],{"class":616},[532,1379,1380],{"class":538},"time",[532,1382,647],{"class":616},[532,1384,1385],{"class":534,"line":665},[532,1386,626],{"emptyLinePlaceholder":625},[532,1388,1389,1391,1394],{"class":534,"line":675},[532,1390,641],{"class":616},[532,1392,1393],{"class":538},"github.com\u002Fgp-system\u002Fauth",[532,1395,647],{"class":616},[532,1397,1398,1400,1402],{"class":534,"line":685},[532,1399,641],{"class":616},[532,1401,660],{"class":538},[532,1403,647],{"class":616},[532,1405,1406,1408,1410],{"class":534,"line":695},[532,1407,641],{"class":616},[532,1409,1102],{"class":538},[532,1411,647],{"class":616},[532,1413,1414],{"class":534,"line":701},[532,1415,698],{"class":616},[532,1417,1418],{"class":534,"line":706},[532,1419,626],{"emptyLinePlaceholder":625},[532,1421,1422,1425,1428,1430,1433,1435,1438,1441,1443,1445,1448,1451,1453,1455,1458],{"class":534,"line":727},[532,1423,1424],{"class":616},"var",[532,1426,1427],{"class":712}," issuer ",[532,1429,716],{"class":616},[532,1431,1432],{"class":712}," auth",[532,1434,754],{"class":616},[532,1436,1437],{"class":738},"NewTokenIssuer",[532,1439,1440],{"class":616},"[",[532,1442,82],{"class":538},[532,1444,754],{"class":616},[532,1446,1447],{"class":538},"DefaultClaims",[532,1449,1450],{"class":616},"](",[532,1452,82],{"class":538},[532,1454,754],{"class":616},[532,1456,1457],{"class":538},"Config",[532,1459,1460],{"class":616},"{\n",[532,1462,1463,1466,1469,1471,1474,1476,1478],{"class":534,"line":732},[532,1464,1465],{"class":712},"    Secret",[532,1467,1468],{"class":616},":",[532,1470,641],{"class":616},[532,1472,1473],{"class":542},"dev-secret-change-me",[532,1475,786],{"class":616},[532,1477,832],{"class":616},[532,1479,1481],{"class":1480},"sHwdD"," \u002F\u002F valós kódban: env-ből\u002Fsecret-kezelőből\n",[532,1483,1484,1487,1489,1493,1496,1499,1501,1504],{"class":534,"line":748},[532,1485,1486],{"class":712},"    AccessTTL",[532,1488,1468],{"class":616},[532,1490,1492],{"class":1491},"sbssI"," 15",[532,1494,1495],{"class":616}," *",[532,1497,1498],{"class":712}," time",[532,1500,754],{"class":616},[532,1502,1503],{"class":712},"Minute",[532,1505,1506],{"class":616},",\n",[532,1508,1509,1512,1514,1516,1519,1521],{"class":534,"line":763},[532,1510,1511],{"class":712},"    Issuer",[532,1513,1468],{"class":616},[532,1515,641],{"class":616},[532,1517,1518],{"class":542},"social-demo",[532,1520,786],{"class":616},[532,1522,1506],{"class":616},[532,1524,1525],{"class":534,"line":816},[532,1526,1527],{"class":616},"})\n",[532,1529,1530],{"class":534,"line":854},[532,1531,626],{"emptyLinePlaceholder":625},[532,1533,1534,1536,1538,1540,1544,1546,1548,1551,1553,1556,1558,1561,1563,1566,1569],{"class":534,"line":900},[532,1535,735],{"class":616},[532,1537,1253],{"class":738},[532,1539,774],{"class":616},[532,1541,1543],{"class":1542},"sHdIc","w",[532,1545,1193],{"class":538},[532,1547,754],{"class":616},[532,1549,1550],{"class":538},"ResponseWriter",[532,1552,832],{"class":616},[532,1554,1555],{"class":1542}," r",[532,1557,1495],{"class":616},[532,1559,1560],{"class":538},"http",[532,1562,754],{"class":616},[532,1564,1565],{"class":538},"Request",[532,1567,1568],{"class":616},")",[532,1570,745],{"class":616},[532,1572,1573,1576,1578,1581,1583,1585,1587,1590,1592,1594,1596,1598],{"class":534,"line":925},[532,1574,1575],{"class":712},"    gothUser",[532,1577,832],{"class":616},[532,1579,1580],{"class":712}," err ",[532,1582,1190],{"class":616},[532,1584,1224],{"class":712},[532,1586,754],{"class":616},[532,1588,1589],{"class":738},"CompleteUserAuth",[532,1591,774],{"class":616},[532,1593,1543],{"class":712},[532,1595,832],{"class":616},[532,1597,1555],{"class":712},[532,1599,698],{"class":616},[532,1601,1602,1605,1607,1610,1613],{"class":534,"line":971},[532,1603,1604],{"class":631},"    if",[532,1606,1580],{"class":712},[532,1608,1609],{"class":616},"!=",[532,1611,1612],{"class":616}," nil",[532,1614,745],{"class":616},[532,1616,1617,1620,1622,1625,1627,1629,1631,1633,1636,1638,1640,1642,1644,1647],{"class":534,"line":1004},[532,1618,1619],{"class":712},"        http",[532,1621,754],{"class":616},[532,1623,1624],{"class":738},"Error",[532,1626,774],{"class":616},[532,1628,1543],{"class":712},[532,1630,832],{"class":616},[532,1632,719],{"class":616},[532,1634,1635],{"class":542},"social login failed",[532,1637,786],{"class":616},[532,1639,832],{"class":616},[532,1641,1193],{"class":712},[532,1643,754],{"class":616},[532,1645,1646],{"class":712},"StatusUnauthorized",[532,1648,698],{"class":616},[532,1650,1651],{"class":534,"line":1010},[532,1652,1653],{"class":631},"        return\n",[532,1655,1657],{"class":534,"line":1656},24,[532,1658,1659],{"class":616},"    }\n",[532,1661,1663],{"class":534,"line":1662},25,[532,1664,626],{"emptyLinePlaceholder":625},[532,1666,1668,1671,1673,1675,1677,1680,1682,1685],{"class":534,"line":1667},26,[532,1669,1670],{"class":712},"    user",[532,1672,832],{"class":616},[532,1674,1580],{"class":712},[532,1676,1190],{"class":616},[532,1678,1679],{"class":738}," findOrCreateUser",[532,1681,774],{"class":616},[532,1683,1684],{"class":712},"gothUser",[532,1686,698],{"class":616},[532,1688,1690,1692,1694,1696,1698],{"class":534,"line":1689},27,[532,1691,1604],{"class":631},[532,1693,1580],{"class":712},[532,1695,1609],{"class":616},[532,1697,1612],{"class":616},[532,1699,745],{"class":616},[532,1701,1703,1705,1707,1709,1711,1713,1715,1717,1720,1722,1724,1726,1728,1731],{"class":534,"line":1702},28,[532,1704,1619],{"class":712},[532,1706,754],{"class":616},[532,1708,1624],{"class":738},[532,1710,774],{"class":616},[532,1712,1543],{"class":712},[532,1714,832],{"class":616},[532,1716,719],{"class":616},[532,1718,1719],{"class":542},"internal error",[532,1721,786],{"class":616},[532,1723,832],{"class":616},[532,1725,1193],{"class":712},[532,1727,754],{"class":616},[532,1729,1730],{"class":712},"StatusInternalServerError",[532,1732,698],{"class":616},[532,1734,1736],{"class":534,"line":1735},29,[532,1737,1653],{"class":631},[532,1739,1741],{"class":534,"line":1740},30,[532,1742,1659],{"class":616},[532,1744,1746],{"class":534,"line":1745},31,[532,1747,626],{"emptyLinePlaceholder":625},[532,1749,1751,1754,1756,1758,1760,1763,1765,1767,1769,1771,1774,1777,1779,1781,1783,1785,1787,1790,1792,1794,1796,1798,1800,1802],{"class":534,"line":1750},32,[532,1752,1753],{"class":712},"    claims ",[532,1755,1190],{"class":616},[532,1757,1432],{"class":712},[532,1759,754],{"class":616},[532,1761,1762],{"class":738},"NewDefaultClaims",[532,1764,774],{"class":616},[532,1766,82],{"class":538},[532,1768,754],{"class":616},[532,1770,1457],{"class":538},[532,1772,1773],{"class":616},"{",[532,1775,1776],{"class":712},"Issuer",[532,1778,1468],{"class":616},[532,1780,719],{"class":616},[532,1782,1518],{"class":542},[532,1784,786],{"class":616},[532,1786,832],{"class":616},[532,1788,1789],{"class":712}," AccessTTL",[532,1791,1468],{"class":616},[532,1793,1492],{"class":1491},[532,1795,1495],{"class":616},[532,1797,1498],{"class":712},[532,1799,754],{"class":616},[532,1801,1503],{"class":712},[532,1803,1804],{"class":616},"},\n",[532,1806,1808,1811,1813,1816,1818,1821,1823,1826,1828,1830,1832,1835,1837,1839,1841,1844],{"class":534,"line":1807},33,[532,1809,1810],{"class":712},"        user",[532,1812,754],{"class":616},[532,1814,1815],{"class":712},"ID",[532,1817,832],{"class":616},[532,1819,1820],{"class":712}," user",[532,1822,754],{"class":616},[532,1824,1825],{"class":712},"Username",[532,1827,832],{"class":616},[532,1829,1820],{"class":712},[532,1831,754],{"class":616},[532,1833,1834],{"class":712},"Roles",[532,1836,832],{"class":616},[532,1838,1820],{"class":712},[532,1840,754],{"class":616},[532,1842,1843],{"class":712},"Permissions",[532,1845,698],{"class":616},[532,1847,1849,1852,1854,1856,1858,1861,1863,1866,1868,1871],{"class":534,"line":1848},34,[532,1850,1851],{"class":712},"    token",[532,1853,832],{"class":616},[532,1855,1580],{"class":712},[532,1857,1190],{"class":616},[532,1859,1860],{"class":712}," issuer",[532,1862,754],{"class":616},[532,1864,1865],{"class":738},"Sign",[532,1867,774],{"class":616},[532,1869,1870],{"class":712},"claims",[532,1872,698],{"class":616},[532,1874,1876,1878,1880,1882,1884],{"class":534,"line":1875},35,[532,1877,1604],{"class":631},[532,1879,1580],{"class":712},[532,1881,1609],{"class":616},[532,1883,1612],{"class":616},[532,1885,745],{"class":616},[532,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915],{"class":534,"line":1888},36,[532,1890,1619],{"class":712},[532,1892,754],{"class":616},[532,1894,1624],{"class":738},[532,1896,774],{"class":616},[532,1898,1543],{"class":712},[532,1900,832],{"class":616},[532,1902,719],{"class":616},[532,1904,1719],{"class":542},[532,1906,786],{"class":616},[532,1908,832],{"class":616},[532,1910,1193],{"class":712},[532,1912,754],{"class":616},[532,1914,1730],{"class":712},[532,1916,698],{"class":616},[532,1918,1920],{"class":534,"line":1919},37,[532,1921,1653],{"class":631},[532,1923,1925],{"class":534,"line":1924},38,[532,1926,1659],{"class":616},[532,1928,1930],{"class":534,"line":1929},39,[532,1931,626],{"emptyLinePlaceholder":625},[532,1933,1935,1938,1940,1942,1944,1946,1948,1951],{"class":534,"line":1934},40,[532,1936,1937],{"class":712},"    refresh",[532,1939,832],{"class":616},[532,1941,1580],{"class":712},[532,1943,1190],{"class":616},[532,1945,1432],{"class":712},[532,1947,754],{"class":616},[532,1949,1950],{"class":738},"NewRefreshToken",[532,1952,1178],{"class":616},[532,1954,1956,1958,1960,1962,1964],{"class":534,"line":1955},41,[532,1957,1604],{"class":631},[532,1959,1580],{"class":712},[532,1961,1609],{"class":616},[532,1963,1612],{"class":616},[532,1965,745],{"class":616},[532,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995],{"class":534,"line":1968},42,[532,1970,1619],{"class":712},[532,1972,754],{"class":616},[532,1974,1624],{"class":738},[532,1976,774],{"class":616},[532,1978,1543],{"class":712},[532,1980,832],{"class":616},[532,1982,719],{"class":616},[532,1984,1719],{"class":542},[532,1986,786],{"class":616},[532,1988,832],{"class":616},[532,1990,1193],{"class":712},[532,1992,754],{"class":616},[532,1994,1730],{"class":712},[532,1996,698],{"class":616},[532,1998,2000],{"class":534,"line":1999},43,[532,2001,1653],{"class":631},[532,2003,2005],{"class":534,"line":2004},44,[532,2006,1659],{"class":616},[532,2008,2010],{"class":534,"line":2009},45,[532,2011,2012],{"class":1480},"    \u002F\u002F itt tárold el a refresh hash-ét user.ID-hoz kötve, ugyanúgy, ahogy egy email+jelszó bejelentkezés is tenné\n",[532,2014,2016],{"class":534,"line":2015},46,[532,2017,626],{"emptyLinePlaceholder":625},[532,2019,2021,2024,2026,2029,2032,2035,2037,2039,2042,2044,2046,2048,2051,2053],{"class":534,"line":2020},47,[532,2022,2023],{"class":712},"    w",[532,2025,754],{"class":616},[532,2027,2028],{"class":738},"Header",[532,2030,2031],{"class":616},"().",[532,2033,2034],{"class":738},"Set",[532,2036,774],{"class":616},[532,2038,786],{"class":616},[532,2040,2041],{"class":542},"Content-Type",[532,2043,786],{"class":616},[532,2045,832],{"class":616},[532,2047,719],{"class":616},[532,2049,2050],{"class":542},"application\u002Fjson",[532,2052,786],{"class":616},[532,2054,698],{"class":616},[532,2056,2058,2061,2063,2066,2068,2070,2073,2076,2079,2082,2085,2087,2089,2091,2094,2096,2098,2101,2103,2105,2108,2110,2112,2115],{"class":534,"line":2057},48,[532,2059,2060],{"class":712},"    json",[532,2062,754],{"class":616},[532,2064,2065],{"class":738},"NewEncoder",[532,2067,774],{"class":616},[532,2069,1543],{"class":712},[532,2071,2072],{"class":616},").",[532,2074,2075],{"class":738},"Encode",[532,2077,2078],{"class":616},"(map[",[532,2080,2081],{"class":1149},"string",[532,2083,2084],{"class":616},"]",[532,2086,2081],{"class":1149},[532,2088,1773],{"class":616},[532,2090,786],{"class":616},[532,2092,2093],{"class":542},"accessToken",[532,2095,786],{"class":616},[532,2097,1468],{"class":616},[532,2099,2100],{"class":712}," token",[532,2102,832],{"class":616},[532,2104,719],{"class":616},[532,2106,2107],{"class":542},"refreshToken",[532,2109,786],{"class":616},[532,2111,1468],{"class":616},[532,2113,2114],{"class":712}," refresh",[532,2116,1527],{"class":616},[532,2118,2120],{"class":534,"line":2119},49,[532,2121,1013],{"class":616},[532,2123,2125],{"class":534,"line":2124},50,[532,2126,626],{"emptyLinePlaceholder":625},[532,2128,2130],{"class":534,"line":2129},51,[532,2131,2132],{"class":1480},"\u002F\u002F a findOrCreateUser a saját perzisztenciád, nem az auth vagy a goth része.\n",[532,2134,2136],{"class":534,"line":2135},52,[532,2137,2138],{"class":1480},"\u002F\u002F Keress először (provider, gothUser.UserID) alapján (visszatérő felhasználó);\n",[532,2140,2142],{"class":534,"line":2141},53,[532,2143,2144],{"class":1480},"\u002F\u002F aztán email alapján (kösd hozzá egy létező, verifikált fiókhoz, vagy utasítsd\n",[532,2146,2148],{"class":534,"line":2147},54,[532,2149,2150],{"class":1480},"\u002F\u002F el, ha az az email egy nem-verifikálthoz tartozik); egyébként hozz létre egy\n",[532,2152,2154],{"class":534,"line":2153},55,[532,2155,2156],{"class":1480},"\u002F\u002F új, előre verifikált felhasználót, mert a provider már kezeskedett az email\n",[532,2158,2160],{"class":534,"line":2159},56,[532,2161,2162],{"class":1480},"\u002F\u002F címért.\n",[532,2164,2166,2168,2170,2172,2174,2177,2179,2182,2184,2187,2190,2192,2195,2197],{"class":534,"line":2165},57,[532,2167,735],{"class":616},[532,2169,1679],{"class":738},[532,2171,774],{"class":616},[532,2173,1684],{"class":1542},[532,2175,2176],{"class":538}," goth",[532,2178,754],{"class":616},[532,2180,2181],{"class":538},"User",[532,2183,1568],{"class":616},[532,2185,2186],{"class":616}," (",[532,2188,2189],{"class":538},"localUser",[532,2191,832],{"class":616},[532,2193,2194],{"class":1149}," error",[532,2196,1568],{"class":616},[532,2198,745],{"class":616},[532,2200,2202,2205,2207,2209,2212,2214],{"class":534,"line":2201},58,[532,2203,2204],{"class":738},"    panic",[532,2206,774],{"class":616},[532,2208,786],{"class":616},[532,2210,2211],{"class":542},"gyakorlatként meghagyva: a saját users táblád",[532,2213,786],{"class":616},[532,2215,698],{"class":616},[532,2217,2219],{"class":534,"line":2218},59,[532,2220,1013],{"class":616},[532,2222,2224],{"class":534,"line":2223},60,[532,2225,626],{"emptyLinePlaceholder":625},[532,2227,2229,2232,2235,2238],{"class":534,"line":2228},61,[532,2230,2231],{"class":616},"type",[532,2233,2234],{"class":538}," localUser",[532,2236,2237],{"class":616}," struct",[532,2239,745],{"class":616},[532,2241,2243,2246],{"class":534,"line":2242},62,[532,2244,2245],{"class":712},"    ID          ",[532,2247,2248],{"class":1149},"string\n",[532,2250,2252,2255],{"class":534,"line":2251},63,[532,2253,2254],{"class":712},"    Username    ",[532,2256,2248],{"class":1149},[532,2258,2260,2263,2266],{"class":534,"line":2259},64,[532,2261,2262],{"class":712},"    Roles       ",[532,2264,2265],{"class":616},"[]",[532,2267,2248],{"class":1149},[532,2269,2271,2274,2276],{"class":534,"line":2270},65,[532,2272,2273],{"class":712},"    Permissions ",[532,2275,2265],{"class":616},[532,2277,2248],{"class":1149},[532,2279,2281],{"class":534,"line":2280},66,[532,2282,1013],{"class":616},[448,2284,2285,2286,2289,2290,2293,2294,2297,2298,2300],{},"Innentől ennek a szekciónak minden más oldala változtatás nélkül alkalmazható: a ",[457,2287,2288],{},"handleCallback"," által visszaadott tokent ugyanazokkal az ",[457,2291,2292],{},"auth.Identify","\u002F",[457,2295,2296],{},"rbac.CheckRole"," hívásokkal ellenőrzöd, mint egy email+jelszó bejelentkezésből származó tokent, mert az egy ilyen token, csak egy ",[457,2299,1313],{}," keresés után írva alá, bcrypt-összehasonlítás helyett.",[572,2302,2304],{"id":2303},"amit-a-kit-hozzáad","Amit a kit hozzáad",[448,2306,2307,2308,2310,2311,2314,2315,2317,2318,2293,2321,2324,2325,2328,2329,2331],{},"A generált ",[457,2309,581],{}," csomag (",[457,2312,2313],{},"go tool gpsystem add auth --social discord,facebook,google",") ugyanez az ötlet, három olyan dologgal megtoldva, amit egy valós projekt általában szeretne: aláírt, állapotmentes ",[457,2316,585],{}," paraméter cookie-session helyett (hogy a strict-server handler alakjából is működjön), az account-linking szabály egyszer megvalósítva a kit ",[457,2319,2320],{},"users",[457,2322,2323],{},"auth_credentials"," sémájára, ",[457,2326,2327],{},"panic(\"gyakorlatként meghagyva\")"," helyett, valamint az Apple form_post callback-je és JWT client-secret kezelése. Lásd a ",[452,2330,277],{"href":278}," oldalt ehhez a változathoz.",[2333,2334,2335],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":528,"searchDepth":552,"depth":552,"links":2337},[2338,2339,2340,2341,2342],{"id":574,"depth":552,"text":575},{"id":604,"depth":552,"text":605},{"id":1023,"depth":552,"text":1024},{"id":1300,"depth":552,"text":1301},{"id":2303,"depth":552,"text":2304},"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.","md",null,{},{"icon":111},{"title":108,"description":2343},"X4xATTU442D1ZhvvCyY9LwW5q0wfVS69NJyI6LEwfes",[2351,2353],{"title":103,"path":104,"stem":105,"description":2352,"icon":106,"children":-1},"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.",{"title":52,"path":119,"stem":120,"description":2354,"icon":114,"children":-1},"Email-küldés: fluent Message builder, MJML template-ek, memória-mailer a tesztekhez.",1785445887076]