[{"data":1,"prerenderedAt":1721},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-kit-social-login":442,"-hu-kit-social-login-surround":1716},[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":277,"body":444,"description":1709,"extension":1710,"links":1711,"meta":1712,"navigation":1713,"path":278,"seo":1714,"stem":279,"__hash__":1715},"docs_hu\u002Fhu\u002F3.kit\u002F7.social-login.md",{"type":445,"value":446,"toc":1696},"minimark",[447,465,502,550,573,578,613,631,635,738,873,878,942,946,1046,1050,1060,1162,1175,1215,1218,1291,1295,1309,1321,1517,1561,1602,1606,1656,1660,1692],[448,449,450,451,455,456,459,460,464],"p",{},"Add meg a ",[452,453,454],"code",{},"--social"," flaget az ",[452,457,458],{},"add auth","-nak (lásd a ",[461,462,463],"a",{"href":287},"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.",[466,467,472],"pre",{"className":468,"code":469,"language":470,"meta":471,"style":471},"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","",[452,473,474],{"__ignoreMap":471},[475,476,479,483,487,490,493,496,499],"span",{"class":477,"line":478},"line",1,[475,480,482],{"class":481},"sBMFI","go",[475,484,486],{"class":485},"sfazB"," tool",[475,488,489],{"class":485}," gpsystem",[475,491,492],{"class":485}," add",[475,494,495],{"class":485}," auth",[475,497,498],{"class":485}," --social",[475,500,501],{"class":485}," discord,facebook,apple,google\n",[448,503,504,505,507,508,510,511,515,516,522,523,526,527,530,531,534,535,538,539,541,542,545,546,549],{},"Az ",[452,506,458],{}," (lásd a ",[461,509,463],{"href":287},") mindig generál egy ",[512,513,514],"strong",{},"provider-agnosztikus social login réteget"," a modulba: egy ",[461,517,521],{"href":518,"rel":519},"https:\u002F\u002Fgithub.com\u002Fmarkbates\u002Fgoth",[520],"nofollow","markbates\u002Fgoth","-ra épülő providerregisztert, két végpontot (",[452,524,525],{},"GET \u002Fsocial\u002F{provider}"," és ",[452,528,529],{},"GET","\u002F",[452,532,533],{},"POST \u002Fsocial\u002F{provider}\u002Fcallback","), és egy ",[452,536,537],{},"LoginWithProvider"," service-metódust, ami ugyanazt a token-kibocsátást használja, mint az email+jelszavas login. A ",[452,540,454],{}," 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 ",[452,543,544],{},"goth.Provider",") egy sornyi kézi hozzáadás a generált ",[452,547,548],{},"social\u002Fproviders.go","-ban.",[551,552,553,554,557,558,561,562,564,565,568,569,572],"note",{},"A ",[512,555,556],{},"goth a generált projekt függősége",", nem a kité: a kit ",[452,559,560],{},"auth\u002F"," csomagja szándékosan stateless (csak JWT sign\u002Fparse + middleware), a ",[452,563,454],{},"-lal bekapcsolt kód a projekt saját ",[452,566,567],{},"go.mod","-jába kerül (",[452,570,571],{},"go mod tidy"," húzza be). Ez a döntés a research alapján született: a kit 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).",[574,575,577],"h2",{"id":576},"miért-ez-az-architektúra","Miért ez az architektúra",[448,579,553,580,530,583,586,587,590,591,594,595,598,599,602,603,530,606,609,610,612],{},[452,581,582],{},"users",[452,584,585],{},"auth_credentials"," séma már az első naptól multi-providerre készült: az ",[452,588,589],{},"auth_credentials.provider"," + ",[452,592,593],{},"provider_key"," pár (",[452,596,597],{},"UNIQUE (user_id, provider)",") egy ",[452,600,601],{},"local"," (bcrypt hash) sort tárol email+jelszavas regisztrációnál, egy social login ugyanide egy ",[452,604,605],{},"discord",[452,607,608],{},"google","\u002F... sort ír a provider stabil külső user-id-jával. A ",[452,611,537],{}," erre a sémára épül: nincs külön \"social user\" tábla, egy user több providerrel is beléphet.",[448,614,615,616,619,620,623,624,627,628,630],{},"A generált strict-server réteg (TypeSpec → OpenAPI → oapi-codegen) miatt a handler-metódusok szignatúrája ",[452,617,618],{},"func(ctx context.Context, req ...) (Resp, error)",": nincs közvetlen hozzáférés a ",[452,621,622],{},"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 ",[512,625,626],{},"önmagát ellenőrző, aláírt token"," (lásd lejjebb), nem szerveroldali session: a folyamat így teljesen stateless marad, ugyanabban a szellemben, mint a kit ",[452,629,560],{}," csomagja.",[574,632,634],{"id":633},"a-login-flow","A login-flow",[466,636,640],{"className":637,"code":638,"language":639,"meta":471,"style":471},"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",[452,641,642,647,653,659,665,672,678,684,690,696,702,708,714,720,726,732],{"__ignoreMap":471},[475,643,644],{"class":477,"line":478},[475,645,646],{},"sequenceDiagram\n",[475,648,650],{"class":477,"line":649},2,[475,651,652],{},"    participant B as Böngésző\n",[475,654,656],{"class":477,"line":655},3,[475,657,658],{},"    participant A as API (generált auth modul)\n",[475,660,662],{"class":477,"line":661},4,[475,663,664],{},"    participant P as Provider (pl. Discord)\n",[475,666,668],{"class":477,"line":667},5,[475,669,671],{"emptyLinePlaceholder":670},true,"\n",[475,673,675],{"class":477,"line":674},6,[475,676,677],{},"    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\n",[475,679,681],{"class":477,"line":680},7,[475,682,683],{},"    A->>A: aláírt state generálása (HMAC, JWT_SECRET-tel)\n",[475,685,687],{"class":477,"line":686},8,[475,688,689],{},"    A-->>B: 302 Location: provider consent URL (state=...)\n",[475,691,693],{"class":477,"line":692},9,[475,694,695],{},"    B->>P: consent screen\n",[475,697,699],{"class":477,"line":698},10,[475,700,701],{},"    P-->>B: redirect \u002Fcallback?code=...&state=...\n",[475,703,705],{"class":477,"line":704},11,[475,706,707],{},"    B->>A: GET \u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\u002Fcallback\n",[475,709,711],{"class":477,"line":710},12,[475,712,713],{},"    A->>A: state ellenőrzése, code becserélése access tokenre\n",[475,715,717],{"class":477,"line":716},13,[475,718,719],{},"    A->>P: GET \u002Fusers\u002F@me (Bearer access token)\n",[475,721,723],{"class":477,"line":722},14,[475,724,725],{},"    P-->>A: profil (email, name, avatar, user id)\n",[475,727,729],{"class":477,"line":728},15,[475,730,731],{},"    A->>A: find-or-create\u002Flink + IssueTokens\n",[475,733,735],{"class":477,"line":734},16,[475,736,737],{},"    A-->>B: 200 TokenPair (accessToken, refreshToken, user)\n",[739,740,741,767,773,827,859],"ol",{},[742,743,744,747,748,751,752,755,756,759,760,590,763,766],"li",{},[512,745,746],{},"Begin."," ",[452,749,750],{},"GET \u002Fapi\u002Fv1\u002F{module}\u002Fsocial\u002F{provider}"," a providerhez tartozó goth-klienssel felépíti a consent URL-t, egy aláírt ",[452,753,754],{},"state"," paraméterrel, és ",[452,757,758],{},"302","-vel oda irányítja a böngészőt (",[452,761,762],{},"gen.SocialBegin302Response",[452,764,765],{},"Location"," header).",[742,768,769,772],{},[512,770,771],{},"Consent."," A felhasználó a provider oldalán jóváhagyja a hozzáférést.",[742,774,775,778,779,782,783],{},[512,776,777],{},"Callback."," A provider visszairányít a ",[452,780,781],{},"\u002Fsocial\u002F{provider}\u002Fcallback"," végpontra:\n",[784,785,786,804],"ul",{},[742,787,788,789,792,793,796,797,799,800,803],{},"a legtöbb provider (Discord, Google, Facebook) ",[512,790,791],{},"query-stringben"," (",[452,794,795],{},"?code=...&state=...",") → ",[452,798,529],{},", ",[452,801,802],{},"SocialCallbackQuery",",",[742,805,806,807,810,811,814,815,799,818,821,822,826],{},"Apple ",[512,808,809],{},"form_post","-ban (",[452,812,813],{},"application\u002Fx-www-form-urlencoded"," body) → ",[452,816,817],{},"POST",[452,819,820],{},"SocialCallbackForm"," (lásd ",[461,823,825],{"href":824},"#apple-specifikumok","Apple-specifikumok",").",[742,828,829,830,832,833,835,836,839,840,843,844,799,847,799,850,799,853,799,856,826],{},"A handler ellenőrzi a ",[452,831,754],{},"-et, becseréli a ",[452,834,452],{},"-ot access tokenre, lekéri a provider profilját, és ",[452,837,838],{},"goth.User","-ből normalizált ",[452,841,842],{},"social.ExternalUser","-t épít (",[452,845,846],{},"Provider",[452,848,849],{},"ProviderKey",[452,851,852],{},"Email",[452,854,855],{},"Name",[452,857,858],{},"AvatarURL",[742,860,861,862,864,865,868,869,872],{},"A service ",[452,863,537],{},"-je find-or-create\u002Flink logikát futtat (lásd lent), majd a modul meglévő ",[452,866,867],{},"core.Service.IssueTokens","-ét hívja: ugyanaz a JWT\u002Frefresh-pár jön ki, mint email+jelszavas loginnál, az ",[452,870,871],{},"rbac","\u002Fmiddleware réteg érintetlen marad.",[874,875,877],"h3",{"id":876},"account-linking-szabály","Account-linking szabály",[784,879,880,899,905,915,925],{},[742,881,882,792,885,590,888,891,892,894,895,898],{},[512,883,884],{},"Már ismert provider-identitás",[452,886,887],{},"provider",[452,889,890],{},"providerKey"," egyezik egy meglévő ",[452,893,585],{}," sorral): egyenes bejelentkezés, ",[452,896,897],{},"IssueTokens"," a meglévő userre.",[742,900,901,904],{},[512,902,903],{},"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).",[742,906,907,910,911,914],{},[512,908,909],{},"Az email egy meglévő, DE nem verifikált userhez tartozik",": elutasítva (",[452,912,913],{},"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.",[742,916,917,920,921,924],{},[512,918,919],{},"Az email egyáltalán nem ismert",": új, ",[512,922,923],{},"előre verifikált"," user jön létre (a provider már igazolta az email-birtoklást, ezt a kit elfogadja).",[742,926,927,792,930,933,934,937,938,941],{},[512,928,929],{},"A provider nem ad vissza emailt",[452,931,932],{},"SocialEmailRequired"," hiba, ",[452,935,936],{},"422","): a kit megköveteli az emailt, mert a ",[452,939,940],{},"users.email"," az account kulcsa. Emiatt minden beépített provider-regisztráció explicit email-scope-ot kér (lásd lent).",[574,943,945],{"id":944},"a-négy-beépített-provider","A négy beépített provider",[947,948,949,967],"table",{},[950,951,952],"thead",{},[953,954,955,958,961,964],"tr",{},[956,957,846],"th",{},[956,959,960],{},"goth csomag",[956,962,963],{},"Alap scope-ok",[956,965,966],{},"Callback",[968,969,970,992,1008,1027],"tbody",{},[953,971,972,976,981,989],{},[973,974,975],"td",{},"Discord",[973,977,978],{},[452,979,980],{},"providers\u002Fdiscord",[973,982,983,799,986],{},[452,984,985],{},"identify",[452,987,988],{},"email",[973,990,991],{},"GET (query)",[953,993,994,997,1002,1006],{},[973,995,996],{},"Facebook",[973,998,999],{},[452,1000,1001],{},"providers\u002Ffacebook",[973,1003,1004],{},[452,1005,988],{},[973,1007,991],{},[953,1009,1010,1013,1018,1025],{},[973,1011,1012],{},"Google",[973,1014,1015],{},[452,1016,1017],{},"providers\u002Fgoogle",[973,1019,1020,799,1022],{},[452,1021,988],{},[452,1023,1024],{},"profile",[973,1026,991],{},[953,1028,1029,1032,1037,1041],{},[973,1030,1031],{},"Apple",[973,1033,1034],{},[452,1035,1036],{},"providers\u002Fapple",[973,1038,1039],{},[452,1040,988],{},[973,1042,1043],{},[512,1044,1045],{},"POST (form_post)",[874,1047,1049],{"id":1048},"provider-oldali-beállítás-és-env-változók","Provider-oldali beállítás és env-változók",[448,1051,1052,1053,1056,1057,826],{},"Minden nem-Apple providernél egy OAuth2 app kell a providernél, a redirect\u002Fcallback URL-lel ",[452,1054,1055],{},"{APP_BASE_URL}\u002Fapi\u002Fv1\u002F{module}\u002Fsocial\u002F{provider}\u002Fcallback"," (pl. ",[452,1058,1059],{},"https:\u002F\u002Fapp.example.com\u002Fapi\u002Fv1\u002Fauth\u002Fsocial\u002Fdiscord\u002Fcallback",[947,1061,1062,1074],{},[950,1063,1064],{},[953,1065,1066,1068,1071],{},[956,1067,846],{},[956,1069,1070],{},"Env-változók",[956,1072,1073],{},"Hol szerzed be",[968,1075,1076,1096,1116,1136],{},[953,1077,1078,1080,1088],{},[973,1079,975],{},[973,1081,1082,799,1085],{},[452,1083,1084],{},"OAUTH_DISCORD_CLIENT_ID",[452,1086,1087],{},"OAUTH_DISCORD_CLIENT_SECRET",[973,1089,1090,1095],{},[461,1091,1094],{"href":1092,"rel":1093},"https:\u002F\u002Fdiscord.com\u002Fdevelopers\u002Fapplications",[520],"Discord Developer Portal",", OAuth2 fül",[953,1097,1098,1100,1108],{},[973,1099,996],{},[973,1101,1102,799,1105],{},[452,1103,1104],{},"OAUTH_FACEBOOK_CLIENT_ID",[452,1106,1107],{},"OAUTH_FACEBOOK_CLIENT_SECRET",[973,1109,1110,1115],{},[461,1111,1114],{"href":1112,"rel":1113},"https:\u002F\u002Fdevelopers.facebook.com\u002F",[520],"Meta for Developers",", Facebook Login termék",[953,1117,1118,1120,1128],{},[973,1119,1012],{},[973,1121,1122,799,1125],{},[452,1123,1124],{},"OAUTH_GOOGLE_CLIENT_ID",[452,1126,1127],{},"OAUTH_GOOGLE_CLIENT_SECRET",[973,1129,1130,1135],{},[461,1131,1134],{"href":1132,"rel":1133},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials",[520],"Google Cloud Console",", OAuth 2.0 Client ID",[953,1137,1138,1140,1154],{},[973,1139,1031],{},[973,1141,1142,799,1145,799,1148,799,1151],{},[452,1143,1144],{},"OAUTH_APPLE_CLIENT_ID",[452,1146,1147],{},"OAUTH_APPLE_TEAM_ID",[452,1149,1150],{},"OAUTH_APPLE_KEY_ID",[452,1152,1153],{},"OAUTH_APPLE_PRIVATE_KEY",[973,1155,1156,1161],{},[461,1157,1160],{"href":1158,"rel":1159},"https:\u002F\u002Fdeveloper.apple.com\u002Faccount\u002Fresources\u002F",[520],"Apple Developer",", Sign in with Apple + Keys",[448,1163,1164,1165,1168,1169,1171,1172,1174],{},"Ezek a változók csak akkor kötelezők (",[452,1166,1167],{},"env:\"...,required\"","), ha a megfelelő ",[452,1170,454],{}," flag szerepelt az ",[452,1173,458],{}," híváskor: a platform config csak a ténylegesen bekapcsolt providerek mezőit kapja meg.",[1176,1177,504,1178,1180,1181,1184,1185,1188,1189,1192,1193,1196,1197,792,1200,1203,1204,1207,1208,747,1211,1214],"warning",{},[452,1179,1153],{}," egy PKCS8 PEM privát kulcs (a \"Sign in with Apple\" kulcs letöltött ",[452,1182,1183],{},".p8"," fájljának tartalma). A generált ",[452,1186,1187],{},"providers.go"," ebből, a ",[452,1190,1191],{},"team id","-ból és a ",[452,1194,1195],{},"key id","-ból minden induláskor ",[512,1198,1199],{},"JWT-t gyárt",[452,1201,1202],{},"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 ",[452,1205,1206],{},"RegisterProviders"," hibát ad, amit a generált ",[452,1209,1210],{},"Register{{Surface}}",[452,1212,1213],{},"panic","-kal jelez indításkor (szándékosan: ez konfigurációs hiba, nem futásidejű állapot).",[574,1216,825],{"id":1217},"apple-specifikumok",[784,1219,1220,1260,1278],{},[742,1221,1222,1225,1226,530,1228,1231,1232,1235,1236,530,1238,1240,1241,1243,1244,1246,1247,1249,1250,1252,1253,1255,1256,1259],{},[512,1223,1224],{},"form_post callback."," Az ",[452,1227,988],{},[452,1229,1230],{},"name"," scope kérése Apple-nél automatikusan ",[452,1233,1234],{},"response_mode=form_post","-ot kapcsol be a goth-ban: Apple a ",[452,1237,452],{},[452,1239,754],{}," párost ",[452,1242,813],{}," body-val ",[512,1245,817],{},"-olja a callback URL-re, nem query-stringben. Ezért van külön ",[452,1248,533],{}," végpont (",[452,1251,820],{},") a szokásos ",[452,1254,529],{},"-es mellett; mindkettő ugyanazt a ",[452,1257,1258],{},"social.Registry.Complete","-et hívja.",[742,1261,1262,1265,1266,1269,1270,1273,1274,1277],{},[512,1263,1264],{},"Első consent."," Apple csak az ",[512,1267,1268],{},"első"," jóváhagyáskor küldi el a nevet (egy ",[452,1271,1272],{},"user"," mezőben, JSON-ként), ismételt bejelentkezésnél csak a ",[452,1275,1276],{},"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.",[742,1279,1280,1283,1284,1286,1287,1290],{},[512,1281,1282],{},"Privát relé email."," Ha a felhasználó az \"Anonymize My Email\" opciót választja, az ",[452,1285,852],{}," egy Apple-generált ",[452,1288,1289],{},"@privaterelay.appleid.com"," cím lesz, ami stabil marad ugyanahhoz a userhez, de nem a valós címe.",[574,1292,1294],{"id":1293},"kézi-provider-hozzáadása","Kézi provider hozzáadása",[448,1296,1297,1298,1301,1302,1304,1305,1308],{},"A generikus réteg (",[452,1299,1300],{},"internal\u002Fmodules\u002F{module}\u002Fsocial\u002Fsocial.go",") nem változik: minden bővítés a ",[452,1303,1187],{},"-ban, a ",[452,1306,1307],{},"\u002F\u002F gpsystem:social-providers"," jelölő alatt történik.",[448,1310,1311,1314,1315,1320],{},[512,1312,1313],{},"Egy másik goth-provider"," (a ",[461,1316,1319],{"href":1317,"rel":1318},"https:\u002F\u002Fgithub.com\u002Fmarkbates\u002Fgoth\u002Ftree\u002Fmaster\u002Fproviders",[520],"~60 beépített"," közül, pl. GitLab):",[466,1322,1325],{"className":1323,"code":1324,"language":482,"meta":471,"style":471},"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",[452,1326,1327,1333,1349,1353,1393,1398,1425,1502,1507,1512],{"__ignoreMap":471},[475,1328,1329],{"class":477,"line":478},[475,1330,1332],{"class":1331},"sHwdD","\u002F\u002F providers.go\n",[475,1334,1335,1339,1343,1346],{"class":477,"line":649},[475,1336,1338],{"class":1337},"s7zQu","import",[475,1340,1342],{"class":1341},"sMK4o"," \"",[475,1344,1345],{"class":481},"github.com\u002Fmarkbates\u002Fgoth\u002Fproviders\u002Fgitlab",[475,1347,1348],{"class":1341},"\"\n",[475,1350,1351],{"class":477,"line":655},[475,1352,671],{"emptyLinePlaceholder":670},[475,1354,1355,1358,1362,1365,1369,1372,1375,1377,1380,1383,1386,1390],{"class":477,"line":661},[475,1356,1357],{"class":1341},"func",[475,1359,1361],{"class":1360},"s2Zo4"," RegisterProviders",[475,1363,1364],{"class":1341},"(",[475,1366,1368],{"class":1367},"sHdIc","reg",[475,1370,1371],{"class":1341}," *",[475,1373,1374],{"class":481},"Registry",[475,1376,803],{"class":1341},[475,1378,1379],{"class":1367}," cfg",[475,1381,1382],{"class":481}," Config",[475,1384,1385],{"class":1341},")",[475,1387,1389],{"class":1388},"spNyl"," error",[475,1391,1392],{"class":1341}," {\n",[475,1394,1395],{"class":477,"line":667},[475,1396,1397],{"class":1331},"    \u002F\u002F gpsystem:social-providers\n",[475,1399,1400,1403,1406,1409,1412,1414,1417,1420,1423],{"class":477,"line":674},[475,1401,1402],{"class":1337},"    if",[475,1404,1379],{"class":1405},"sTEyZ",[475,1407,1408],{"class":1341},".",[475,1410,1411],{"class":1405},"GitLab",[475,1413,1408],{"class":1341},[475,1415,1416],{"class":1405},"ClientID ",[475,1418,1419],{"class":1341},"!=",[475,1421,1422],{"class":1341}," \"\"",[475,1424,1392],{"class":1341},[475,1426,1427,1430,1432,1435,1437,1440,1443,1445,1447,1450,1452,1455,1457,1460,1462,1464,1466,1469,1471,1473,1475,1477,1479,1482,1484,1487,1489,1491,1493,1495,1497,1499],{"class":477,"line":680},[475,1428,1429],{"class":1405},"        reg",[475,1431,1408],{"class":1341},[475,1433,1434],{"class":1360},"Register",[475,1436,1364],{"class":1341},[475,1438,1439],{"class":1341},"\"",[475,1441,1442],{"class":485},"gitlab",[475,1444,1439],{"class":1341},[475,1446,803],{"class":1341},[475,1448,1449],{"class":1405}," gitlab",[475,1451,1408],{"class":1341},[475,1453,1454],{"class":1360},"New",[475,1456,1364],{"class":1341},[475,1458,1459],{"class":1405},"cfg",[475,1461,1408],{"class":1341},[475,1463,1411],{"class":1405},[475,1465,1408],{"class":1341},[475,1467,1468],{"class":1405},"ClientID",[475,1470,803],{"class":1341},[475,1472,1379],{"class":1405},[475,1474,1408],{"class":1341},[475,1476,1411],{"class":1405},[475,1478,1408],{"class":1341},[475,1480,1481],{"class":1405},"ClientSecret",[475,1483,803],{"class":1341},[475,1485,1486],{"class":1360}," callbackURL",[475,1488,1364],{"class":1341},[475,1490,1459],{"class":1405},[475,1492,803],{"class":1341},[475,1494,1342],{"class":1341},[475,1496,1442],{"class":485},[475,1498,1439],{"class":1341},[475,1500,1501],{"class":1341},")))\n",[475,1503,1504],{"class":477,"line":686},[475,1505,1506],{"class":1341},"    }\n",[475,1508,1509],{"class":477,"line":692},[475,1510,1511],{"class":1331},"    \u002F\u002F ...\n",[475,1513,1514],{"class":477,"line":698},[475,1515,1516],{"class":1341},"}\n",[448,1518,1519,1520,1523,1524,598,1527,1530,1531,799,1533,1536,1537,530,1540,1543,1544,1547,1548,1551,1552,747,1554,1557,1558,1560],{},"Ehhez a ",[452,1521,1522],{},"Config","-ba (",[452,1525,1526],{},"config.go",[452,1528,1529],{},"GitLab ProviderConfig"," mezőt, a platform configba (",[452,1532,1526],{},[452,1534,1535],{},"\u002F\u002F gpsystem:config"," anchor) egy ",[452,1538,1539],{},"OAUTH_GITLAB_CLIENT_ID",[452,1541,1542],{},"_SECRET"," párt, a ",[452,1545,1546],{},"Dependencies","-be (",[452,1549,1550],{},"register.go",") és a ",[452,1553,1210],{},[452,1555,1556],{},"social.Config{...}"," literálba a megfelelő mezőket kell felvenni: pontosan ugyanazok a helyek, amiket a ",[452,1559,454],{}," flag a beépített négynél generál.",[448,1562,1563,1566,1567,1573,1574,799,1577,799,1580,799,1583,530,1585,799,1588,799,1591,530,1594,1597,1598,1601],{},[512,1564,1565],{},"Egy providernek, aminek nincs goth csomagja",": implementáld a ",[461,1568,1571],{"href":1569,"rel":1570},"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fmarkbates\u002Fgoth#Provider",[520],[452,1572,544],{}," interfészt (",[452,1575,1576],{},"BeginAuth",[452,1578,1579],{},"UnmarshalSession",[452,1581,1582],{},"FetchUser",[452,1584,855],{},[452,1586,1587],{},"SetName",[452,1589,1590],{},"Debug",[452,1592,1593],{},"RefreshToken",[452,1595,1596],{},"RefreshTokenAvailable",") egy saját típuson, majd ",[452,1599,1600],{},"reg.Register(\"name\", &MyProvider{...})"," ugyanígy.",[574,1603,1605],{"id":1604},"hibakeresés","Hibakeresés",[784,1607,1608,1623,1637,1647],{},[742,1609,1610,1615,1616,1619,1620,1622],{},[512,1611,1612],{},[452,1613,1614],{},"404 unknown social provider",": a ",[452,1617,1618],{},"{provider}"," path-szegmens nincs regisztrálva (se ",[452,1621,454],{},"-lal, se kézzel), vagy elgépelted a nevet.",[742,1624,1625,1615,1630,1632,1633,1636],{},[512,1626,1627],{},[452,1628,1629],{},"401 social login failed",[452,1631,754],{}," é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 ",[452,1634,1635],{},"APP_BASE_URL","-ből számoltnál).",[742,1638,1639,1646],{},[512,1640,1641,1643,1644],{},[452,1642,936],{}," a callbacknél, ",[452,1645,932],{},": 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).",[742,1648,1649,1653,1654,826],{},[512,1650,1651],{},[452,1652,913],{},": 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 ",[461,1655,88],{"href":89},[574,1657,1659],{"id":1658},"kapcsolódó-oldalak","Kapcsolódó oldalak",[784,1661,1662,1670,1679],{},[742,1663,1664,1666,1667,1669],{},[461,1665,88],{"href":89},": a kit ",[452,1668,560],{}," csomagja, JWT-kibocsátás, middleware.",[742,1671,1672,1674,1675,1678],{},[461,1673,93],{"href":94},": a tokenből lett ",[452,1676,1677],{},"Identity"," fölötti szerep-\u002Fpermission-ellenőrzés, változatlan social loginnál is.",[742,1680,1681,1683,1684,1687,1688,1691],{},[461,1682,204],{"href":205},": a kit saját, ",[452,1685,1686],{},"envPrefix","-fel komponálható configjai (az ",[452,1689,1690],{},"OAUTH_*"," változók a generált projekt saját configja, nem itt élnek).",[1693,1694,1695],"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":471,"searchDepth":649,"depth":649,"links":1697},[1698,1699,1702,1705,1706,1707,1708],{"id":576,"depth":649,"text":577},{"id":633,"depth":649,"text":634,"children":1700},[1701],{"id":876,"depth":655,"text":877},{"id":944,"depth":649,"text":945,"children":1703},[1704],{"id":1048,"depth":655,"text":1049},{"id":1217,"depth":649,"text":825},{"id":1293,"depth":649,"text":1294},{"id":1604,"depth":649,"text":1605},{"id":1658,"depth":649,"text":1659},"Discord, Facebook, Apple, Google és bármely más OAuth2 provider bekötése az add auth modulba.","md",null,{},{"icon":111},{"title":277,"description":1709},"U3HdYzGK47RQWYplXswj64aBplEWDN7UVzUxFzvcNpQ",[1717,1719],{"title":272,"path":273,"stem":274,"description":1718,"icon":275,"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":52,"path":287,"stem":288,"description":1720,"icon":282,"children":-1},"Hogyan működik a gpsystem CLI: tool directive, biztonsági szabályok, anchorok, manifest.",1785445896019]