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