[{"data":1,"prerenderedAt":1616},["ShallowReactive",2],{"navigation_docs":3,"-providers-github":265,"-providers-github-surround":1611},[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":106,"body":267,"description":1603,"extension":1604,"links":1605,"meta":1606,"navigation":609,"path":107,"seo":1607,"stem":108,"__hash__":1610},"docs/3.providers/4.github.md",{"type":268,"value":269,"toc":1588},"minimark",[270,291,301,304,309,420,501,508,515,517,521,526,540,564,574,578,894,898,907,944,952,1002,1004,1008,1143,1145,1149,1359,1361,1364,1370,1439,1447,1449,1453,1462,1471,1473,1477,1498,1500,1503,1508,1519,1526,1535,1540,1558,1560,1564,1584],[271,272,273,277,278,281,282,285,286,290],"p",{},[274,275,276],"code",{},"GitHubOAuth2Provider"," is a prebuilt ",[274,279,280],{},"OAuth2Provider"," subclass for GitHub OAuth Apps. GitHub does not support PKCE, so a ",[274,283,284],{},"clientSecret"," is required. For production mobile apps where embedding a secret is a concern, use ",[287,288,289],"a",{"href":115},"ProxyOAuthProvider"," instead.",[271,292,293,297,298],{},[294,295,296],"strong",{},"Package",": ",[274,299,300],{},"authyra_flutter",[302,303],"hr",{},[305,306,308],"h2",{"id":307},"constructor","Constructor",[310,311,316],"pre",{"className":312,"code":313,"language":314,"meta":315,"style":315},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","GitHubOAuth2Provider({\n  required String clientId,\n  required String clientSecret,\n  String redirectUri = 'authyra://callback',\n  List\u003CString> scopes = const ['user', 'user:email'],\n})\n","dart","",[274,317,318,330,347,359,377,414],{"__ignoreMap":315},[319,320,323,326],"span",{"class":321,"line":322},"line",1,[319,324,276],{"class":325},"sBMFI",[319,327,329],{"class":328},"sTEyZ","({\n",[319,331,333,337,340,343],{"class":321,"line":332},2,[319,334,336],{"class":335},"spNyl","  required",[319,338,339],{"class":325}," String",[319,341,342],{"class":328}," clientId",[319,344,346],{"class":345},"sMK4o",",\n",[319,348,350,352,354,357],{"class":321,"line":349},3,[319,351,336],{"class":335},[319,353,339],{"class":325},[319,355,356],{"class":328}," clientSecret",[319,358,346],{"class":345},[319,360,362,365,368,371,375],{"class":321,"line":361},4,[319,363,364],{"class":325},"  String",[319,366,367],{"class":328}," redirectUri ",[319,369,370],{"class":345},"=",[319,372,374],{"class":373},"sfazB"," 'authyra://callback'",[319,376,346],{"class":345},[319,378,380,383,386,389,392,394,397,400,403,406,409,412],{"class":321,"line":379},5,[319,381,382],{"class":325},"  List",[319,384,385],{"class":328},"\u003C",[319,387,388],{"class":325},"String",[319,390,391],{"class":328},"> scopes ",[319,393,370],{"class":345},[319,395,396],{"class":335}," const",[319,398,399],{"class":328}," [",[319,401,402],{"class":373},"'user'",[319,404,405],{"class":345},",",[319,407,408],{"class":373}," 'user:email'",[319,410,411],{"class":328},"]",[319,413,346],{"class":345},[319,415,417],{"class":321,"line":416},6,[319,418,419],{"class":328},"})\n",[421,422,423,439],"table",{},[424,425,426],"thead",{},[427,428,429,433,436],"tr",{},[430,431,432],"th",{},"Parameter",[430,434,435],{},"Default",[430,437,438],{},"Description",[440,441,442,456,467,486],"tbody",{},[427,443,444,450,453],{},[445,446,447],"td",{},[274,448,449],{},"clientId",[445,451,452],{},"required",[445,454,455],{},"OAuth App client ID from GitHub Developer Settings",[427,457,458,462,464],{},[445,459,460],{},[274,461,284],{},[445,463,452],{},[445,465,466],{},"OAuth App client secret — GitHub requires this because PKCE is not supported",[427,468,469,474,479],{},[445,470,471],{},[274,472,473],{},"redirectUri",[445,475,476],{},[274,477,478],{},"'authyra://callback'",[445,480,481,482,485],{},"Must exactly match the ",[294,483,484],{},"Authorization callback URL"," in GitHub settings",[427,487,488,493,498],{},[445,489,490],{},[274,491,492],{},"scopes",[445,494,495],{},[274,496,497],{},"['user', 'user:email']",[445,499,500],{},"GitHub OAuth scopes to request",[271,502,503,504,507],{},"The provider ID is ",[274,505,506],{},"'github'",".",[509,510,512,513,507],"callout",{"icon":511},"i-lucide-shield","Embedding a client secret in a Flutter app exposes it to extraction from the binary. For production mobile apps, route the OAuth exchange through your backend using ",[287,514,289],{"href":115},[302,516],{},[305,518,520],{"id":519},"setup","Setup",[522,523,525],"h3",{"id":524},"_1-create-a-github-oauth-app","1. Create a GitHub OAuth App",[271,527,528,529,535,536,539],{},"Go to ",[287,530,534],{"href":531,"rel":532},"https://github.com/settings/developers",[533],"nofollow","GitHub Developer Settings → OAuth Apps"," → ",[294,537,538],{},"New OAuth App",":",[541,542,543,550,556],"ul",{},[544,545,546,549],"li",{},[294,547,548],{},"Application name",": your app name",[544,551,552,555],{},[294,553,554],{},"Homepage URL",": your website",[544,557,558,297,560,563],{},[294,559,484],{},[274,561,562],{},"authyra://callback"," (or your custom scheme)",[271,565,566,567,570,571,507],{},"Note the ",[294,568,569],{},"Client ID"," and ",[294,572,573],{},"Client secret",[522,575,577],{"id":576},"_2-add-the-provider","2. Add the provider",[310,579,582],{"className":312,"code":580,"filename":581,"language":314,"meta":315,"style":315},"import 'package:app_links/app_links.dart';\nimport 'package:authyra_flutter/authyra_flutter.dart';\n\nFuture\u003Cvoid> main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  final githubProvider = GitHubOAuth2Provider(\n    clientId:     'YOUR_GITHUB_CLIENT_ID',\n    clientSecret: 'YOUR_GITHUB_CLIENT_SECRET',\n    redirectUri:  'authyra://callback',\n  );\n\n  // Register before Authyra.initialize\n  OAuth2CallbackHandler.registerProvider('authyra', githubProvider);\n  AppLinks().uriLinkStream.listen(OAuth2CallbackHandler.handleCallback);\n\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [githubProvider],\n      storage: SecureAuthStorage(),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n","lib/main.dart",[274,583,584,596,605,611,638,653,657,674,687,700,713,721,726,733,757,787,792,808,821,834,849,857,864,869,888],{"__ignoreMap":315},[319,585,586,590,593],{"class":321,"line":322},[319,587,589],{"class":588},"sbssI","import",[319,591,592],{"class":373}," 'package:app_links/app_links.dart'",[319,594,595],{"class":345},";\n",[319,597,598,600,603],{"class":321,"line":332},[319,599,589],{"class":588},[319,601,602],{"class":373}," 'package:authyra_flutter/authyra_flutter.dart'",[319,604,595],{"class":345},[319,606,607],{"class":321,"line":349},[319,608,610],{"emptyLinePlaceholder":609},true,"\n",[319,612,613,616,618,621,624,628,631,635],{"class":321,"line":361},[319,614,615],{"class":325},"Future",[319,617,385],{"class":328},[319,619,620],{"class":335},"void",[319,622,623],{"class":328},"> ",[319,625,627],{"class":626},"s2Zo4","main",[319,629,630],{"class":328},"() ",[319,632,634],{"class":633},"s7zQu","async",[319,636,637],{"class":328}," {\n",[319,639,640,643,645,648,651],{"class":321,"line":379},[319,641,642],{"class":325},"  WidgetsFlutterBinding",[319,644,507],{"class":345},[319,646,647],{"class":626},"ensureInitialized",[319,649,650],{"class":328},"()",[319,652,595],{"class":345},[319,654,655],{"class":321,"line":416},[319,656,610],{"emptyLinePlaceholder":609},[319,658,660,663,666,668,671],{"class":321,"line":659},7,[319,661,662],{"class":335},"  final",[319,664,665],{"class":328}," githubProvider ",[319,667,370],{"class":345},[319,669,670],{"class":325}," GitHubOAuth2Provider",[319,672,673],{"class":328},"(\n",[319,675,677,680,682,685],{"class":321,"line":676},8,[319,678,679],{"class":328},"    clientId",[319,681,539],{"class":345},[319,683,684],{"class":373},"     'YOUR_GITHUB_CLIENT_ID'",[319,686,346],{"class":345},[319,688,690,693,695,698],{"class":321,"line":689},9,[319,691,692],{"class":328},"    clientSecret",[319,694,539],{"class":345},[319,696,697],{"class":373}," 'YOUR_GITHUB_CLIENT_SECRET'",[319,699,346],{"class":345},[319,701,703,706,708,711],{"class":321,"line":702},10,[319,704,705],{"class":328},"    redirectUri",[319,707,539],{"class":345},[319,709,710],{"class":373},"  'authyra://callback'",[319,712,346],{"class":345},[319,714,716,719],{"class":321,"line":715},11,[319,717,718],{"class":328},"  )",[319,720,595],{"class":345},[319,722,724],{"class":321,"line":723},12,[319,725,610],{"emptyLinePlaceholder":609},[319,727,729],{"class":321,"line":728},13,[319,730,732],{"class":731},"sHwdD","  // Register before Authyra.initialize\n",[319,734,736,739,741,744,747,750,752,755],{"class":321,"line":735},14,[319,737,738],{"class":325},"  OAuth2CallbackHandler",[319,740,507],{"class":345},[319,742,743],{"class":626},"registerProvider",[319,745,746],{"class":328},"(",[319,748,749],{"class":373},"'authyra'",[319,751,405],{"class":345},[319,753,754],{"class":328}," githubProvider)",[319,756,595],{"class":345},[319,758,760,763,765,767,770,772,775,777,780,782,785],{"class":321,"line":759},15,[319,761,762],{"class":325},"  AppLinks",[319,764,650],{"class":328},[319,766,507],{"class":345},[319,768,769],{"class":328},"uriLinkStream",[319,771,507],{"class":345},[319,773,774],{"class":626},"listen",[319,776,746],{"class":328},[319,778,779],{"class":325},"OAuth2CallbackHandler",[319,781,507],{"class":345},[319,783,784],{"class":328},"handleCallback)",[319,786,595],{"class":345},[319,788,790],{"class":321,"line":789},16,[319,791,610],{"emptyLinePlaceholder":609},[319,793,795,798,801,803,806],{"class":321,"line":794},17,[319,796,797],{"class":633},"  await",[319,799,800],{"class":325}," Authyra",[319,802,507],{"class":345},[319,804,805],{"class":626},"initialize",[319,807,673],{"class":328},[319,809,811,814,816,819],{"class":321,"line":810},18,[319,812,813],{"class":328},"    client",[319,815,539],{"class":345},[319,817,818],{"class":325}," AuthyraClient",[319,820,673],{"class":328},[319,822,824,827,829,832],{"class":321,"line":823},19,[319,825,826],{"class":328},"      providers",[319,828,539],{"class":345},[319,830,831],{"class":328}," [githubProvider]",[319,833,346],{"class":345},[319,835,837,840,842,845,847],{"class":321,"line":836},20,[319,838,839],{"class":328},"      storage",[319,841,539],{"class":345},[319,843,844],{"class":325}," SecureAuthStorage",[319,846,650],{"class":328},[319,848,346],{"class":345},[319,850,852,855],{"class":321,"line":851},21,[319,853,854],{"class":328},"    )",[319,856,346],{"class":345},[319,858,860,862],{"class":321,"line":859},22,[319,861,718],{"class":328},[319,863,595],{"class":345},[319,865,867],{"class":321,"line":866},23,[319,868,610],{"emptyLinePlaceholder":609},[319,870,872,875,877,880,883,886],{"class":321,"line":871},24,[319,873,874],{"class":626},"  runApp",[319,876,746],{"class":328},[319,878,879],{"class":335},"const",[319,881,882],{"class":325}," MyApp",[319,884,885],{"class":328},"())",[319,887,595],{"class":345},[319,889,891],{"class":321,"line":890},25,[319,892,893],{"class":328},"}\n",[522,895,897],{"id":896},"_3-platform-deep-link-config","3. Platform deep-link config",[271,899,900,903,904,539],{},[294,901,902],{},"Android"," — ",[274,905,906],{},"android/app/src/main/AndroidManifest.xml",[310,908,912],{"className":909,"code":910,"language":911,"meta":315,"style":315},"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=\"authyra\" />\n\u003C/intent-filter>\n","xml",[274,913,914,919,924,929,934,939],{"__ignoreMap":315},[319,915,916],{"class":321,"line":322},[319,917,918],{},"\u003Cintent-filter>\n",[319,920,921],{"class":321,"line":332},[319,922,923],{},"  \u003Caction android:name=\"android.intent.action.VIEW\" />\n",[319,925,926],{"class":321,"line":349},[319,927,928],{},"  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n",[319,930,931],{"class":321,"line":361},[319,932,933],{},"  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n",[319,935,936],{"class":321,"line":379},[319,937,938],{},"  \u003Cdata android:scheme=\"authyra\" />\n",[319,940,941],{"class":321,"line":416},[319,942,943],{},"\u003C/intent-filter>\n",[271,945,946,903,949,539],{},[294,947,948],{},"iOS",[274,950,951],{},"ios/Runner/Info.plist",[310,953,955],{"className":909,"code":954,"language":911,"meta":315,"style":315},"\u003Ckey>CFBundleURLTypes\u003C/key>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleURLSchemes\u003C/key>\n    \u003Carray>\n      \u003Cstring>authyra\u003C/string>\n    \u003C/array>\n  \u003C/dict>\n\u003C/array>\n",[274,956,957,962,967,972,977,982,987,992,997],{"__ignoreMap":315},[319,958,959],{"class":321,"line":322},[319,960,961],{},"\u003Ckey>CFBundleURLTypes\u003C/key>\n",[319,963,964],{"class":321,"line":332},[319,965,966],{},"\u003Carray>\n",[319,968,969],{"class":321,"line":349},[319,970,971],{},"  \u003Cdict>\n",[319,973,974],{"class":321,"line":361},[319,975,976],{},"    \u003Ckey>CFBundleURLSchemes\u003C/key>\n",[319,978,979],{"class":321,"line":379},[319,980,981],{},"    \u003Carray>\n",[319,983,984],{"class":321,"line":416},[319,985,986],{},"      \u003Cstring>authyra\u003C/string>\n",[319,988,989],{"class":321,"line":659},[319,990,991],{},"    \u003C/array>\n",[319,993,994],{"class":321,"line":676},[319,995,996],{},"  \u003C/dict>\n",[319,998,999],{"class":321,"line":689},[319,1000,1001],{},"\u003C/array>\n",[302,1003],{},[305,1005,1007],{"id":1006},"sign-in","Sign in",[310,1009,1011],{"className":312,"code":1010,"language":314,"meta":315,"style":315},"try {\n  final user = await Authyra.instance.signIn('github');\n  print('Signed in as ${user.name}');\n} on AuthenticationCancelledException {\n  // User closed the browser\n} on AuthenticationFailedException catch (e) {\n  print('GitHub sign-in failed: $e');\n}\n",[274,1012,1013,1020,1053,1085,1098,1103,1118,1139],{"__ignoreMap":315},[319,1014,1015,1018],{"class":321,"line":322},[319,1016,1017],{"class":633},"try",[319,1019,637],{"class":328},[319,1021,1022,1024,1027,1029,1032,1034,1036,1039,1041,1044,1046,1048,1051],{"class":321,"line":332},[319,1023,662],{"class":335},[319,1025,1026],{"class":328}," user ",[319,1028,370],{"class":345},[319,1030,1031],{"class":633}," await",[319,1033,800],{"class":325},[319,1035,507],{"class":345},[319,1037,1038],{"class":328},"instance",[319,1040,507],{"class":345},[319,1042,1043],{"class":626},"signIn",[319,1045,746],{"class":328},[319,1047,506],{"class":373},[319,1049,1050],{"class":328},")",[319,1052,595],{"class":345},[319,1054,1055,1058,1060,1063,1066,1070,1072,1075,1078,1081,1083],{"class":321,"line":349},[319,1056,1057],{"class":626},"  print",[319,1059,746],{"class":328},[319,1061,1062],{"class":373},"'Signed in as ",[319,1064,1065],{"class":328},"${",[319,1067,1069],{"class":1068},"sHdIc","user",[319,1071,507],{"class":328},[319,1073,1074],{"class":1068},"name",[319,1076,1077],{"class":328},"}",[319,1079,1080],{"class":373},"'",[319,1082,1050],{"class":328},[319,1084,595],{"class":345},[319,1086,1087,1090,1093,1096],{"class":321,"line":361},[319,1088,1089],{"class":328},"} ",[319,1091,1092],{"class":633},"on",[319,1094,1095],{"class":325}," AuthenticationCancelledException",[319,1097,637],{"class":328},[319,1099,1100],{"class":321,"line":379},[319,1101,1102],{"class":731},"  // User closed the browser\n",[319,1104,1105,1107,1109,1112,1115],{"class":321,"line":416},[319,1106,1089],{"class":328},[319,1108,1092],{"class":633},[319,1110,1111],{"class":325}," AuthenticationFailedException",[319,1113,1114],{"class":633}," catch",[319,1116,1117],{"class":328}," (e) {\n",[319,1119,1120,1122,1124,1127,1130,1133,1135,1137],{"class":321,"line":659},[319,1121,1057],{"class":626},[319,1123,746],{"class":328},[319,1125,1126],{"class":373},"'GitHub sign-in failed: ",[319,1128,1129],{"class":328},"$",[319,1131,1132],{"class":1068},"e",[319,1134,1080],{"class":373},[319,1136,1050],{"class":328},[319,1138,595],{"class":345},[319,1140,1141],{"class":321,"line":676},[319,1142,893],{"class":328},[302,1144],{},[305,1146,1148],{"id":1147},"user-fields","User fields",[421,1150,1151,1167],{},[424,1152,1153],{},[427,1154,1155,1161,1164],{},[430,1156,1157,1160],{},[274,1158,1159],{},"AuthUser"," field",[430,1162,1163],{},"GitHub field",[430,1165,1166],{},"Notes",[440,1168,1169,1184,1202,1219,1233,1247,1261,1275,1289,1303,1317,1331,1345],{},[427,1170,1171,1176,1181],{},[445,1172,1173],{},[274,1174,1175],{},"id",[445,1177,1178,1180],{},[274,1179,1175],{}," (int → String)",[445,1182,1183],{},"Stable numeric user ID converted to String",[427,1185,1186,1191,1195],{},[445,1187,1188],{},[274,1189,1190],{},"email",[445,1192,1193],{},[274,1194,1190],{},[445,1196,1197,1198,1201],{},"May be ",[274,1199,1200],{},"null"," if the user's email is private",[427,1203,1204,1208,1216],{},[445,1205,1206],{},[274,1207,1074],{},[445,1209,1210,1212,1213],{},[274,1211,1074],{}," or ",[274,1214,1215],{},"login",[445,1217,1218],{},"Falls back to username if display name is unset",[427,1220,1221,1226,1231],{},[445,1222,1223],{},[274,1224,1225],{},"avatarUrl",[445,1227,1228],{},[274,1229,1230],{},"avatar_url",[445,1232],{},[427,1234,1235,1240,1244],{},[445,1236,1237],{},[274,1238,1239],{},"metadata['login']",[445,1241,1242],{},[274,1243,1215],{},[445,1245,1246],{},"GitHub username",[427,1248,1249,1254,1259],{},[445,1250,1251],{},[274,1252,1253],{},"metadata['bio']",[445,1255,1256],{},[274,1257,1258],{},"bio",[445,1260],{},[427,1262,1263,1268,1273],{},[445,1264,1265],{},[274,1266,1267],{},"metadata['company']",[445,1269,1270],{},[274,1271,1272],{},"company",[445,1274],{},[427,1276,1277,1282,1287],{},[445,1278,1279],{},[274,1280,1281],{},"metadata['location']",[445,1283,1284],{},[274,1285,1286],{},"location",[445,1288],{},[427,1290,1291,1296,1301],{},[445,1292,1293],{},[274,1294,1295],{},"metadata['blog']",[445,1297,1298],{},[274,1299,1300],{},"blog",[445,1302],{},[427,1304,1305,1310,1315],{},[445,1306,1307],{},[274,1308,1309],{},"metadata['twitter_username']",[445,1311,1312],{},[274,1313,1314],{},"twitter_username",[445,1316],{},[427,1318,1319,1324,1329],{},[445,1320,1321],{},[274,1322,1323],{},"metadata['public_repos']",[445,1325,1326],{},[274,1327,1328],{},"public_repos",[445,1330],{},[427,1332,1333,1338,1343],{},[445,1334,1335],{},[274,1336,1337],{},"metadata['followers']",[445,1339,1340],{},[274,1341,1342],{},"followers",[445,1344],{},[427,1346,1347,1352,1357],{},[445,1348,1349],{},[274,1350,1351],{},"metadata['following']",[445,1353,1354],{},[274,1355,1356],{},"following",[445,1358],{},[302,1360],{},[305,1362,1363],{"id":492},"Scopes",[271,1365,1366,1367,1369],{},"Default scopes: ",[274,1368,497],{},". Add repository or organization access as needed:",[310,1371,1373],{"className":312,"code":1372,"language":314,"meta":315,"style":315},"GitHubOAuth2Provider(\n  clientId:     'YOUR_CLIENT_ID',\n  clientSecret: 'YOUR_CLIENT_SECRET',\n  scopes: ['user', 'user:email', 'repo', 'read:org'],\n)\n",[274,1374,1375,1381,1393,1405,1434],{"__ignoreMap":315},[319,1376,1377,1379],{"class":321,"line":322},[319,1378,276],{"class":325},[319,1380,673],{"class":328},[319,1382,1383,1386,1388,1391],{"class":321,"line":332},[319,1384,1385],{"class":328},"  clientId",[319,1387,539],{"class":345},[319,1389,1390],{"class":373},"     'YOUR_CLIENT_ID'",[319,1392,346],{"class":345},[319,1394,1395,1398,1400,1403],{"class":321,"line":349},[319,1396,1397],{"class":328},"  clientSecret",[319,1399,539],{"class":345},[319,1401,1402],{"class":373}," 'YOUR_CLIENT_SECRET'",[319,1404,346],{"class":345},[319,1406,1407,1410,1412,1414,1416,1418,1420,1422,1425,1427,1430,1432],{"class":321,"line":361},[319,1408,1409],{"class":328},"  scopes",[319,1411,539],{"class":345},[319,1413,399],{"class":328},[319,1415,402],{"class":373},[319,1417,405],{"class":345},[319,1419,408],{"class":373},[319,1421,405],{"class":345},[319,1423,1424],{"class":373}," 'repo'",[319,1426,405],{"class":345},[319,1428,1429],{"class":373}," 'read:org'",[319,1431,411],{"class":328},[319,1433,346],{"class":345},[319,1435,1436],{"class":321,"line":379},[319,1437,1438],{"class":328},")\n",[271,1440,1441,1442,507],{},"See the full list at ",[287,1443,1446],{"href":1444,"rel":1445},"https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/scopes-for-oauth-apps",[533],"GitHub OAuth scopes",[302,1448],{},[305,1450,1452],{"id":1451},"token-refresh","Token refresh",[271,1454,1455,1456,1458,1459,507],{},"GitHub access tokens are long-lived and do not expire by default. ",[274,1457,276],{}," sets ",[274,1460,1461],{},"supportsRefresh: false",[271,1463,1464,1465,1467,1468,507],{},"If you enable expiring tokens in your GitHub App settings, implement a custom ",[274,1466,212],{}," that calls GitHub's token refresh endpoint and returns an ",[274,1469,1470],{},"AuthTokenResult",[302,1472],{},[305,1474,1476],{"id":1475},"private-email","Private email",[271,1478,1479,1480,1483,1484,1486,1487,1489,1490,1493,1494,1497],{},"If a user's email is set to private on GitHub, the ",[274,1481,1482],{},"/user"," API returns ",[274,1485,1200],{}," for ",[274,1488,1190],{},". To reliably get the user's primary email, add the ",[274,1491,1492],{},"user:email"," scope (included in defaults) and call the ",[274,1495,1496],{},"/user/emails"," endpoint separately.",[302,1499],{},[305,1501,254],{"id":1502},"troubleshooting",[271,1504,1505],{},[294,1506,1507],{},"\"redirect_uri_mismatch\" from GitHub",[271,1509,1510,1511,1513,1514,1516,1517,507],{},"The ",[274,1512,473],{}," in ",[274,1515,276],{}," must match exactly what is set in GitHub Developer Settings → ",[294,1518,484],{},[271,1520,1521],{},[294,1522,1523,1525],{},[274,1524,1190],{}," is null after sign-in",[271,1527,1528,1529,1531,1532,1534],{},"The user has set their email to private. Add ",[274,1530,1492],{}," to scopes (it is included by default) but also call GitHub's ",[274,1533,1496],{}," API to get the verified primary email.",[271,1536,1537],{},[294,1538,1539],{},"Callback never arrives on iOS",[271,1541,1542,1543,1546,1547,1550,1551,1553,1554,1557],{},"Verify the ",[274,1544,1545],{},"CFBundleURLSchemes"," entry in ",[274,1548,1549],{},"Info.plist"," matches the scheme in your ",[274,1552,473],{}," (the part before ",[274,1555,1556],{},"://",").",[302,1559],{},[305,1561,1563],{"id":1562},"see-also","See also",[541,1565,1566,1572,1578],{},[544,1567,1568,1571],{},[287,1569,1570],{"href":115},"ProxyOAuthProvider →"," — keep the client secret server-side (recommended for production mobile)",[544,1573,1574,1577],{},[287,1575,1576],{"href":99},"OAuth2Provider →"," — base class and custom providers",[544,1579,1580,1583],{},[287,1581,1582],{"href":171},"Flutter Setup →"," — deep-link wiring",[1585,1586,1587],"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 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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":315,"searchDepth":332,"depth":332,"links":1589},[1590,1591,1596,1597,1598,1599,1600,1601,1602],{"id":307,"depth":332,"text":308},{"id":519,"depth":332,"text":520,"children":1592},[1593,1594,1595],{"id":524,"depth":349,"text":525},{"id":576,"depth":349,"text":577},{"id":896,"depth":349,"text":897},{"id":1006,"depth":332,"text":1007},{"id":1147,"depth":332,"text":1148},{"id":492,"depth":332,"text":1363},{"id":1451,"depth":332,"text":1452},{"id":1475,"depth":332,"text":1476},{"id":1502,"depth":332,"text":254},{"id":1562,"depth":332,"text":1563},"Prebuilt GitHub OAuth provider — Authorization Code flow with client secret.","md",null,{},{"title":1608,"description":1609},"GitHub Provider | Authyra","Add GitHub OAuth sign-in to your Flutter app with GitHubOAuth2Provider — setup, scopes, deep-link wiring, and security notes.","uDZm-GS4Hm5RWKLmad5NBCFykWhIyDcO0pESUwclHys",[1612,1614],{"title":102,"path":103,"stem":104,"description":1613,"children":-1},"Prebuilt Google Sign-In using OAuth 2.0 Authorization Code flow with PKCE.",{"title":110,"path":111,"stem":112,"description":1615,"children":-1},"Sign in with Apple — OAuth 2.0 with PKCE, dynamic ES256 client secret, and id_token user extraction.",1782700510373]