[{"data":1,"prerenderedAt":2120},["ShallowReactive",2],{"navigation_docs":3,"-providers-oauth2":265,"-providers-oauth2-surround":2115},[4,35,49,89,117,164,193,235,253,257,261],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"/getting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","/getting-started/quick-start","1.getting-started/4.quick-start","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Configuration","/getting-started/configuration","1.getting-started/5.configuration","i-lucide-sliders-horizontal",{"title":31,"path":32,"stem":33,"icon":34},"First Auth","/getting-started/first-auth","1.getting-started/6.first-auth","i-lucide-key-round",{"title":36,"path":37,"stem":38,"children":39,"page":6},"Migration","/migration","10.migration",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Migration depuis Firebase Auth","/migration/from-firebase","10.migration/1.from-firebase","i-lucide-arrow-right-left",{"title":46,"path":47,"stem":48,"icon":44},"Migration depuis Supabase Auth","/migration/from-supabase","10.migration/2.from-supabase",{"title":50,"path":51,"stem":52,"children":53,"page":6},"Core Concepts","/core-concepts","2.core-concepts",[54,59,64,69,74,79,84],{"title":55,"path":56,"stem":57,"icon":58},"Architecture","/core-concepts/architecture","2.core-concepts/1.architecture","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Providers","/core-concepts/providers","2.core-concepts/2.providers","i-lucide-plug",{"title":65,"path":66,"stem":67,"icon":68},"Sessions","/core-concepts/sessions","2.core-concepts/3.sessions","i-lucide-timer",{"title":70,"path":71,"stem":72,"icon":73},"Storage","/core-concepts/storage","2.core-concepts/4.storage","i-lucide-database",{"title":75,"path":76,"stem":77,"icon":78},"Reactivity","/core-concepts/reactivity","2.core-concepts/5.reactivity","i-lucide-activity",{"title":80,"path":81,"stem":82,"icon":83},"Callbacks","/core-concepts/callbacks","2.core-concepts/6.callbacks","i-lucide-shield-check",{"title":85,"path":86,"stem":87,"icon":88},"Events","/core-concepts/events","2.core-concepts/7.events","i-lucide-radio",{"title":60,"path":90,"stem":91,"children":92,"page":6},"/providers","3.providers",[93,97,101,105,109,113],{"title":94,"path":95,"stem":96},"Credentials Provider","/providers/credentials","3.providers/1.credentials",{"title":98,"path":99,"stem":100},"OAuth2 Provider","/providers/oauth2","3.providers/2.oauth2",{"title":102,"path":103,"stem":104},"Google Provider","/providers/google","3.providers/3.google",{"title":106,"path":107,"stem":108},"GitHub Provider","/providers/github","3.providers/4.github",{"title":110,"path":111,"stem":112},"Apple Provider","/providers/apple","3.providers/5.apple",{"title":114,"path":115,"stem":116},"Proxy OAuth Provider","/providers/proxy-oauth","3.providers/6.proxy-oauth",{"title":118,"path":119,"stem":120,"children":121,"page":6},"Guides","/guides","4.guides",[122,126,131,136,141,146,151,155,159],{"title":123,"path":124,"stem":125},"Email / Password Auth","/guides/email-auth","4.guides/1.email-auth",{"title":127,"path":128,"stem":129,"icon":130},"Custom OAuth2 Flow","/guides/oauth2-flow","4.guides/2.oauth2-flow","i-lucide-workflow",{"title":132,"path":133,"stem":134,"icon":135},"Deep Links & OAuth2 Callbacks","/guides/deep-links","4.guides/3.deep-links","i-lucide-link",{"title":137,"path":138,"stem":139,"icon":140},"Token Refresh","/guides/token-refresh","4.guides/4.token-refresh","i-lucide-refresh-cw",{"title":142,"path":143,"stem":144,"icon":145},"Multi-Account","/guides/multi-account","4.guides/5.multi-account","i-lucide-users",{"title":147,"path":148,"stem":149,"icon":150},"Route Protection","/guides/route-protection","4.guides/6.route-protection","i-lucide-lock",{"title":152,"path":153,"stem":154,"icon":63},"Custom Provider","/guides/custom-provider","4.guides/7.custom-provider",{"title":156,"path":157,"stem":158,"icon":73},"Custom Storage","/guides/custom-storage","4.guides/8.custom-storage",{"title":160,"path":161,"stem":162,"icon":163},"Testing","/guides/testing","4.guides/9.testing","i-lucide-flask-conical",{"title":165,"path":166,"stem":167,"children":168,"page":6},"Flutter","/flutter","5.flutter",[169,173,178,183,188],{"title":170,"path":171,"stem":172},"Flutter Setup","/flutter/setup","5.flutter/1.setup",{"title":174,"path":175,"stem":176,"icon":177},"Secure Storage","/flutter/secure-storage","5.flutter/2.secure-storage","i-lucide-vault",{"title":179,"path":180,"stem":181,"icon":182},"Widgets","/flutter/widgets","5.flutter/3.widgets","i-lucide-layout",{"title":184,"path":185,"stem":186,"icon":187},"Router Guard","/flutter/router-guard","5.flutter/4.router-guard","i-lucide-signpost",{"title":189,"path":190,"stem":191,"icon":192},"App Binding","/flutter/app-binding","5.flutter/5.app-binding","i-lucide-cpu",{"title":194,"path":195,"stem":196,"children":197,"page":6},"API Reference","/api-reference","6.api-reference",[198,202,206,211,216,221,225,230],{"title":199,"path":200,"stem":201},"AuthyraClient","/api-reference/authyra-client","6.api-reference/1.authyra-client",{"title":203,"path":204,"stem":205},"AuthyraInstance","/api-reference/authyra-instance","6.api-reference/2.authyra-instance",{"title":207,"path":208,"stem":209,"icon":210},"AccountManager","/api-reference/account-manager","6.api-reference/3.account-manager","i-lucide-users-round",{"title":212,"path":213,"stem":214,"icon":215},"AuthProvider","/api-reference/auth-provider","6.api-reference/4.auth-provider","i-lucide-plug-zap",{"title":217,"path":218,"stem":219,"icon":220},"AuthStorage","/api-reference/auth-storage","6.api-reference/5.auth-storage","i-lucide-hard-drive",{"title":222,"path":223,"stem":224,"icon":68},"AuthSession","/api-reference/auth-session","6.api-reference/6.auth-session",{"title":226,"path":227,"stem":228,"icon":229},"AuthState","/api-reference/auth-state","6.api-reference/7.auth-state","i-lucide-toggle-right",{"title":231,"path":232,"stem":233,"icon":234},"Exceptions","/api-reference/auth-exceptions","6.api-reference/8.auth-exceptions","i-lucide-triangle-alert",{"title":236,"path":237,"stem":238,"children":239,"page":6},"Examples","/examples","7.examples",[240,244,249],{"title":241,"path":242,"stem":243},"Flutter App Example","/examples/flutter-app","7.examples/1.flutter-app",{"title":245,"path":246,"stem":247,"icon":248},"Dart Backend","/examples/dart-backend","7.examples/2.dart-backend","i-lucide-server",{"title":250,"path":251,"stem":252,"icon":163},"Testing Setup","/examples/testing-setup","7.examples/3.testing-setup",{"title":254,"path":255,"stem":256},"Troubleshooting","/troubleshooting","8.troubleshooting",{"title":258,"path":259,"stem":260},"FAQ","/faq","9.faq",{"title":262,"path":263,"stem":264},"Changelog","/changelog","changelog",{"id":266,"title":98,"body":267,"description":2107,"extension":2108,"links":2109,"meta":2110,"navigation":1012,"path":99,"seo":2111,"stem":100,"__hash__":2114},"docs/3.providers/2.oauth2.md",{"type":268,"value":269,"toc":2093},"minimark",[270,289,299,302,307,317,328,330,334,390,443,445,448,453,744,968,984,986,990,1314,1316,1320,1561,1563,1567,1570,1579,1616,1624,1674,1676,1680,1814,1816,1820,1840,1847,1849,1853,1856,1925,1927,1931,1942,1994,1996,2000,2008,2049,2051,2055,2089],[271,272,273,277,278,281,282,281,285,288],"p",{},[274,275,276],"code",{},"OAuth2Provider"," implements the full browser-based Authorization Code flow with optional PKCE. Use it directly for any identity provider not covered by the prebuilt subclasses (",[274,279,280],{},"GoogleProvider",", ",[274,283,284],{},"GitHubOAuth2Provider",[274,286,287],{},"AppleProvider",").",[271,290,291,295,296],{},[292,293,294],"strong",{},"Package",": ",[274,297,298],{},"authyra_flutter",[300,301],"hr",{},[303,304,306],"h2",{"id":305},"how-it-works","How it works",[308,309,315],"pre",{"className":310,"code":312,"language":313,"meta":314},[311],"language-text","App                              Identity Provider\n │── build authorization URL ───────────────────►│\n │── open external browser ──────────────────────►│\n │                                               │ (user authenticates)\n │◄── deep-link callback (?code=…&state=…) ──────│\n │── exchange code for tokens ───────────────────►│\n │◄── { access_token, refresh_token, expires_in } │\n │── GET /userinfo (Bearer) ─────────────────────►│\n │◄── { sub, email, name, … } ───────────────────│\n","text","",[274,316,312],{"__ignoreMap":314},[271,318,319,320,327],{},"PKCE (",[321,322,326],"a",{"href":323,"rel":324},"https://www.rfc-editor.org/rfc/rfc7636",[325],"nofollow","RFC 7636",") is enabled by default and is strongly recommended for mobile and desktop apps that cannot safely store a client secret.",[300,329],{},[303,331,333],{"id":332},"constructor","Constructor",[308,335,339],{"className":336,"code":337,"language":338,"meta":314,"style":314},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","OAuth2Provider({\n  required OAuth2Config config,\n  Dio? dio,\n})\n","dart",[274,340,341,353,370,384],{"__ignoreMap":314},[342,343,346,349],"span",{"class":344,"line":345},"line",1,[342,347,276],{"class":348},"sBMFI",[342,350,352],{"class":351},"sTEyZ","({\n",[342,354,356,360,363,366],{"class":344,"line":355},2,[342,357,359],{"class":358},"spNyl","  required",[342,361,362],{"class":348}," OAuth2Config",[342,364,365],{"class":351}," config",[342,367,369],{"class":368},"sMK4o",",\n",[342,371,373,376,379,382],{"class":344,"line":372},3,[342,374,375],{"class":348},"  Dio",[342,377,378],{"class":368},"?",[342,380,381],{"class":351}," dio",[342,383,369],{"class":368},[342,385,387],{"class":344,"line":386},4,[342,388,389],{"class":351},"})\n",[391,392,393,409],"table",{},[394,395,396],"thead",{},[397,398,399,403,406],"tr",{},[400,401,402],"th",{},"Parameter",[400,404,405],{},"Type",[400,407,408],{},"Description",[410,411,412,428],"tbody",{},[397,413,414,420,425],{},[415,416,417],"td",{},[274,418,419],{},"config",[415,421,422],{},[274,423,424],{},"OAuth2Config",[415,426,427],{},"Endpoints, credentials, scopes, and user extractor",[397,429,430,435,440],{},[415,431,432],{},[274,433,434],{},"dio",[415,436,437],{},[274,438,439],{},"Dio?",[415,441,442],{},"Optional Dio instance — share interceptors or inject in tests",[300,444],{},[303,446,424],{"id":447},"oauth2config",[271,449,450,452],{},[274,451,424],{}," is an immutable value object that describes everything the provider needs.",[308,454,456],{"className":336,"code":455,"language":338,"meta":314,"style":314},"OAuth2Config({\n  required String providerName,\n  required String clientId,\n  required String authorizationEndpoint,\n  required String tokenEndpoint,\n  required String userInfoEndpoint,\n  required String redirectUri,\n  required List\u003CString> scopes,\n  required AuthUser Function(Map\u003CString, dynamic>) userExtractor,\n  String? clientSecret,\n  bool usePkce = true,\n  Map\u003CString, String> additionalAuthParams = const {},\n  Map\u003CString, String> additionalTokenParams = const {},\n  Map\u003CString, String>? tokenHeaders,\n  Map\u003CString, String>? userInfoHeaders,\n  Duration timeout = const Duration(minutes: 5),\n})\n",[274,457,458,464,476,487,498,510,522,534,553,584,597,612,639,663,686,708,739],{"__ignoreMap":314},[342,459,460,462],{"class":344,"line":345},[342,461,424],{"class":348},[342,463,352],{"class":351},[342,465,466,468,471,474],{"class":344,"line":355},[342,467,359],{"class":358},[342,469,470],{"class":348}," String",[342,472,473],{"class":351}," providerName",[342,475,369],{"class":368},[342,477,478,480,482,485],{"class":344,"line":372},[342,479,359],{"class":358},[342,481,470],{"class":348},[342,483,484],{"class":351}," clientId",[342,486,369],{"class":368},[342,488,489,491,493,496],{"class":344,"line":386},[342,490,359],{"class":358},[342,492,470],{"class":348},[342,494,495],{"class":351}," authorizationEndpoint",[342,497,369],{"class":368},[342,499,501,503,505,508],{"class":344,"line":500},5,[342,502,359],{"class":358},[342,504,470],{"class":348},[342,506,507],{"class":351}," tokenEndpoint",[342,509,369],{"class":368},[342,511,513,515,517,520],{"class":344,"line":512},6,[342,514,359],{"class":358},[342,516,470],{"class":348},[342,518,519],{"class":351}," userInfoEndpoint",[342,521,369],{"class":368},[342,523,525,527,529,532],{"class":344,"line":524},7,[342,526,359],{"class":358},[342,528,470],{"class":348},[342,530,531],{"class":351}," redirectUri",[342,533,369],{"class":368},[342,535,537,539,542,545,548,551],{"class":344,"line":536},8,[342,538,359],{"class":358},[342,540,541],{"class":348}," List",[342,543,544],{"class":351},"\u003C",[342,546,547],{"class":348},"String",[342,549,550],{"class":351},"> scopes",[342,552,369],{"class":368},[342,554,556,558,561,564,567,570,572,574,576,579,582],{"class":344,"line":555},9,[342,557,359],{"class":358},[342,559,560],{"class":348}," AuthUser",[342,562,563],{"class":348}," Function",[342,565,566],{"class":351},"(",[342,568,569],{"class":348},"Map",[342,571,544],{"class":351},[342,573,547],{"class":348},[342,575,281],{"class":351},[342,577,578],{"class":348},"dynamic",[342,580,581],{"class":351},">) userExtractor",[342,583,369],{"class":368},[342,585,587,590,592,595],{"class":344,"line":586},10,[342,588,589],{"class":348},"  String",[342,591,378],{"class":368},[342,593,594],{"class":351}," clientSecret",[342,596,369],{"class":368},[342,598,600,603,606,609],{"class":344,"line":599},11,[342,601,602],{"class":348},"  bool",[342,604,605],{"class":351}," usePkce ",[342,607,608],{"class":368},"=",[342,610,611],{"class":368}," true,\n",[342,613,615,618,620,622,624,626,629,631,634,637],{"class":344,"line":614},12,[342,616,617],{"class":348},"  Map",[342,619,544],{"class":351},[342,621,547],{"class":348},[342,623,281],{"class":351},[342,625,547],{"class":348},[342,627,628],{"class":351},"> additionalAuthParams ",[342,630,608],{"class":368},[342,632,633],{"class":358}," const",[342,635,636],{"class":351}," {}",[342,638,369],{"class":368},[342,640,642,644,646,648,650,652,655,657,659,661],{"class":344,"line":641},13,[342,643,617],{"class":348},[342,645,544],{"class":351},[342,647,547],{"class":348},[342,649,281],{"class":351},[342,651,547],{"class":348},[342,653,654],{"class":351},"> additionalTokenParams ",[342,656,608],{"class":368},[342,658,633],{"class":358},[342,660,636],{"class":351},[342,662,369],{"class":368},[342,664,666,668,670,672,674,676,679,681,684],{"class":344,"line":665},14,[342,667,617],{"class":348},[342,669,544],{"class":351},[342,671,547],{"class":348},[342,673,281],{"class":351},[342,675,547],{"class":348},[342,677,678],{"class":351},">",[342,680,378],{"class":368},[342,682,683],{"class":351}," tokenHeaders",[342,685,369],{"class":368},[342,687,689,691,693,695,697,699,701,703,706],{"class":344,"line":688},15,[342,690,617],{"class":348},[342,692,544],{"class":351},[342,694,547],{"class":348},[342,696,281],{"class":351},[342,698,547],{"class":348},[342,700,678],{"class":351},[342,702,378],{"class":368},[342,704,705],{"class":351}," userInfoHeaders",[342,707,369],{"class":368},[342,709,711,714,717,719,721,724,727,730,734,737],{"class":344,"line":710},16,[342,712,713],{"class":348},"  Duration",[342,715,716],{"class":351}," timeout ",[342,718,608],{"class":368},[342,720,633],{"class":358},[342,722,723],{"class":348}," Duration",[342,725,726],{"class":351},"(minutes",[342,728,729],{"class":368},":",[342,731,733],{"class":732},"sbssI"," 5",[342,735,736],{"class":351},")",[342,738,369],{"class":368},[342,740,742],{"class":344,"line":741},17,[342,743,389],{"class":351},[391,745,746,758],{},[394,747,748],{},[397,749,750,753,756],{},[400,751,752],{},"Field",[400,754,755],{},"Default",[400,757,408],{},[410,759,760,776,788,800,812,824,836,848,863,878,893,908,922,936,950],{},[397,761,762,767,770],{},[415,763,764],{},[274,765,766],{},"providerName",[415,768,769],{},"required",[415,771,772,773],{},"Lowercase slug — used as ",[274,774,775],{},"AuthProvider.id",[397,777,778,783,785],{},[415,779,780],{},[274,781,782],{},"clientId",[415,784,769],{},[415,786,787],{},"Client ID from the identity provider",[397,789,790,795,797],{},[415,791,792],{},[274,793,794],{},"authorizationEndpoint",[415,796,769],{},[415,798,799],{},"URL the browser opens for user consent",[397,801,802,807,809],{},[415,803,804],{},[274,805,806],{},"tokenEndpoint",[415,808,769],{},[415,810,811],{},"URL to exchange the code for tokens",[397,813,814,819,821],{},[415,815,816],{},[274,817,818],{},"userInfoEndpoint",[415,820,769],{},[415,822,823],{},"URL to fetch the user profile",[397,825,826,831,833],{},[415,827,828],{},[274,829,830],{},"redirectUri",[415,832,769],{},[415,834,835],{},"Custom URI scheme the browser redirects back to",[397,837,838,843,845],{},[415,839,840],{},[274,841,842],{},"scopes",[415,844,769],{},[415,846,847],{},"OAuth 2.0 scopes to request",[397,849,850,855,857],{},[415,851,852],{},[274,853,854],{},"userExtractor",[415,856,769],{},[415,858,859,860],{},"Maps the userinfo JSON to an ",[274,861,862],{},"AuthUser",[397,864,865,870,875],{},[415,866,867],{},[274,868,869],{},"clientSecret",[415,871,872],{},[274,873,874],{},"null",[415,876,877],{},"Required for confidential clients; omit for PKCE flows",[397,879,880,885,890],{},[415,881,882],{},[274,883,884],{},"usePkce",[415,886,887],{},[274,888,889],{},"true",[415,891,892],{},"PKCE recommended for all public clients",[397,894,895,900,905],{},[415,896,897],{},[274,898,899],{},"additionalAuthParams",[415,901,902],{},[274,903,904],{},"{}",[415,906,907],{},"Extra query params on the authorization URL",[397,909,910,915,919],{},[415,911,912],{},[274,913,914],{},"additionalTokenParams",[415,916,917],{},[274,918,904],{},[415,920,921],{},"Extra body params on the token request",[397,923,924,929,933],{},[415,925,926],{},[274,927,928],{},"tokenHeaders",[415,930,931],{},[274,932,874],{},[415,934,935],{},"Custom headers on the token request",[397,937,938,943,947],{},[415,939,940],{},[274,941,942],{},"userInfoHeaders",[415,944,945],{},[274,946,874],{},[415,948,949],{},"Custom headers on the userinfo request",[397,951,952,957,962],{},[415,953,954],{},[274,955,956],{},"timeout",[415,958,959],{},[274,960,961],{},"5 min",[415,963,964,965],{},"Max wait before throwing ",[274,966,967],{},"AuthenticationCancelledException",[969,970,972,973,975,976,979,980,983],"callout",{"icon":971},"i-lucide-shield","Never embed a ",[274,974,869],{}," in a Flutter / mobile app. Use ",[274,977,978],{},"usePkce: true"," (default) or delegate the flow to your backend with ",[321,981,982],{"href":115},"ProxyOAuthProvider",".",[300,985],{},[303,987,989],{"id":988},"quick-example-discord","Quick example — Discord",[308,991,994],{"className":336,"code":992,"filename":993,"language":338,"meta":314,"style":314},"import 'package:authyra_flutter/authyra_flutter.dart';\n\nfinal discordProvider = OAuth2Provider(\n  config: OAuth2Config(\n    providerName:          'discord',\n    clientId:              'YOUR_DISCORD_CLIENT_ID',\n    authorizationEndpoint: 'https://discord.com/oauth2/authorize',\n    tokenEndpoint:         'https://discord.com/api/oauth2/token',\n    userInfoEndpoint:      'https://discord.com/api/users/@me',\n    redirectUri:           'myapp://auth/callback',\n    scopes:                ['identify', 'email'],\n    userExtractor: (json) => AuthUser(\n      id:        json['id']       as String,\n      email:     json['email']    as String?,\n      name:      json['username'] as String?,\n      avatarUrl: json['avatar'] != null\n          ? 'https://cdn.discordapp.com/avatars/${json['id']}/${json['avatar']}.png'\n          : null,\n    ),\n  ),\n);\n","lib/auth/discord_provider.dart",[274,995,996,1008,1014,1030,1041,1053,1065,1077,1089,1101,1113,1137,1154,1177,1200,1222,1243,1282,1291,1299,1307],{"__ignoreMap":314},[342,997,998,1001,1005],{"class":344,"line":345},[342,999,1000],{"class":732},"import",[342,1002,1004],{"class":1003},"sfazB"," 'package:authyra_flutter/authyra_flutter.dart'",[342,1006,1007],{"class":368},";\n",[342,1009,1010],{"class":344,"line":355},[342,1011,1013],{"emptyLinePlaceholder":1012},true,"\n",[342,1015,1016,1019,1022,1024,1027],{"class":344,"line":372},[342,1017,1018],{"class":358},"final",[342,1020,1021],{"class":351}," discordProvider ",[342,1023,608],{"class":368},[342,1025,1026],{"class":348}," OAuth2Provider",[342,1028,1029],{"class":351},"(\n",[342,1031,1032,1035,1037,1039],{"class":344,"line":386},[342,1033,1034],{"class":351},"  config",[342,1036,729],{"class":368},[342,1038,362],{"class":348},[342,1040,1029],{"class":351},[342,1042,1043,1046,1048,1051],{"class":344,"line":500},[342,1044,1045],{"class":351},"    providerName",[342,1047,729],{"class":368},[342,1049,1050],{"class":1003},"          'discord'",[342,1052,369],{"class":368},[342,1054,1055,1058,1060,1063],{"class":344,"line":512},[342,1056,1057],{"class":351},"    clientId",[342,1059,729],{"class":368},[342,1061,1062],{"class":1003},"              'YOUR_DISCORD_CLIENT_ID'",[342,1064,369],{"class":368},[342,1066,1067,1070,1072,1075],{"class":344,"line":524},[342,1068,1069],{"class":351},"    authorizationEndpoint",[342,1071,729],{"class":368},[342,1073,1074],{"class":1003}," 'https://discord.com/oauth2/authorize'",[342,1076,369],{"class":368},[342,1078,1079,1082,1084,1087],{"class":344,"line":536},[342,1080,1081],{"class":351},"    tokenEndpoint",[342,1083,729],{"class":368},[342,1085,1086],{"class":1003},"         'https://discord.com/api/oauth2/token'",[342,1088,369],{"class":368},[342,1090,1091,1094,1096,1099],{"class":344,"line":555},[342,1092,1093],{"class":351},"    userInfoEndpoint",[342,1095,729],{"class":368},[342,1097,1098],{"class":1003},"      'https://discord.com/api/users/@me'",[342,1100,369],{"class":368},[342,1102,1103,1106,1108,1111],{"class":344,"line":586},[342,1104,1105],{"class":351},"    redirectUri",[342,1107,729],{"class":368},[342,1109,1110],{"class":1003},"           'myapp://auth/callback'",[342,1112,369],{"class":368},[342,1114,1115,1118,1120,1123,1126,1129,1132,1135],{"class":344,"line":599},[342,1116,1117],{"class":351},"    scopes",[342,1119,729],{"class":368},[342,1121,1122],{"class":351},"                [",[342,1124,1125],{"class":1003},"'identify'",[342,1127,1128],{"class":368},",",[342,1130,1131],{"class":1003}," 'email'",[342,1133,1134],{"class":351},"]",[342,1136,369],{"class":368},[342,1138,1139,1142,1144,1147,1150,1152],{"class":344,"line":614},[342,1140,1141],{"class":351},"    userExtractor",[342,1143,729],{"class":368},[342,1145,1146],{"class":351}," (json) ",[342,1148,1149],{"class":368},"=>",[342,1151,560],{"class":348},[342,1153,1029],{"class":351},[342,1155,1156,1159,1161,1164,1167,1170,1173,1175],{"class":344,"line":641},[342,1157,1158],{"class":351},"      id",[342,1160,729],{"class":368},[342,1162,1163],{"class":351},"        json[",[342,1165,1166],{"class":1003},"'id'",[342,1168,1169],{"class":351},"]       ",[342,1171,1172],{"class":368},"as",[342,1174,470],{"class":348},[342,1176,369],{"class":368},[342,1178,1179,1182,1184,1187,1190,1193,1195,1197],{"class":344,"line":665},[342,1180,1181],{"class":351},"      email",[342,1183,729],{"class":368},[342,1185,1186],{"class":351},"     json[",[342,1188,1189],{"class":1003},"'email'",[342,1191,1192],{"class":351},"]    ",[342,1194,1172],{"class":368},[342,1196,470],{"class":348},[342,1198,1199],{"class":368},"?,\n",[342,1201,1202,1205,1207,1210,1213,1216,1218,1220],{"class":344,"line":688},[342,1203,1204],{"class":351},"      name",[342,1206,729],{"class":368},[342,1208,1209],{"class":351},"      json[",[342,1211,1212],{"class":1003},"'username'",[342,1214,1215],{"class":351},"] ",[342,1217,1172],{"class":368},[342,1219,470],{"class":348},[342,1221,1199],{"class":368},[342,1223,1224,1227,1229,1232,1235,1237,1240],{"class":344,"line":710},[342,1225,1226],{"class":351},"      avatarUrl",[342,1228,729],{"class":368},[342,1230,1231],{"class":351}," json[",[342,1233,1234],{"class":1003},"'avatar'",[342,1236,1215],{"class":351},[342,1238,1239],{"class":368},"!=",[342,1241,1242],{"class":368}," null\n",[342,1244,1245,1248,1251,1254,1258,1261,1263,1266,1269,1271,1273,1275,1277,1279],{"class":344,"line":741},[342,1246,1247],{"class":368},"          ?",[342,1249,1250],{"class":1003}," 'https://cdn.discordapp.com/avatars/",[342,1252,1253],{"class":351},"${",[342,1255,1257],{"class":1256},"sHdIc","json",[342,1259,1260],{"class":351},"[",[342,1262,1166],{"class":1003},[342,1264,1265],{"class":351},"]}",[342,1267,1268],{"class":1003},"/",[342,1270,1253],{"class":351},[342,1272,1257],{"class":1256},[342,1274,1260],{"class":351},[342,1276,1234],{"class":1003},[342,1278,1265],{"class":351},[342,1280,1281],{"class":1003},".png'\n",[342,1283,1285,1288],{"class":344,"line":1284},18,[342,1286,1287],{"class":368},"          :",[342,1289,1290],{"class":368}," null,\n",[342,1292,1294,1297],{"class":344,"line":1293},19,[342,1295,1296],{"class":351},"    )",[342,1298,369],{"class":368},[342,1300,1302,1305],{"class":344,"line":1301},20,[342,1303,1304],{"class":351},"  )",[342,1306,369],{"class":368},[342,1308,1310,1312],{"class":344,"line":1309},21,[342,1311,736],{"class":351},[342,1313,1007],{"class":368},[300,1315],{},[303,1317,1319],{"id":1318},"registration-and-initialization","Registration and initialization",[308,1321,1324],{"className":336,"code":1322,"filename":1323,"language":338,"meta":314,"style":314},"import 'package:app_links/app_links.dart';\nimport 'package:authyra_flutter/authyra_flutter.dart';\n\nFuture\u003Cvoid> main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  // 1. Register the provider for deep-link routing\n  OAuth2CallbackHandler.registerProvider('myapp', discordProvider);\n\n  // 2. Forward all incoming links\n  AppLinks().uriLinkStream.listen(OAuth2CallbackHandler.handleCallback);\n\n  // 3. Initialize Authyra\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [discordProvider],\n      storage: SecureAuthStorage(),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n","lib/main.dart",[274,1325,1326,1335,1343,1347,1374,1389,1393,1399,1421,1425,1430,1459,1463,1468,1483,1495,1507,1521,1527,1533,1537,1555],{"__ignoreMap":314},[342,1327,1328,1330,1333],{"class":344,"line":345},[342,1329,1000],{"class":732},[342,1331,1332],{"class":1003}," 'package:app_links/app_links.dart'",[342,1334,1007],{"class":368},[342,1336,1337,1339,1341],{"class":344,"line":355},[342,1338,1000],{"class":732},[342,1340,1004],{"class":1003},[342,1342,1007],{"class":368},[342,1344,1345],{"class":344,"line":372},[342,1346,1013],{"emptyLinePlaceholder":1012},[342,1348,1349,1352,1354,1357,1360,1364,1367,1371],{"class":344,"line":386},[342,1350,1351],{"class":348},"Future",[342,1353,544],{"class":351},[342,1355,1356],{"class":358},"void",[342,1358,1359],{"class":351},"> ",[342,1361,1363],{"class":1362},"s2Zo4","main",[342,1365,1366],{"class":351},"() ",[342,1368,1370],{"class":1369},"s7zQu","async",[342,1372,1373],{"class":351}," {\n",[342,1375,1376,1379,1381,1384,1387],{"class":344,"line":500},[342,1377,1378],{"class":348},"  WidgetsFlutterBinding",[342,1380,983],{"class":368},[342,1382,1383],{"class":1362},"ensureInitialized",[342,1385,1386],{"class":351},"()",[342,1388,1007],{"class":368},[342,1390,1391],{"class":344,"line":512},[342,1392,1013],{"emptyLinePlaceholder":1012},[342,1394,1395],{"class":344,"line":524},[342,1396,1398],{"class":1397},"sHwdD","  // 1. Register the provider for deep-link routing\n",[342,1400,1401,1404,1406,1409,1411,1414,1416,1419],{"class":344,"line":536},[342,1402,1403],{"class":348},"  OAuth2CallbackHandler",[342,1405,983],{"class":368},[342,1407,1408],{"class":1362},"registerProvider",[342,1410,566],{"class":351},[342,1412,1413],{"class":1003},"'myapp'",[342,1415,1128],{"class":368},[342,1417,1418],{"class":351}," discordProvider)",[342,1420,1007],{"class":368},[342,1422,1423],{"class":344,"line":555},[342,1424,1013],{"emptyLinePlaceholder":1012},[342,1426,1427],{"class":344,"line":586},[342,1428,1429],{"class":1397},"  // 2. Forward all incoming links\n",[342,1431,1432,1435,1437,1439,1442,1444,1447,1449,1452,1454,1457],{"class":344,"line":599},[342,1433,1434],{"class":348},"  AppLinks",[342,1436,1386],{"class":351},[342,1438,983],{"class":368},[342,1440,1441],{"class":351},"uriLinkStream",[342,1443,983],{"class":368},[342,1445,1446],{"class":1362},"listen",[342,1448,566],{"class":351},[342,1450,1451],{"class":348},"OAuth2CallbackHandler",[342,1453,983],{"class":368},[342,1455,1456],{"class":351},"handleCallback)",[342,1458,1007],{"class":368},[342,1460,1461],{"class":344,"line":614},[342,1462,1013],{"emptyLinePlaceholder":1012},[342,1464,1465],{"class":344,"line":641},[342,1466,1467],{"class":1397},"  // 3. Initialize Authyra\n",[342,1469,1470,1473,1476,1478,1481],{"class":344,"line":665},[342,1471,1472],{"class":1369},"  await",[342,1474,1475],{"class":348}," Authyra",[342,1477,983],{"class":368},[342,1479,1480],{"class":1362},"initialize",[342,1482,1029],{"class":351},[342,1484,1485,1488,1490,1493],{"class":344,"line":688},[342,1486,1487],{"class":351},"    client",[342,1489,729],{"class":368},[342,1491,1492],{"class":348}," AuthyraClient",[342,1494,1029],{"class":351},[342,1496,1497,1500,1502,1505],{"class":344,"line":710},[342,1498,1499],{"class":351},"      providers",[342,1501,729],{"class":368},[342,1503,1504],{"class":351}," [discordProvider]",[342,1506,369],{"class":368},[342,1508,1509,1512,1514,1517,1519],{"class":344,"line":741},[342,1510,1511],{"class":351},"      storage",[342,1513,729],{"class":368},[342,1515,1516],{"class":348}," SecureAuthStorage",[342,1518,1386],{"class":351},[342,1520,369],{"class":368},[342,1522,1523,1525],{"class":344,"line":1284},[342,1524,1296],{"class":351},[342,1526,369],{"class":368},[342,1528,1529,1531],{"class":344,"line":1293},[342,1530,1304],{"class":351},[342,1532,1007],{"class":368},[342,1534,1535],{"class":344,"line":1301},[342,1536,1013],{"emptyLinePlaceholder":1012},[342,1538,1539,1542,1544,1547,1550,1553],{"class":344,"line":1309},[342,1540,1541],{"class":1362},"  runApp",[342,1543,566],{"class":351},[342,1545,1546],{"class":358},"const",[342,1548,1549],{"class":348}," MyApp",[342,1551,1552],{"class":351},"())",[342,1554,1007],{"class":368},[342,1556,1558],{"class":344,"line":1557},22,[342,1559,1560],{"class":351},"}\n",[300,1562],{},[303,1564,1566],{"id":1565},"deep-link-platform-setup","Deep-link platform setup",[271,1568,1569],{},"Register your custom URI scheme with each platform:",[271,1571,1572,1575,1576,729],{},[292,1573,1574],{},"Android"," — ",[274,1577,1578],{},"android/app/src/main/AndroidManifest.xml",[308,1580,1584],{"className":1581,"code":1582,"language":1583,"meta":314,"style":314},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cintent-filter>\n  \u003Caction android:name=\"android.intent.action.VIEW\" />\n  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n  \u003Cdata android:scheme=\"myapp\" android:host=\"auth\" android:pathPrefix=\"/callback\" />\n\u003C/intent-filter>\n","xml",[274,1585,1586,1591,1596,1601,1606,1611],{"__ignoreMap":314},[342,1587,1588],{"class":344,"line":345},[342,1589,1590],{},"\u003Cintent-filter>\n",[342,1592,1593],{"class":344,"line":355},[342,1594,1595],{},"  \u003Caction android:name=\"android.intent.action.VIEW\" />\n",[342,1597,1598],{"class":344,"line":372},[342,1599,1600],{},"  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n",[342,1602,1603],{"class":344,"line":386},[342,1604,1605],{},"  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n",[342,1607,1608],{"class":344,"line":500},[342,1609,1610],{},"  \u003Cdata android:scheme=\"myapp\" android:host=\"auth\" android:pathPrefix=\"/callback\" />\n",[342,1612,1613],{"class":344,"line":512},[342,1614,1615],{},"\u003C/intent-filter>\n",[271,1617,1618,1575,1621,729],{},[292,1619,1620],{},"iOS",[274,1622,1623],{},"ios/Runner/Info.plist",[308,1625,1627],{"className":1581,"code":1626,"language":1583,"meta":314,"style":314},"\u003Ckey>CFBundleURLTypes\u003C/key>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleURLSchemes\u003C/key>\n    \u003Carray>\n      \u003Cstring>myapp\u003C/string>\n    \u003C/array>\n  \u003C/dict>\n\u003C/array>\n",[274,1628,1629,1634,1639,1644,1649,1654,1659,1664,1669],{"__ignoreMap":314},[342,1630,1631],{"class":344,"line":345},[342,1632,1633],{},"\u003Ckey>CFBundleURLTypes\u003C/key>\n",[342,1635,1636],{"class":344,"line":355},[342,1637,1638],{},"\u003Carray>\n",[342,1640,1641],{"class":344,"line":372},[342,1642,1643],{},"  \u003Cdict>\n",[342,1645,1646],{"class":344,"line":386},[342,1647,1648],{},"    \u003Ckey>CFBundleURLSchemes\u003C/key>\n",[342,1650,1651],{"class":344,"line":500},[342,1652,1653],{},"    \u003Carray>\n",[342,1655,1656],{"class":344,"line":512},[342,1657,1658],{},"      \u003Cstring>myapp\u003C/string>\n",[342,1660,1661],{"class":344,"line":524},[342,1662,1663],{},"    \u003C/array>\n",[342,1665,1666],{"class":344,"line":536},[342,1667,1668],{},"  \u003C/dict>\n",[342,1670,1671],{"class":344,"line":555},[342,1672,1673],{},"\u003C/array>\n",[300,1675],{},[303,1677,1679],{"id":1678},"sign-in","Sign in",[308,1681,1683],{"className":336,"code":1682,"language":338,"meta":314,"style":314},"try {\n  final user = await Authyra.instance.signIn('discord');\n  print('Signed in as ${user.name}');\n} on AuthenticationCancelledException {\n  // User closed the browser\n} on AuthenticationFailedException catch (e) {\n  print('Sign-in failed: $e');\n}\n",[274,1684,1685,1692,1726,1756,1769,1774,1789,1810],{"__ignoreMap":314},[342,1686,1687,1690],{"class":344,"line":345},[342,1688,1689],{"class":1369},"try",[342,1691,1373],{"class":351},[342,1693,1694,1697,1700,1702,1705,1707,1709,1712,1714,1717,1719,1722,1724],{"class":344,"line":355},[342,1695,1696],{"class":358},"  final",[342,1698,1699],{"class":351}," user ",[342,1701,608],{"class":368},[342,1703,1704],{"class":1369}," await",[342,1706,1475],{"class":348},[342,1708,983],{"class":368},[342,1710,1711],{"class":351},"instance",[342,1713,983],{"class":368},[342,1715,1716],{"class":1362},"signIn",[342,1718,566],{"class":351},[342,1720,1721],{"class":1003},"'discord'",[342,1723,736],{"class":351},[342,1725,1007],{"class":368},[342,1727,1728,1731,1733,1736,1738,1741,1743,1746,1749,1752,1754],{"class":344,"line":372},[342,1729,1730],{"class":1362},"  print",[342,1732,566],{"class":351},[342,1734,1735],{"class":1003},"'Signed in as ",[342,1737,1253],{"class":351},[342,1739,1740],{"class":1256},"user",[342,1742,983],{"class":351},[342,1744,1745],{"class":1256},"name",[342,1747,1748],{"class":351},"}",[342,1750,1751],{"class":1003},"'",[342,1753,736],{"class":351},[342,1755,1007],{"class":368},[342,1757,1758,1761,1764,1767],{"class":344,"line":386},[342,1759,1760],{"class":351},"} ",[342,1762,1763],{"class":1369},"on",[342,1765,1766],{"class":348}," AuthenticationCancelledException",[342,1768,1373],{"class":351},[342,1770,1771],{"class":344,"line":500},[342,1772,1773],{"class":1397},"  // User closed the browser\n",[342,1775,1776,1778,1780,1783,1786],{"class":344,"line":512},[342,1777,1760],{"class":351},[342,1779,1763],{"class":1369},[342,1781,1782],{"class":348}," AuthenticationFailedException",[342,1784,1785],{"class":1369}," catch",[342,1787,1788],{"class":351}," (e) {\n",[342,1790,1791,1793,1795,1798,1801,1804,1806,1808],{"class":344,"line":524},[342,1792,1730],{"class":1362},[342,1794,566],{"class":351},[342,1796,1797],{"class":1003},"'Sign-in failed: ",[342,1799,1800],{"class":351},"$",[342,1802,1803],{"class":1256},"e",[342,1805,1751],{"class":1003},[342,1807,736],{"class":351},[342,1809,1007],{"class":368},[342,1811,1812],{"class":344,"line":536},[342,1813,1560],{"class":351},[300,1815],{},[303,1817,1819],{"id":1818},"token-refresh","Token refresh",[271,1821,1822,1824,1825,1828,1829,1832,1833,1835,1836,1839],{},[274,1823,276],{}," sets ",[274,1826,1827],{},"supportsRefresh: true",". When the active session is within the refresh window (controlled by ",[274,1830,1831],{},"AuthConfig.refreshBeforeExpiry","), ",[274,1834,199],{}," calls ",[274,1837,1838],{},"provider.refreshToken(refreshToken)"," automatically.",[271,1841,1842,1843,1846],{},"Override ",[274,1844,1845],{},"refreshToken"," in a subclass if the provider uses a non-standard refresh flow.",[300,1848],{},[303,1850,1852],{"id":1851},"advanced-additional-auth-params","Advanced — additional auth params",[271,1854,1855],{},"Some providers require extra parameters on the authorization URL:",[308,1857,1859],{"className":336,"code":1858,"language":338,"meta":314,"style":314},"OAuth2Config(\n  // ...\n  additionalAuthParams: const {\n    'access_type': 'offline',  // Google: request refresh token\n    'prompt':      'consent',  // Google: always show consent screen\n  },\n)\n",[274,1860,1861,1867,1872,1883,1898,1913,1920],{"__ignoreMap":314},[342,1862,1863,1865],{"class":344,"line":345},[342,1864,424],{"class":348},[342,1866,1029],{"class":351},[342,1868,1869],{"class":344,"line":355},[342,1870,1871],{"class":1397},"  // ...\n",[342,1873,1874,1877,1879,1881],{"class":344,"line":372},[342,1875,1876],{"class":351},"  additionalAuthParams",[342,1878,729],{"class":368},[342,1880,633],{"class":358},[342,1882,1373],{"class":351},[342,1884,1885,1888,1890,1893,1895],{"class":344,"line":386},[342,1886,1887],{"class":1003},"    'access_type'",[342,1889,729],{"class":368},[342,1891,1892],{"class":1003}," 'offline'",[342,1894,1128],{"class":368},[342,1896,1897],{"class":1397},"  // Google: request refresh token\n",[342,1899,1900,1903,1905,1908,1910],{"class":344,"line":500},[342,1901,1902],{"class":1003},"    'prompt'",[342,1904,729],{"class":368},[342,1906,1907],{"class":1003},"      'consent'",[342,1909,1128],{"class":368},[342,1911,1912],{"class":1397},"  // Google: always show consent screen\n",[342,1914,1915,1918],{"class":344,"line":512},[342,1916,1917],{"class":351},"  }",[342,1919,369],{"class":368},[342,1921,1922],{"class":344,"line":524},[342,1923,1924],{"class":351},")\n",[300,1926],{},[303,1928,1930],{"id":1929},"advanced-custom-scopes-at-sign-in-time","Advanced — custom scopes at sign-in time",[271,1932,1933,1934,1937,1938,1941],{},"Pass ",[274,1935,1936],{},"scope"," in the ",[274,1939,1940],{},"params"," map to override the configured scopes for a single call:",[308,1943,1945],{"className":336,"code":1944,"language":338,"meta":314,"style":314},"await Authyra.instance.signIn('discord', params: {\n  'scope': 'identify email guilds',\n});\n",[274,1946,1947,1975,1987],{"__ignoreMap":314},[342,1948,1949,1952,1954,1956,1958,1960,1962,1964,1966,1968,1971,1973],{"class":344,"line":345},[342,1950,1951],{"class":1369},"await",[342,1953,1475],{"class":348},[342,1955,983],{"class":368},[342,1957,1711],{"class":351},[342,1959,983],{"class":368},[342,1961,1716],{"class":1362},[342,1963,566],{"class":351},[342,1965,1721],{"class":1003},[342,1967,1128],{"class":368},[342,1969,1970],{"class":351}," params",[342,1972,729],{"class":368},[342,1974,1373],{"class":351},[342,1976,1977,1980,1982,1985],{"class":344,"line":355},[342,1978,1979],{"class":1003},"  'scope'",[342,1981,729],{"class":368},[342,1983,1984],{"class":1003}," 'identify email guilds'",[342,1986,369],{"class":368},[342,1988,1989,1992],{"class":344,"line":372},[342,1990,1991],{"class":351},"})",[342,1993,1007],{"class":368},[300,1995],{},[303,1997,1999],{"id":1998},"copywith","copyWith",[271,2001,2002,2004,2005,2007],{},[274,2003,424],{}," exposes ",[274,2006,1999],{}," for environment-specific overrides or tests:",[308,2009,2011],{"className":336,"code":2010,"language":338,"meta":314,"style":314},"final stagingConfig = prodConfig.copyWith(\n  redirectUri: 'myapp-staging://auth/callback',\n);\n",[274,2012,2013,2031,2043],{"__ignoreMap":314},[342,2014,2015,2017,2020,2022,2025,2027,2029],{"class":344,"line":345},[342,2016,1018],{"class":358},[342,2018,2019],{"class":351}," stagingConfig ",[342,2021,608],{"class":368},[342,2023,2024],{"class":351}," prodConfig",[342,2026,983],{"class":368},[342,2028,1999],{"class":1362},[342,2030,1029],{"class":351},[342,2032,2033,2036,2038,2041],{"class":344,"line":355},[342,2034,2035],{"class":351},"  redirectUri",[342,2037,729],{"class":368},[342,2039,2040],{"class":1003}," 'myapp-staging://auth/callback'",[342,2042,369],{"class":368},[342,2044,2045,2047],{"class":344,"line":372},[342,2046,736],{"class":351},[342,2048,1007],{"class":368},[300,2050],{},[303,2052,2054],{"id":2053},"see-also","See also",[2056,2057,2058,2065,2071,2077,2083],"ul",{},[2059,2060,2061,2064],"li",{},[321,2062,2063],{"href":103},"GoogleProvider →"," — prebuilt Google Sign-In",[2059,2066,2067,2070],{},[321,2068,2069],{"href":107},"GitHubOAuth2Provider →"," — prebuilt GitHub OAuth",[2059,2072,2073,2076],{},[321,2074,2075],{"href":111},"AppleProvider →"," — Sign in with Apple",[2059,2078,2079,2082],{},[321,2080,2081],{"href":115},"ProxyOAuthProvider →"," — backend-delegated flow",[2059,2084,2085,2088],{},[321,2086,2087],{"href":171},"Flutter Setup →"," — OAuth2 deep-link wiring",[2090,2091,2092],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}",{"title":314,"searchDepth":355,"depth":355,"links":2094},[2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106],{"id":305,"depth":355,"text":306},{"id":332,"depth":355,"text":333},{"id":447,"depth":355,"text":424},{"id":988,"depth":355,"text":989},{"id":1318,"depth":355,"text":1319},{"id":1565,"depth":355,"text":1566},{"id":1678,"depth":355,"text":1679},{"id":1818,"depth":355,"text":1819},{"id":1851,"depth":355,"text":1852},{"id":1929,"depth":355,"text":1930},{"id":1998,"depth":355,"text":1999},{"id":2053,"depth":355,"text":2054},"Generic OAuth 2.0 Authorization Code provider with PKCE for any identity provider.","md",null,{},{"title":2112,"description":2113},"OAuth2 Provider | Authyra","Use OAuth2Provider to integrate any OAuth 2.0 identity provider — Discord, LinkedIn, Spotify, or your own — with full PKCE support.","icuhfqK45RiOzHlGuG4w5276lYhFiElph_MuHj9vxZI",[2116,2118],{"title":94,"path":95,"stem":96,"description":2117,"children":-1},"Email/password and any form-based authentication with CredentialsProvider.",{"title":102,"path":103,"stem":104,"description":2119,"children":-1},"Prebuilt Google Sign-In using OAuth 2.0 Authorization Code flow with PKCE.",1782700510223]