[{"data":1,"prerenderedAt":1728},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-framework-social-login":449,"-hu-framework-social-login-surround":1723},[4,45,120,158,174,204,234,260,272,288,308,327,340,357,374,387,399,426],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F01.getting-started",[10,15,20,25,30,35,40],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F01.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F01.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F01.getting-started\u002F3.first-module","i-lucide-package-plus",{"title":26,"path":27,"stem":28,"icon":29},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F01.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F01.getting-started\u002F5.sample-app","i-lucide-shopping-cart",{"title":36,"path":37,"stem":38,"icon":39},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F01.getting-started\u002F6.coming-from-laravel","i-lucide-arrow-right-left",{"title":41,"path":42,"stem":43,"icon":39},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F01.getting-started\u002F7.coming-from-symfony",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F02.cli",[51,55,60,65,70,75,80,85,90,95,100,105,110,115],{"title":52,"path":53,"stem":54,"icon":47},"Áttekintés","\u002Fhu\u002Fcli\u002Foverview","hu\u002F02.cli\u002F1.overview",{"title":56,"path":57,"stem":58,"icon":59},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F02.cli\u002F10.add-compose","i-lucide-container",{"title":61,"path":62,"stem":63,"icon":64},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F02.cli\u002F11.add-mail","i-lucide-mail-plus",{"title":66,"path":67,"stem":68,"icon":69},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F02.cli\u002F12.add-notification","i-lucide-bell-plus",{"title":71,"path":72,"stem":73,"icon":74},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F02.cli\u002F13.add-realtime","i-lucide-radio-tower",{"title":76,"path":77,"stem":78,"icon":79},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F02.cli\u002F14.add-seeder","i-lucide-sprout",{"title":81,"path":82,"stem":83,"icon":84},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F02.cli\u002F2.new-project","i-lucide-folder-plus",{"title":86,"path":87,"stem":88,"icon":89},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F02.cli\u002F3.new-module","i-lucide-blocks",{"title":91,"path":92,"stem":93,"icon":94},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F02.cli\u002F4.add-surface","i-lucide-layers-2",{"title":96,"path":97,"stem":98,"icon":99},"add domain","\u002Fhu\u002Fcli\u002Fadd-domain","hu\u002F02.cli\u002F5.add-domain","i-lucide-box",{"title":101,"path":102,"stem":103,"icon":104},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F02.cli\u002F6.add-handler","i-lucide-webhook",{"title":106,"path":107,"stem":108,"icon":109},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F02.cli\u002F7.new-migration","i-lucide-file-plus",{"title":111,"path":112,"stem":113,"icon":114},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F02.cli\u002F8.worker-generators","i-lucide-cog",{"title":116,"path":117,"stem":118,"icon":119},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F02.cli\u002F9.add-db","i-lucide-database-zap",{"title":121,"icon":99,"path":122,"stem":123,"children":124,"page":44},"A framework","\u002Fhu\u002Fframework","hu\u002F03.framework",[125,129,134,139,143,148,153],{"title":126,"path":127,"stem":128,"icon":99},"A framework áttekintése","\u002Fhu\u002Fframework\u002Foverview","hu\u002F03.framework\u002F1.overview",{"title":130,"path":131,"stem":132,"icon":133},"Alkalmazás-életciklus","\u002Fhu\u002Fframework\u002Fapp","hu\u002F03.framework\u002F2.app","i-lucide-power",{"title":135,"path":136,"stem":137,"icon":138},"Szerver","\u002Fhu\u002Fframework\u002Fserver","hu\u002F03.framework\u002F3.server","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":114},"Worker","\u002Fhu\u002Fframework\u002Fworker","hu\u002F03.framework\u002F4.worker",{"title":144,"path":145,"stem":146,"icon":147},"Realtime","\u002Fhu\u002Fframework\u002Frealtime","hu\u002F03.framework\u002F5.realtime","i-lucide-radio",{"title":149,"path":150,"stem":151,"icon":152},"Migrációk","\u002Fhu\u002Fframework\u002Fmigrations","hu\u002F03.framework\u002F6.migrations","i-lucide-file-stack",{"title":154,"path":155,"stem":156,"icon":157},"Social login","\u002Fhu\u002Fframework\u002Fsocial-login","hu\u002F03.framework\u002F7.social-login","i-lucide-log-in",{"title":159,"icon":160,"path":161,"stem":162,"children":163,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F04.reference",[164,169],{"title":165,"path":166,"stem":167,"icon":168},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F04.reference\u002F1.configuration","i-lucide-settings",{"title":170,"path":171,"stem":172,"icon":173},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F04.reference\u002F2.dependencies","i-lucide-package",{"title":175,"icon":176,"path":177,"stem":178,"children":179,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F05.concepts",[180,185,190,194,199],{"title":181,"path":182,"stem":183,"icon":184},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F05.concepts\u002F1.architecture","i-lucide-layers",{"title":186,"path":187,"stem":188,"icon":189},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F05.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":165,"path":191,"stem":192,"icon":193},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F05.concepts\u002F3.configuration","i-lucide-settings-2",{"title":195,"path":196,"stem":197,"icon":198},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F05.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":200,"path":201,"stem":202,"icon":203},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F05.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":205,"icon":206,"path":207,"stem":208,"children":209,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F06.auth",[210,215,220,225,230],{"title":211,"path":212,"stem":213,"icon":214},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F06.auth\u002F1.overview","i-lucide-key-round",{"title":216,"path":217,"stem":218,"icon":219},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F06.auth\u002F2.rbac","i-lucide-users",{"title":221,"path":222,"stem":223,"icon":224},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F06.auth\u002F3.policy","i-lucide-gavel",{"title":226,"path":227,"stem":228,"icon":229},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F06.auth\u002F4.standalone","i-lucide-plug",{"title":231,"path":232,"stem":233,"icon":157},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F06.auth\u002F5.social-standalone",{"title":235,"icon":236,"path":237,"stem":238,"children":239,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F07.dbx",[240,243,247,251,256],{"title":52,"path":241,"stem":242,"icon":236},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F07.dbx\u002F1.overview",{"title":244,"path":245,"stem":246,"icon":229},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F07.dbx\u002F2.pg",{"title":248,"path":249,"stem":250,"icon":184},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F07.dbx\u002F3.bunx",{"title":252,"path":253,"stem":254,"icon":255},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F07.dbx\u002F4.transactions","i-lucide-git-merge",{"title":257,"path":258,"stem":259,"icon":79},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F07.dbx\u002F5.seed",{"title":261,"icon":193,"path":262,"stem":263,"children":264,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F08.envconf",[265,268],{"title":52,"path":266,"stem":267,"icon":193},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F08.envconf\u002F1.overview",{"title":269,"path":270,"stem":271,"icon":193},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F08.envconf\u002F2.recipes",{"title":273,"icon":189,"path":274,"stem":275,"children":276,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F09.errs",[277,280,284],{"title":52,"path":278,"stem":279,"icon":189},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F09.errs\u002F1.overview",{"title":281,"path":282,"stem":283,"icon":189},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F09.errs\u002F2.api",{"title":285,"path":286,"stem":287,"icon":189},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F09.errs\u002F3.integration",{"title":289,"icon":290,"path":291,"stem":292,"children":293,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F10.events",[294,298,303],{"title":295,"path":296,"stem":297,"icon":147},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F10.events\u002F1.overview",{"title":299,"path":300,"stem":301,"icon":302},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F10.events\u002F2.outbox","i-lucide-inbox",{"title":304,"path":305,"stem":306,"icon":307},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F10.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":309,"icon":310,"path":311,"stem":312,"children":313,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F11.httperr",[314,317,322],{"title":52,"path":315,"stem":316,"icon":310},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F11.httperr\u002F1.overview",{"title":318,"path":319,"stem":320,"icon":321},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F11.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":323,"path":324,"stem":325,"icon":326},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F11.httperr\u002F3.validation","i-lucide-badge-check",{"title":328,"icon":329,"path":330,"stem":331,"children":332,"page":44},"logx","i-lucide-scroll-text","\u002Fhu\u002Flogx","hu\u002F12.logx",[333,336],{"title":52,"path":334,"stem":335,"icon":329},"\u002Fhu\u002Flogx\u002Foverview","hu\u002F12.logx\u002F1.overview",{"title":337,"path":338,"stem":339,"icon":47},"Monolog-formázó","\u002Fhu\u002Flogx\u002Fmonolog","hu\u002F12.logx\u002F2.monolog",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[346,349,353],{"title":52,"path":347,"stem":348,"icon":342},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":350,"path":351,"stem":352,"icon":342},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":354,"path":355,"stem":356,"icon":342},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[363,366,370],{"title":52,"path":364,"stem":365,"icon":359},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":367,"path":368,"stem":369,"icon":359},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":371,"path":372,"stem":373,"icon":359},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":44},"paginate","i-lucide-list-ordered","\u002Fhu\u002Fpaginate","hu\u002F15.paginate",[380,383],{"title":52,"path":381,"stem":382,"icon":376},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F15.paginate\u002F1.overview",{"title":384,"path":385,"stem":386,"icon":39},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F15.paginate\u002F2.cursor",{"title":388,"icon":184,"path":389,"stem":390,"children":391,"page":44},"queue","\u002Fhu\u002Fqueue","hu\u002F16.queue",[392,395],{"title":52,"path":393,"stem":394,"icon":376},"\u002Fhu\u002Fqueue\u002Foverview","hu\u002F16.queue\u002F1.overview",{"title":396,"path":397,"stem":398,"icon":184},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F16.queue\u002F2.tasks",{"title":400,"icon":401,"path":402,"stem":403,"children":404,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F17.storage",[405,408,412,416,421],{"title":52,"path":406,"stem":407,"icon":401},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F17.storage\u002F1.overview",{"title":409,"path":410,"stem":411,"icon":401},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F17.storage\u002F2.disk-api",{"title":413,"path":414,"stem":415,"icon":401},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F17.storage\u002F3.local",{"title":417,"path":418,"stem":419,"icon":420},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F17.storage\u002F4.s3","i-lucide-cloud",{"title":422,"path":423,"stem":424,"icon":425},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F17.storage\u002F5.testing","i-lucide-flask-conical",{"title":427,"icon":428,"path":429,"stem":430,"children":431,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F18.telemetry",[432,435,439,444],{"title":52,"path":433,"stem":434,"icon":428},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F18.telemetry\u002F1.overview",{"title":436,"path":437,"stem":438,"icon":329},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F18.telemetry\u002F2.logging",{"title":440,"path":441,"stem":442,"icon":443},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F18.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":445,"path":446,"stem":447,"icon":448},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F18.telemetry\u002F4.sentry","i-lucide-bug",{"id":450,"title":154,"body":451,"description":1716,"extension":1717,"links":1718,"meta":1719,"navigation":1720,"path":155,"seo":1721,"stem":156,"__hash__":1722},"docs_hu\u002Fhu\u002F03.framework\u002F7.social-login.md",{"type":452,"value":453,"toc":1703},"minimark",[454,472,509,557,580,585,620,638,642,745,880,885,949,953,1053,1057,1067,1169,1182,1222,1225,1298,1302,1316,1328,1524,1568,1609,1613,1663,1667,1699],[455,456,457,458,462,463,466,467,471],"p",{},"Add meg a ",[459,460,461],"code",{},"--social"," flaget az ",[459,464,465],{},"add auth","-nak (lásd a ",[468,469,470],"a",{"href":53},"CLI áttekintőt","), ha a usereknek egy külső identity provideren keresztül is be kell tudniuk lépni, az email+jelszó mellett vagy helyett. Ez az oldal azt írja le, mi generálódik, és hogyan köss be egy providert a négy beépítettön túl.",[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 tool gpsystem add auth --social discord,facebook,apple,google\n","sh","",[459,480,481],{"__ignoreMap":478},[482,483,486,490,494,497,500,503,506],"span",{"class":484,"line":485},"line",1,[482,487,489],{"class":488},"sBMFI","go",[482,491,493],{"class":492},"sfazB"," tool",[482,495,496],{"class":492}," gpsystem",[482,498,499],{"class":492}," add",[482,501,502],{"class":492}," auth",[482,504,505],{"class":492}," --social",[482,507,508],{"class":492}," discord,facebook,apple,google\n",[455,510,511,512,514,515,517,518,522,523,529,530,533,534,537,538,541,542,545,546,548,549,552,553,556],{},"Az ",[459,513,465],{}," (lásd a ",[468,516,470],{"href":53},") mindig generál egy ",[519,520,521],"strong",{},"provider-agnosztikus social login réteget"," a modulba: egy ",[468,524,528],{"href":525,"rel":526},"https:\u002F\u002Fgithub.com\u002Fmarkbates\u002Fgoth",[527],"nofollow","markbates\u002Fgoth","-ra épülő providerregisztert, két végpontot (",[459,531,532],{},"GET \u002Fsocial\u002F{provider}"," és ",[459,535,536],{},"GET","\u002F",[459,539,540],{},"POST \u002Fsocial\u002F{provider}\u002Fcallback","), és egy ",[459,543,544],{},"LoginWithProvider"," service-metódust, ami ugyanazt a token-kibocsátást használja, mint az email+jelszavas login. A ",[459,547,461],{}," flag csak azt dönti el, mely négy ismert providert (Discord, Facebook, Apple, Google) vezeti be előre konfigurálva; bármelyik másik goth-provider (vagy egy kézzel írt ",[459,550,551],{},"goth.Provider",") egy sornyi kézi hozzáadás a generált ",[459,554,555],{},"social\u002Fproviders.go","-ban.",[558,559,560,561,564,565,568,569,571,572,575,576,579],"note",{},"A ",[519,562,563],{},"goth a generált projekt függősége",", nem a frameworké: a framework ",[459,566,567],{},"auth\u002F"," csomagja szándékosan stateless (csak JWT sign\u002Fparse + middleware), a ",[459,570,461],{},"-lal bekapcsolt kód a projekt saját ",[459,573,574],{},"go.mod","-jába kerül (",[459,577,578],{},"go mod tidy"," húzza be). Ez a döntés a research alapján született: a framework egy modul, és egy OAuth-könyvtárnak nincs helye benne, ha a generált auth modul amúgy is a projektben él (bcrypt, refresh-rotáció, email-flow-k, mind ott).",[581,582,584],"h2",{"id":583},"miért-ez-az-architektúra","Miért ez az architektúra",[455,586,560,587,537,590,593,594,597,598,601,602,605,606,609,610,537,613,616,617,619],{},[459,588,589],{},"users",[459,591,592],{},"auth_credentials"," séma már az első naptól multi-providerre készült: az ",[459,595,596],{},"auth_credentials.provider"," + ",[459,599,600],{},"provider_key"," pár (",[459,603,604],{},"UNIQUE (user_id, provider)",") egy ",[459,607,608],{},"local"," (bcrypt hash) sort tárol email+jelszavas regisztrációnál, egy social login ugyanide egy ",[459,611,612],{},"discord",[459,614,615],{},"google","\u002F... sort ír a provider stabil külső user-id-jával. A ",[459,618,544],{}," erre a sémára épül: nincs külön \"social user\" tábla, egy user több providerrel is beléphet.",[455,621,622,623,626,627,630,631,634,635,637],{},"A generált strict-server réteg (TypeSpec → OpenAPI → oapi-codegen) miatt a handler-metódusok szignatúrája ",[459,624,625],{},"func(ctx context.Context, req ...) (Resp, error)",": nincs közvetlen hozzáférés a ",[459,628,629],{},"net\u002Fhttp"," kéréshez, tehát cookie-t sem lehetne kényelmesen beállítani a begin és a callback között. Emiatt a state-paraméter ",[519,632,633],{},"önmagát ellenőrző, aláírt token"," (lásd lejjebb), nem szerveroldali session: a folyamat így teljesen stateless marad, ugyanabban a szellemben, mint a framework ",[459,636,567],{}," csomagja.",[581,639,641],{"id":640},"a-login-flow","A login-flow",[473,643,647],{"className":644,"code":645,"language":646,"meta":478,"style":478},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sequenceDiagram\n    participant B as Böngésző\n    participant A as API (generált auth modul)\n    participant P as Provider (pl. Discord)\n\n    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\n    A->>A: aláírt state generálása (HMAC, JWT_SECRET-tel)\n    A-->>B: 302 Location: provider consent URL (state=...)\n    B->>P: consent screen\n    P-->>B: redirect \u002Fcallback?code=...&state=...\n    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\u002Fcallback\n    A->>A: state ellenőrzése, code becserélése access tokenre\n    A->>P: GET \u002Fusers\u002F@me (Bearer access token)\n    P-->>A: profil (email, name, avatar, user id)\n    A->>A: find-or-create\u002Flink + IssueTokens\n    A-->>B: 200 TokenPair (accessToken, refreshToken, user)\n","mermaid",[459,648,649,654,660,666,672,679,685,691,697,703,709,715,721,727,733,739],{"__ignoreMap":478},[482,650,651],{"class":484,"line":485},[482,652,653],{},"sequenceDiagram\n",[482,655,657],{"class":484,"line":656},2,[482,658,659],{},"    participant B as Böngésző\n",[482,661,663],{"class":484,"line":662},3,[482,664,665],{},"    participant A as API (generált auth modul)\n",[482,667,669],{"class":484,"line":668},4,[482,670,671],{},"    participant P as Provider (pl. Discord)\n",[482,673,675],{"class":484,"line":674},5,[482,676,678],{"emptyLinePlaceholder":677},true,"\n",[482,680,682],{"class":484,"line":681},6,[482,683,684],{},"    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\n",[482,686,688],{"class":484,"line":687},7,[482,689,690],{},"    A->>A: aláírt state generálása (HMAC, JWT_SECRET-tel)\n",[482,692,694],{"class":484,"line":693},8,[482,695,696],{},"    A-->>B: 302 Location: provider consent URL (state=...)\n",[482,698,700],{"class":484,"line":699},9,[482,701,702],{},"    B->>P: consent screen\n",[482,704,706],{"class":484,"line":705},10,[482,707,708],{},"    P-->>B: redirect \u002Fcallback?code=...&state=...\n",[482,710,712],{"class":484,"line":711},11,[482,713,714],{},"    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\u002Fcallback\n",[482,716,718],{"class":484,"line":717},12,[482,719,720],{},"    A->>A: state ellenőrzése, code becserélése access tokenre\n",[482,722,724],{"class":484,"line":723},13,[482,725,726],{},"    A->>P: GET \u002Fusers\u002F@me (Bearer access token)\n",[482,728,730],{"class":484,"line":729},14,[482,731,732],{},"    P-->>A: profil (email, name, avatar, user id)\n",[482,734,736],{"class":484,"line":735},15,[482,737,738],{},"    A->>A: find-or-create\u002Flink + IssueTokens\n",[482,740,742],{"class":484,"line":741},16,[482,743,744],{},"    A-->>B: 200 TokenPair (accessToken, refreshToken, user)\n",[746,747,748,774,780,834,866],"ol",{},[749,750,751,754,755,758,759,762,763,766,767,597,770,773],"li",{},[519,752,753],{},"Begin."," ",[459,756,757],{},"GET \u002Fapi\u002Fv1\u002F{module}\u002Fsocial\u002F{provider}"," a providerhez tartozó goth-klienssel felépíti a consent URL-t, egy aláírt ",[459,760,761],{},"state"," paraméterrel, és ",[459,764,765],{},"302","-vel oda irányítja a böngészőt (",[459,768,769],{},"gen.SocialBegin302Response",[459,771,772],{},"Location"," header).",[749,775,776,779],{},[519,777,778],{},"Consent."," A felhasználó a provider oldalán jóváhagyja a hozzáférést.",[749,781,782,785,786,789,790],{},[519,783,784],{},"Callback."," A provider visszairányít a ",[459,787,788],{},"\u002Fsocial\u002F{provider}\u002Fcallback"," végpontra:\n",[791,792,793,811],"ul",{},[749,794,795,796,799,800,803,804,806,807,810],{},"a legtöbb provider (Discord, Google, Facebook) ",[519,797,798],{},"query-stringben"," (",[459,801,802],{},"?code=...&state=...",") → ",[459,805,536],{},", ",[459,808,809],{},"SocialCallbackQuery",",",[749,812,813,814,817,818,821,822,806,825,828,829,833],{},"Apple ",[519,815,816],{},"form_post","-ban (",[459,819,820],{},"application\u002Fx-www-form-urlencoded"," body) → ",[459,823,824],{},"POST",[459,826,827],{},"SocialCallbackForm"," (lásd ",[468,830,832],{"href":831},"#apple-specifikumok","Apple-specifikumok",").",[749,835,836,837,839,840,842,843,846,847,850,851,806,854,806,857,806,860,806,863,833],{},"A handler ellenőrzi a ",[459,838,761],{},"-et, becseréli a ",[459,841,459],{},"-ot access tokenre, lekéri a provider profilját, és ",[459,844,845],{},"goth.User","-ből normalizált ",[459,848,849],{},"social.ExternalUser","-t épít (",[459,852,853],{},"Provider",[459,855,856],{},"ProviderKey",[459,858,859],{},"Email",[459,861,862],{},"Name",[459,864,865],{},"AvatarURL",[749,867,868,869,871,872,875,876,879],{},"A service ",[459,870,544],{},"-je find-or-create\u002Flink logikát futtat (lásd lent), majd a modul gyökércsomagjának meglévő ",[459,873,874],{},"auth.Service.IssueTokens","-ét hívja: ugyanaz a JWT\u002Frefresh-pár jön ki, mint email+jelszavas loginnál, az ",[459,877,878],{},"rbac","\u002Fmiddleware réteg érintetlen marad.",[881,882,884],"h3",{"id":883},"account-linking-szabály","Account-linking szabály",[791,886,887,906,912,922,932],{},[749,888,889,799,892,597,895,898,899,901,902,905],{},[519,890,891],{},"Már ismert provider-identitás",[459,893,894],{},"provider",[459,896,897],{},"providerKey"," egyezik egy meglévő ",[459,900,592],{}," sorral): egyenes bejelentkezés, ",[459,903,904],{},"IssueTokens"," a meglévő userre.",[749,907,908,911],{},[519,909,910],{},"Első social login erre az identitásra, de az email egy meglévő, verifikált userhez tartozik",": az új provider-credential hozzálinkelődik a meglévő userhez (a user innentől email+jelszóval és a social providerrel is bejelentkezhet).",[749,913,914,917,918,921],{},[519,915,916],{},"Az email egy meglévő, DE nem verifikált userhez tartozik",": elutasítva (",[459,919,920],{},"409 Conflict","). Egy nem verifikált email nem bizonyítja a tulajdonjogot; automatikus linkelés itt lehetővé tenné, hogy egy támadó ugyanazzal az email-string-gel regisztrált social accounttal átvegye az áldozat még nem verifikált local regisztrációját.",[749,923,924,927,928,931],{},[519,925,926],{},"Az email egyáltalán nem ismert",": új, ",[519,929,930],{},"előre verifikált"," user jön létre (a provider már igazolta az email-birtoklást, ezt a framework elfogadja).",[749,933,934,799,937,940,941,944,945,948],{},[519,935,936],{},"A provider nem ad vissza emailt",[459,938,939],{},"SocialEmailRequired"," hiba, ",[459,942,943],{},"422","): a framework megköveteli az emailt, mert a ",[459,946,947],{},"users.email"," az account kulcsa. Emiatt minden beépített provider-regisztráció explicit email-scope-ot kér (lásd lent).",[581,950,952],{"id":951},"a-négy-beépített-provider","A négy beépített provider",[954,955,956,974],"table",{},[957,958,959],"thead",{},[960,961,962,965,968,971],"tr",{},[963,964,853],"th",{},[963,966,967],{},"goth csomag",[963,969,970],{},"Alap scope-ok",[963,972,973],{},"Callback",[975,976,977,999,1015,1034],"tbody",{},[960,978,979,983,988,996],{},[980,981,982],"td",{},"Discord",[980,984,985],{},[459,986,987],{},"providers\u002Fdiscord",[980,989,990,806,993],{},[459,991,992],{},"identify",[459,994,995],{},"email",[980,997,998],{},"GET (query)",[960,1000,1001,1004,1009,1013],{},[980,1002,1003],{},"Facebook",[980,1005,1006],{},[459,1007,1008],{},"providers\u002Ffacebook",[980,1010,1011],{},[459,1012,995],{},[980,1014,998],{},[960,1016,1017,1020,1025,1032],{},[980,1018,1019],{},"Google",[980,1021,1022],{},[459,1023,1024],{},"providers\u002Fgoogle",[980,1026,1027,806,1029],{},[459,1028,995],{},[459,1030,1031],{},"profile",[980,1033,998],{},[960,1035,1036,1039,1044,1048],{},[980,1037,1038],{},"Apple",[980,1040,1041],{},[459,1042,1043],{},"providers\u002Fapple",[980,1045,1046],{},[459,1047,995],{},[980,1049,1050],{},[519,1051,1052],{},"POST (form_post)",[881,1054,1056],{"id":1055},"provider-oldali-beállítás-és-env-változók","Provider-oldali beállítás és env-változók",[455,1058,1059,1060,1063,1064,833],{},"Minden nem-Apple providernél egy OAuth2 app kell a providernél, a redirect\u002Fcallback URL-lel ",[459,1061,1062],{},"{APP_BASE_URL}\u002Fapi\u002Fv1\u002F{module}\u002Fsocial\u002F{provider}\u002Fcallback"," (pl. ",[459,1065,1066],{},"https:\u002F\u002Fapp.example.com\u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\u002Fcallback",[954,1068,1069,1081],{},[957,1070,1071],{},[960,1072,1073,1075,1078],{},[963,1074,853],{},[963,1076,1077],{},"Env-változók",[963,1079,1080],{},"Hol szerzed be",[975,1082,1083,1103,1123,1143],{},[960,1084,1085,1087,1095],{},[980,1086,982],{},[980,1088,1089,806,1092],{},[459,1090,1091],{},"OAUTH_DISCORD_CLIENT_ID",[459,1093,1094],{},"OAUTH_DISCORD_CLIENT_SECRET",[980,1096,1097,1102],{},[468,1098,1101],{"href":1099,"rel":1100},"https:\u002F\u002Fdiscord.com\u002Fdevelopers\u002Fapplications",[527],"Discord Developer Portal",", OAuth2 fül",[960,1104,1105,1107,1115],{},[980,1106,1003],{},[980,1108,1109,806,1112],{},[459,1110,1111],{},"OAUTH_FACEBOOK_CLIENT_ID",[459,1113,1114],{},"OAUTH_FACEBOOK_CLIENT_SECRET",[980,1116,1117,1122],{},[468,1118,1121],{"href":1119,"rel":1120},"https:\u002F\u002Fdevelopers.facebook.com\u002F",[527],"Meta for Developers",", Facebook Login termék",[960,1124,1125,1127,1135],{},[980,1126,1019],{},[980,1128,1129,806,1132],{},[459,1130,1131],{},"OAUTH_GOOGLE_CLIENT_ID",[459,1133,1134],{},"OAUTH_GOOGLE_CLIENT_SECRET",[980,1136,1137,1142],{},[468,1138,1141],{"href":1139,"rel":1140},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials",[527],"Google Cloud Console",", OAuth 2.0 Client ID",[960,1144,1145,1147,1161],{},[980,1146,1038],{},[980,1148,1149,806,1152,806,1155,806,1158],{},[459,1150,1151],{},"OAUTH_APPLE_CLIENT_ID",[459,1153,1154],{},"OAUTH_APPLE_TEAM_ID",[459,1156,1157],{},"OAUTH_APPLE_KEY_ID",[459,1159,1160],{},"OAUTH_APPLE_PRIVATE_KEY",[980,1162,1163,1168],{},[468,1164,1167],{"href":1165,"rel":1166},"https:\u002F\u002Fdeveloper.apple.com\u002Faccount\u002Fresources\u002F",[527],"Apple Developer",", Sign in with Apple + Keys",[455,1170,1171,1172,1175,1176,1178,1179,1181],{},"Ezek a változók csak akkor kötelezők (",[459,1173,1174],{},"env:\"...,required\"","), ha a megfelelő ",[459,1177,461],{}," flag szerepelt az ",[459,1180,465],{}," híváskor: a platform config csak a ténylegesen bekapcsolt providerek mezőit kapja meg.",[1183,1184,511,1185,1187,1188,1191,1192,1195,1196,1199,1200,1203,1204,799,1207,1210,1211,1214,1215,754,1218,1221],"warning",{},[459,1186,1160],{}," egy PKCS8 PEM privát kulcs (a \"Sign in with Apple\" kulcs letöltött ",[459,1189,1190],{},".p8"," fájljának tartalma). A generált ",[459,1193,1194],{},"providers.go"," ebből, a ",[459,1197,1198],{},"team id","-ból és a ",[459,1201,1202],{},"key id","-ból minden induláskor ",[519,1205,1206],{},"JWT-t gyárt",[459,1208,1209],{},"apple.MakeSecret","): Apple-nél ugyanis nincs statikus client secret, csak egy legfeljebb 6 hónapig érvényes, aláírt token. Ha a kulcs formátuma hibás, a ",[459,1212,1213],{},"RegisterProviders"," hibát ad, amit a generált ",[459,1216,1217],{},"Register{{Surface}}",[459,1219,1220],{},"panic","-kal jelez indításkor (szándékosan: ez konfigurációs hiba, nem futásidejű állapot).",[581,1223,832],{"id":1224},"apple-specifikumok",[791,1226,1227,1267,1285],{},[749,1228,1229,1232,1233,537,1235,1238,1239,1242,1243,537,1245,1247,1248,1250,1251,1253,1254,1256,1257,1259,1260,1262,1263,1266],{},[519,1230,1231],{},"form_post callback."," Az ",[459,1234,995],{},[459,1236,1237],{},"name"," scope kérése Apple-nél automatikusan ",[459,1240,1241],{},"response_mode=form_post","-ot kapcsol be a goth-ban: Apple a ",[459,1244,459],{},[459,1246,761],{}," párost ",[459,1249,820],{}," body-val ",[519,1252,824],{},"-olja a callback URL-re, nem query-stringben. Ezért van külön ",[459,1255,540],{}," végpont (",[459,1258,827],{},") a szokásos ",[459,1261,536],{},"-es mellett; mindkettő ugyanazt a ",[459,1264,1265],{},"social.Registry.Complete","-et hívja.",[749,1268,1269,1272,1273,1276,1277,1280,1281,1284],{},[519,1270,1271],{},"Első consent."," Apple csak az ",[519,1274,1275],{},"első"," jóváhagyáskor küldi el a nevet (egy ",[459,1278,1279],{},"user"," mezőben, JSON-ként), ismételt bejelentkezésnél csak a ",[459,1282,1283],{},"sub"," (stabil user id) és (ha engedélyezett) az email jön. A generált kód emiatt a névre fallbackként az emailt használja, ha a profil nem ad nevet.",[749,1286,1287,1290,1291,1293,1294,1297],{},[519,1288,1289],{},"Privát relé email."," Ha a felhasználó az \"Anonymize My Email\" opciót választja, az ",[459,1292,859],{}," egy Apple-generált ",[459,1295,1296],{},"@privaterelay.appleid.com"," cím lesz, ami stabil marad ugyanahhoz a userhez, de nem a valós címe.",[581,1299,1301],{"id":1300},"kézi-provider-hozzáadása","Kézi provider hozzáadása",[455,1303,1304,1305,1308,1309,1311,1312,1315],{},"A generikus réteg (",[459,1306,1307],{},"internal\u002Fmodules\u002F{module}\u002Fsocial\u002Fsocial.go",") nem változik: minden bővítés a ",[459,1310,1194],{},"-ban, a ",[459,1313,1314],{},"\u002F\u002F gpsystem:social-providers"," jelölő alatt történik.",[455,1317,1318,1321,1322,1327],{},[519,1319,1320],{},"Egy másik goth-provider"," (a ",[468,1323,1326],{"href":1324,"rel":1325},"https:\u002F\u002Fgithub.com\u002Fmarkbates\u002Fgoth\u002Ftree\u002Fmaster\u002Fproviders",[527],"~60 beépített"," közül, pl. GitLab):",[473,1329,1332],{"className":1330,"code":1331,"language":489,"meta":478,"style":478},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F providers.go\nimport \"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fgitlab\"\n\nfunc RegisterProviders(reg *Registry, cfg Config) error {\n    \u002F\u002F gpsystem:social-providers\n    if cfg.GitLab.ClientID != \"\" {\n        reg.Register(\"gitlab\", gitlab.New(cfg.GitLab.ClientID, cfg.GitLab.ClientSecret, callbackURL(cfg, \"gitlab\")))\n    }\n    \u002F\u002F ...\n}\n",[459,1333,1334,1340,1356,1360,1400,1405,1432,1509,1514,1519],{"__ignoreMap":478},[482,1335,1336],{"class":484,"line":485},[482,1337,1339],{"class":1338},"sHwdD","\u002F\u002F providers.go\n",[482,1341,1342,1346,1350,1353],{"class":484,"line":656},[482,1343,1345],{"class":1344},"s7zQu","import",[482,1347,1349],{"class":1348},"sMK4o"," \"",[482,1351,1352],{"class":488},"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fgitlab",[482,1354,1355],{"class":1348},"\"\n",[482,1357,1358],{"class":484,"line":662},[482,1359,678],{"emptyLinePlaceholder":677},[482,1361,1362,1365,1369,1372,1376,1379,1382,1384,1387,1390,1393,1397],{"class":484,"line":668},[482,1363,1364],{"class":1348},"func",[482,1366,1368],{"class":1367},"s2Zo4"," RegisterProviders",[482,1370,1371],{"class":1348},"(",[482,1373,1375],{"class":1374},"sHdIc","reg",[482,1377,1378],{"class":1348}," *",[482,1380,1381],{"class":488},"Registry",[482,1383,810],{"class":1348},[482,1385,1386],{"class":1374}," cfg",[482,1388,1389],{"class":488}," Config",[482,1391,1392],{"class":1348},")",[482,1394,1396],{"class":1395},"spNyl"," error",[482,1398,1399],{"class":1348}," {\n",[482,1401,1402],{"class":484,"line":674},[482,1403,1404],{"class":1338},"    \u002F\u002F gpsystem:social-providers\n",[482,1406,1407,1410,1413,1416,1419,1421,1424,1427,1430],{"class":484,"line":681},[482,1408,1409],{"class":1344},"    if",[482,1411,1386],{"class":1412},"sTEyZ",[482,1414,1415],{"class":1348},".",[482,1417,1418],{"class":1412},"GitLab",[482,1420,1415],{"class":1348},[482,1422,1423],{"class":1412},"ClientID ",[482,1425,1426],{"class":1348},"!=",[482,1428,1429],{"class":1348}," \"\"",[482,1431,1399],{"class":1348},[482,1433,1434,1437,1439,1442,1444,1447,1450,1452,1454,1457,1459,1462,1464,1467,1469,1471,1473,1476,1478,1480,1482,1484,1486,1489,1491,1494,1496,1498,1500,1502,1504,1506],{"class":484,"line":687},[482,1435,1436],{"class":1412},"        reg",[482,1438,1415],{"class":1348},[482,1440,1441],{"class":1367},"Register",[482,1443,1371],{"class":1348},[482,1445,1446],{"class":1348},"\"",[482,1448,1449],{"class":492},"gitlab",[482,1451,1446],{"class":1348},[482,1453,810],{"class":1348},[482,1455,1456],{"class":1412}," gitlab",[482,1458,1415],{"class":1348},[482,1460,1461],{"class":1367},"New",[482,1463,1371],{"class":1348},[482,1465,1466],{"class":1412},"cfg",[482,1468,1415],{"class":1348},[482,1470,1418],{"class":1412},[482,1472,1415],{"class":1348},[482,1474,1475],{"class":1412},"ClientID",[482,1477,810],{"class":1348},[482,1479,1386],{"class":1412},[482,1481,1415],{"class":1348},[482,1483,1418],{"class":1412},[482,1485,1415],{"class":1348},[482,1487,1488],{"class":1412},"ClientSecret",[482,1490,810],{"class":1348},[482,1492,1493],{"class":1367}," callbackURL",[482,1495,1371],{"class":1348},[482,1497,1466],{"class":1412},[482,1499,810],{"class":1348},[482,1501,1349],{"class":1348},[482,1503,1449],{"class":492},[482,1505,1446],{"class":1348},[482,1507,1508],{"class":1348},")))\n",[482,1510,1511],{"class":484,"line":693},[482,1512,1513],{"class":1348},"    }\n",[482,1515,1516],{"class":484,"line":699},[482,1517,1518],{"class":1338},"    \u002F\u002F ...\n",[482,1520,1521],{"class":484,"line":705},[482,1522,1523],{"class":1348},"}\n",[455,1525,1526,1527,1530,1531,605,1534,1537,1538,806,1540,1543,1544,537,1547,1550,1551,1554,1555,1558,1559,754,1561,1564,1565,1567],{},"Ehhez a ",[459,1528,1529],{},"Config","-ba (",[459,1532,1533],{},"config.go",[459,1535,1536],{},"GitLab ProviderConfig"," mezőt, a platform configba (",[459,1539,1533],{},[459,1541,1542],{},"\u002F\u002F gpsystem:config"," anchor) egy ",[459,1545,1546],{},"OAUTH_GITLAB_CLIENT_ID",[459,1548,1549],{},"_SECRET"," párt, a ",[459,1552,1553],{},"Dependencies","-be (",[459,1556,1557],{},"surfaces\u002Fregister.go",") és a ",[459,1560,1217],{},[459,1562,1563],{},"social.Config{...}"," literálba a megfelelő mezőket kell felvenni: pontosan ugyanazok a helyek, amiket a ",[459,1566,461],{}," flag a beépített négynél generál.",[455,1569,1570,1573,1574,1580,1581,806,1584,806,1587,806,1590,537,1592,806,1595,806,1598,537,1601,1604,1605,1608],{},[519,1571,1572],{},"Egy providernek, aminek nincs goth csomagja",": implementáld a ",[468,1575,1578],{"href":1576,"rel":1577},"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fmarkbates\u002Fgoth#Provider",[527],[459,1579,551],{}," interfészt (",[459,1582,1583],{},"BeginAuth",[459,1585,1586],{},"UnmarshalSession",[459,1588,1589],{},"FetchUser",[459,1591,862],{},[459,1593,1594],{},"SetName",[459,1596,1597],{},"Debug",[459,1599,1600],{},"RefreshToken",[459,1602,1603],{},"RefreshTokenAvailable",") egy saját típuson, majd ",[459,1606,1607],{},"reg.Register(\"name\", &MyProvider{...})"," ugyanígy.",[581,1610,1612],{"id":1611},"hibakeresés","Hibakeresés",[791,1614,1615,1630,1644,1654],{},[749,1616,1617,1622,1623,1626,1627,1629],{},[519,1618,1619],{},[459,1620,1621],{},"404 unknown social provider",": a ",[459,1624,1625],{},"{provider}"," path-szegmens nincs regisztrálva (se ",[459,1628,461],{},"-lal, se kézzel), vagy elgépelted a nevet.",[749,1631,1632,1622,1637,1639,1640,1643],{},[519,1633,1634],{},[459,1635,1636],{},"401 social login failed",[459,1638,761],{}," érvénytelen (lejárt, 10 percnél régebbi, vagy nem erre a providerre szólt) vagy a code-csere hibázott a providernél (leggyakrabban: eltérő redirect URI a providernél és az ",[459,1641,1642],{},"APP_BASE_URL","-ből számoltnál).",[749,1645,1646,1653],{},[519,1647,1648,1650,1651],{},[459,1649,943],{}," a callbacknél, ",[459,1652,939],{},": a provider nem adott vissza emailt, ellenőrizd, hogy a scope-ok között szerepel-e az email (a beépített négynél alapból igen).",[749,1655,1656,1660,1661,833],{},[519,1657,1658],{},[459,1659,920],{},": az email egy meglévő, de nem verifikált userhez tartozik; a felhasználónak előbb a saját email+jelszavas regisztrációját kell verifikálnia (lásd ",[468,1662,211],{"href":212},[581,1664,1666],{"id":1665},"kapcsolódó-oldalak","Kapcsolódó oldalak",[791,1668,1669,1677,1686],{},[749,1670,1671,1673,1674,1676],{},[468,1672,211],{"href":212},": a framework ",[459,1675,567],{}," csomagja, JWT-kibocsátás, middleware.",[749,1678,1679,1681,1682,1685],{},[468,1680,216],{"href":217},": a tokenből lett ",[459,1683,1684],{},"Identity"," fölötti szerep-\u002Fpermission-ellenőrzés, változatlan social loginnál is.",[749,1687,1688,1690,1691,1694,1695,1698],{},[468,1689,165],{"href":166},": a framework saját, ",[459,1692,1693],{},"envPrefix","-fel komponálható configjai (az ",[459,1696,1697],{},"OAUTH_*"," változók a generált projekt saját configja, nem itt élnek).",[1700,1701,1702],"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 .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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":478,"searchDepth":656,"depth":656,"links":1704},[1705,1706,1709,1712,1713,1714,1715],{"id":583,"depth":656,"text":584},{"id":640,"depth":656,"text":641,"children":1707},[1708],{"id":883,"depth":662,"text":884},{"id":951,"depth":656,"text":952,"children":1710},[1711],{"id":1055,"depth":662,"text":1056},{"id":1224,"depth":656,"text":832},{"id":1300,"depth":656,"text":1301},{"id":1611,"depth":656,"text":1612},{"id":1665,"depth":656,"text":1666},"Discord, Facebook, Apple, Google és bármely más OAuth2 provider bekötése az add auth modulba.","md",null,{},{"icon":157},{"title":154,"description":1716},"1qp-d1agMJkXFacZPQiI1wu9lzlEvdn_vhAuQTGazNI",[1724,1726],{"title":149,"path":150,"stem":151,"description":1725,"icon":152,"children":-1},"Időbélyeg-prefixes SQL-fájlok a binárisba ágyazva, saját cmd\u002Fmigrate futtatóval, külső tool nélkül.",{"title":165,"path":166,"stem":167,"description":1727,"icon":168,"children":-1},"Minden modul Config structjának minden környezeti változója, modulonként csoportosítva.",1787346804823]