[{"data":1,"prerenderedAt":1215},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-configuration":265,"-getting-started-configuration-surround":1210},[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":26,"body":267,"description":1201,"extension":1202,"links":1203,"meta":1204,"navigation":1205,"path":27,"seo":1206,"stem":28,"__hash__":1209},"docs/1.getting-started/5.configuration.md",{"type":268,"value":269,"toc":1190},"minimark",[270,281,284,289,369,441,443,447,455,589,591,596,604,617,669,671,676,682,703,709,797,807,832,834,839,845,885,895,913,916,918,924,927,1014,1016,1020,1025,1084,1090,1092,1096,1160,1162,1166,1186],[271,272,273,277,278,280],"p",{},[274,275,276],"code",{},"AuthConfig"," is an immutable value object passed to ",[274,279,199],{}," to control token lifecycle behaviour. All fields have sensible defaults — only override what your app needs.",[282,283],"hr",{},[285,286,288],"h2",{"id":287},"defaults","Defaults",[290,291,296],"pre",{"className":292,"code":293,"language":294,"meta":295,"style":295},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const AuthConfig(\n  tokenLifetime:      3600,  // 1 hour\n  autoRefresh:        true,\n  refreshBeforeExpiry: 300,  // 5 minutes\n)\n","dart","",[274,297,298,315,336,347,363],{"__ignoreMap":295},[299,300,303,307,311],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"spNyl","const",[299,308,310],{"class":309},"sBMFI"," AuthConfig",[299,312,314],{"class":313},"sTEyZ","(\n",[299,316,318,321,325,329,332],{"class":301,"line":317},2,[299,319,320],{"class":313},"  tokenLifetime",[299,322,324],{"class":323},"sMK4o",":",[299,326,328],{"class":327},"sbssI","      3600",[299,330,331],{"class":323},",",[299,333,335],{"class":334},"sHwdD","  // 1 hour\n",[299,337,339,342,344],{"class":301,"line":338},3,[299,340,341],{"class":313},"  autoRefresh",[299,343,324],{"class":323},[299,345,346],{"class":323},"        true,\n",[299,348,350,353,355,358,360],{"class":301,"line":349},4,[299,351,352],{"class":313},"  refreshBeforeExpiry",[299,354,324],{"class":323},[299,356,357],{"class":327}," 300",[299,359,331],{"class":323},[299,361,362],{"class":334},"  // 5 minutes\n",[299,364,366],{"class":301,"line":365},5,[299,367,368],{"class":313},")\n",[370,371,372,388],"table",{},[373,374,375],"thead",{},[376,377,378,382,385],"tr",{},[379,380,381],"th",{},"Field",[379,383,384],{},"Default",[379,386,387],{},"Description",[389,390,391,411,426],"tbody",{},[376,392,393,399,405],{},[394,395,396],"td",{},[274,397,398],{},"tokenLifetime",[394,400,401,404],{},[274,402,403],{},"3600"," s",[394,406,407,408],{},"Fallback token lifetime when the provider does not return ",[274,409,410],{},"expires_in",[376,412,413,418,423],{},[394,414,415],{},[274,416,417],{},"autoRefresh",[394,419,420],{},[274,421,422],{},"true",[394,424,425],{},"Schedule a silent refresh before the token expires",[376,427,428,433,438],{},[394,429,430],{},[274,431,432],{},"refreshBeforeExpiry",[394,434,435,404],{},[274,436,437],{},"300",[394,439,440],{},"How many seconds before expiry to trigger the proactive refresh",[282,442],{},[285,444,446],{"id":445},"usage","Usage",[271,448,449,450,452,453,324],{},"Pass ",[274,451,276],{}," when constructing ",[274,454,199],{},[290,456,458],{"className":292,"code":457,"language":294,"meta":295,"style":295},"await Authyra.initialize(\n  client: AuthyraClient(\n    providers: [myProvider],\n    storage: SecureAuthStorage(),\n    config: const AuthConfig(\n      tokenLifetime:       1800,  // 30-minute tokens\n      refreshBeforeExpiry:  120,  // Refresh 2 minutes early\n    ),\n  ),\n);\n",[274,459,460,478,490,503,518,532,548,564,572,580],{"__ignoreMap":295},[299,461,462,466,469,472,476],{"class":301,"line":302},[299,463,465],{"class":464},"s7zQu","await",[299,467,468],{"class":309}," Authyra",[299,470,471],{"class":323},".",[299,473,475],{"class":474},"s2Zo4","initialize",[299,477,314],{"class":313},[299,479,480,483,485,488],{"class":301,"line":317},[299,481,482],{"class":313},"  client",[299,484,324],{"class":323},[299,486,487],{"class":309}," AuthyraClient",[299,489,314],{"class":313},[299,491,492,495,497,500],{"class":301,"line":338},[299,493,494],{"class":313},"    providers",[299,496,324],{"class":323},[299,498,499],{"class":313}," [myProvider]",[299,501,502],{"class":323},",\n",[299,504,505,508,510,513,516],{"class":301,"line":349},[299,506,507],{"class":313},"    storage",[299,509,324],{"class":323},[299,511,512],{"class":309}," SecureAuthStorage",[299,514,515],{"class":313},"()",[299,517,502],{"class":323},[299,519,520,523,525,528,530],{"class":301,"line":365},[299,521,522],{"class":313},"    config",[299,524,324],{"class":323},[299,526,527],{"class":305}," const",[299,529,310],{"class":309},[299,531,314],{"class":313},[299,533,535,538,540,543,545],{"class":301,"line":534},6,[299,536,537],{"class":313},"      tokenLifetime",[299,539,324],{"class":323},[299,541,542],{"class":327},"       1800",[299,544,331],{"class":323},[299,546,547],{"class":334},"  // 30-minute tokens\n",[299,549,551,554,556,559,561],{"class":301,"line":550},7,[299,552,553],{"class":313},"      refreshBeforeExpiry",[299,555,324],{"class":323},[299,557,558],{"class":327},"  120",[299,560,331],{"class":323},[299,562,563],{"class":334},"  // Refresh 2 minutes early\n",[299,565,567,570],{"class":301,"line":566},8,[299,568,569],{"class":313},"    )",[299,571,502],{"class":323},[299,573,575,578],{"class":301,"line":574},9,[299,576,577],{"class":313},"  )",[299,579,502],{"class":323},[299,581,583,586],{"class":301,"line":582},10,[299,584,585],{"class":313},")",[299,587,588],{"class":323},";\n",[282,590],{},[285,592,594],{"id":593},"tokenlifetime",[274,595,398],{},[271,597,598,599,603],{},"The nominal lifetime of an access token in seconds, used as a ",[600,601,602],"strong",{},"fallback"," when the provider's sign-in response does not include an explicit expiry.",[271,605,606,607,609,610,613,614,616],{},"When a provider returns ",[274,608,410],{}," (OAuth2) or ",[274,611,612],{},"expiresAt"," (credentials), the server-reported value always takes precedence. ",[274,615,398],{}," only applies when expiry information is absent.",[290,618,620],{"className":292,"code":619,"language":294,"meta":295,"style":295},"// 30-minute tokens for a high-security backend\nconst AuthConfig(tokenLifetime: 1800)\n\n// 24-hour tokens for a long-lived session API\nconst AuthConfig(tokenLifetime: 86400)\n",[274,621,622,627,643,649,654],{"__ignoreMap":295},[299,623,624],{"class":301,"line":302},[299,625,626],{"class":334},"// 30-minute tokens for a high-security backend\n",[299,628,629,631,633,636,638,641],{"class":301,"line":317},[299,630,306],{"class":305},[299,632,310],{"class":309},[299,634,635],{"class":313},"(tokenLifetime",[299,637,324],{"class":323},[299,639,640],{"class":327}," 1800",[299,642,368],{"class":313},[299,644,645],{"class":301,"line":338},[299,646,648],{"emptyLinePlaceholder":647},true,"\n",[299,650,651],{"class":301,"line":349},[299,652,653],{"class":334},"// 24-hour tokens for a long-lived session API\n",[299,655,656,658,660,662,664,667],{"class":301,"line":365},[299,657,306],{"class":305},[299,659,310],{"class":309},[299,661,635],{"class":313},[299,663,324],{"class":323},[299,665,666],{"class":327}," 86400",[299,668,368],{"class":313},[282,670],{},[285,672,674],{"id":673},"autorefresh",[274,675,417],{},[271,677,678,679,681],{},"Controls whether ",[274,680,203],{}," proactively refreshes the access token before it expires.",[271,683,684,685,687,688,690,691,694,695,698,699,702],{},"When ",[274,686,422],{},", the instance schedules a timer that fires ",[274,689,432],{}," seconds before the token expires and silently calls ",[274,692,693],{},"provider.refreshToken()",". The ",[274,696,697],{},"authStateChanges"," stream emits an updated ",[274,700,701],{},"AuthState.authenticated"," with the fresh token — no user interaction needed.",[271,704,684,705,708],{},[274,706,707],{},"false",", token refresh is entirely manual:",[290,710,712],{"className":292,"code":711,"language":294,"meta":295,"style":295},"// Check and refresh manually\nfinal session = await Authyra.instance.getSession();\nif (session?.shouldRefresh ?? false) {\n  await Authyra.instance.refreshSession();\n}\n",[274,713,714,719,749,772,792],{"__ignoreMap":295},[299,715,716],{"class":301,"line":302},[299,717,718],{"class":334},"// Check and refresh manually\n",[299,720,721,724,727,730,733,735,737,740,742,745,747],{"class":301,"line":317},[299,722,723],{"class":305},"final",[299,725,726],{"class":313}," session ",[299,728,729],{"class":323},"=",[299,731,732],{"class":464}," await",[299,734,468],{"class":309},[299,736,471],{"class":323},[299,738,739],{"class":313},"instance",[299,741,471],{"class":323},[299,743,744],{"class":474},"getSession",[299,746,515],{"class":313},[299,748,588],{"class":323},[299,750,751,754,757,760,763,766,769],{"class":301,"line":338},[299,752,753],{"class":464},"if",[299,755,756],{"class":313}," (session",[299,758,759],{"class":323},"?.",[299,761,762],{"class":313},"shouldRefresh ",[299,764,765],{"class":323},"??",[299,767,768],{"class":323}," false",[299,770,771],{"class":313},") {\n",[299,773,774,777,779,781,783,785,788,790],{"class":301,"line":349},[299,775,776],{"class":464},"  await",[299,778,468],{"class":309},[299,780,471],{"class":323},[299,782,739],{"class":313},[299,784,471],{"class":323},[299,786,787],{"class":474},"refreshSession",[299,789,515],{"class":313},[299,791,588],{"class":323},[299,793,794],{"class":301,"line":365},[299,795,796],{"class":313},"}\n",[271,798,799,800,802,803,806],{},"Disable ",[274,801,417],{}," in ",[600,804,805],{},"backend and CLI"," contexts where no event loop is running continuously, or where you manage token renewal through your own middleware.",[290,808,810],{"className":292,"code":809,"language":294,"meta":295,"style":295},"// Backend service — manage refresh explicitly\nconst AuthConfig(autoRefresh: false)\n",[274,811,812,817],{"__ignoreMap":295},[299,813,814],{"class":301,"line":302},[299,815,816],{"class":334},"// Backend service — manage refresh explicitly\n",[299,818,819,821,823,826,828,830],{"class":301,"line":317},[299,820,306],{"class":305},[299,822,310],{"class":309},[299,824,825],{"class":313},"(autoRefresh",[299,827,324],{"class":323},[299,829,768],{"class":323},[299,831,368],{"class":313},[282,833],{},[285,835,837],{"id":836},"refreshbeforeexpiry",[274,838,432],{},[271,840,841,842,471],{},"How many seconds before the access token expires to trigger a proactive refresh. Only applies when ",[274,843,844],{},"autoRefresh: true",[290,846,848],{"className":292,"code":847,"language":294,"meta":295,"style":295},"const AuthConfig(\n  autoRefresh: true,\n  refreshBeforeExpiry: 120,  // Refresh 2 minutes before expiry\n)\n",[274,849,850,858,867,881],{"__ignoreMap":295},[299,851,852,854,856],{"class":301,"line":302},[299,853,306],{"class":305},[299,855,310],{"class":309},[299,857,314],{"class":313},[299,859,860,862,864],{"class":301,"line":317},[299,861,341],{"class":313},[299,863,324],{"class":323},[299,865,866],{"class":323}," true,\n",[299,868,869,871,873,876,878],{"class":301,"line":338},[299,870,352],{"class":313},[299,872,324],{"class":323},[299,874,875],{"class":327}," 120",[299,877,331],{"class":323},[299,879,880],{"class":334},"  // Refresh 2 minutes before expiry\n",[299,882,883],{"class":301,"line":349},[299,884,368],{"class":313},[271,886,887,888,891,892,324],{},"The underlying ",[274,889,890],{},"AuthSession.shouldRefresh"," predicate uses this value via ",[274,893,894],{},"AuthConfig.refreshThreshold",[290,896,898],{"className":292,"code":897,"language":294,"meta":295,"style":295},"session.shouldRefresh  // true when DateTime.now() > expiresAt - refreshThreshold\n",[274,899,900],{"__ignoreMap":295},[299,901,902,905,907,910],{"class":301,"line":302},[299,903,904],{"class":313},"session",[299,906,471],{"class":323},[299,908,909],{"class":313},"shouldRefresh  ",[299,911,912],{"class":334},"// true when DateTime.now() > expiresAt - refreshThreshold\n",[271,914,915],{},"A larger value gives more buffer against clock drift and network latency at the cost of slightly shorter effective token lifetimes. The default (300 s) works well for 1-hour tokens.",[282,917],{},[285,919,921],{"id":920},"copywith",[274,922,923],{},"copyWith",[271,925,926],{},"Derive environment-specific configs from a base:",[290,928,930],{"className":292,"code":929,"language":294,"meta":295,"style":295},"const base = AuthConfig();\n\n// Development — disable refresh to avoid background timers in tests\nfinal devConfig = base.copyWith(autoRefresh: false);\n\n// Production — shorter effective token window for higher security\nfinal prodConfig = base.copyWith(refreshBeforeExpiry: 120);\n",[274,931,932,948,952,957,981,985,990],{"__ignoreMap":295},[299,933,934,936,939,942,944,946],{"class":301,"line":302},[299,935,306],{"class":305},[299,937,938],{"class":323}," base",[299,940,941],{"class":323}," =",[299,943,310],{"class":309},[299,945,515],{"class":313},[299,947,588],{"class":323},[299,949,950],{"class":301,"line":317},[299,951,648],{"emptyLinePlaceholder":647},[299,953,954],{"class":301,"line":338},[299,955,956],{"class":334},"// Development — disable refresh to avoid background timers in tests\n",[299,958,959,961,964,966,969,971,973,975,977,979],{"class":301,"line":349},[299,960,723],{"class":305},[299,962,963],{"class":313}," devConfig ",[299,965,729],{"class":323},[299,967,968],{"class":323}," base.",[299,970,923],{"class":474},[299,972,825],{"class":313},[299,974,324],{"class":323},[299,976,768],{"class":323},[299,978,585],{"class":313},[299,980,588],{"class":323},[299,982,983],{"class":301,"line":365},[299,984,648],{"emptyLinePlaceholder":647},[299,986,987],{"class":301,"line":534},[299,988,989],{"class":334},"// Production — shorter effective token window for higher security\n",[299,991,992,994,997,999,1001,1003,1006,1008,1010,1012],{"class":301,"line":550},[299,993,723],{"class":305},[299,995,996],{"class":313}," prodConfig ",[299,998,729],{"class":323},[299,1000,968],{"class":323},[299,1002,923],{"class":474},[299,1004,1005],{"class":313},"(refreshBeforeExpiry",[299,1007,324],{"class":323},[299,1009,875],{"class":327},[299,1011,585],{"class":313},[299,1013,588],{"class":323},[282,1015],{},[285,1017,1019],{"id":1018},"serialisation","Serialisation",[271,1021,1022,1024],{},[274,1023,276],{}," can be serialised to/from JSON — useful for remote config or persisting alongside session data:",[290,1026,1028],{"className":292,"code":1027,"language":294,"meta":295,"style":295},"final json = const AuthConfig().toJson();\n// {\"tokenLifetime\": 3600, \"autoRefresh\": true, \"refreshBeforeExpiry\": 300}\n\nfinal config = AuthConfig.fromJson(json);\n",[274,1029,1030,1054,1059,1063],{"__ignoreMap":295},[299,1031,1032,1034,1037,1039,1041,1043,1045,1047,1050,1052],{"class":301,"line":302},[299,1033,723],{"class":305},[299,1035,1036],{"class":313}," json ",[299,1038,729],{"class":323},[299,1040,527],{"class":305},[299,1042,310],{"class":309},[299,1044,515],{"class":313},[299,1046,471],{"class":323},[299,1048,1049],{"class":474},"toJson",[299,1051,515],{"class":313},[299,1053,588],{"class":323},[299,1055,1056],{"class":301,"line":317},[299,1057,1058],{"class":334},"// {\"tokenLifetime\": 3600, \"autoRefresh\": true, \"refreshBeforeExpiry\": 300}\n",[299,1060,1061],{"class":301,"line":338},[299,1062,648],{"emptyLinePlaceholder":647},[299,1064,1065,1067,1070,1072,1074,1076,1079,1082],{"class":301,"line":349},[299,1066,723],{"class":305},[299,1068,1069],{"class":313}," config ",[299,1071,729],{"class":323},[299,1073,310],{"class":309},[299,1075,471],{"class":323},[299,1077,1078],{"class":474},"fromJson",[299,1080,1081],{"class":313},"(json)",[299,1083,588],{"class":323},[271,1085,1086,1087,1089],{},"Missing fields fall back to defaults, so ",[274,1088,1078],{}," is forward-compatible with older persisted configs.",[282,1091],{},[285,1093,1095],{"id":1094},"recommended-presets","Recommended presets",[370,1097,1098,1108],{},[373,1099,1100],{},[376,1101,1102,1105],{},[379,1103,1104],{},"Context",[379,1106,1107],{},"Config",[389,1109,1110,1120,1130,1140,1150],{},[376,1111,1112,1115],{},[394,1113,1114],{},"Flutter app (default)",[394,1116,1117],{},[274,1118,1119],{},"const AuthConfig()",[376,1121,1122,1125],{},[394,1123,1124],{},"Short-lived tokens (banking, healthcare)",[394,1126,1127],{},[274,1128,1129],{},"AuthConfig(tokenLifetime: 300, refreshBeforeExpiry: 30)",[376,1131,1132,1135],{},[394,1133,1134],{},"Long-lived sessions (CLI tool)",[394,1136,1137],{},[274,1138,1139],{},"AuthConfig(tokenLifetime: 86400, autoRefresh: false)",[376,1141,1142,1145],{},[394,1143,1144],{},"Backend service",[394,1146,1147],{},[274,1148,1149],{},"AuthConfig(autoRefresh: false)",[376,1151,1152,1155],{},[394,1153,1154],{},"Tests",[394,1156,1157,1159],{},[274,1158,1149],{}," — avoids dangling timers",[282,1161],{},[285,1163,1165],{"id":1164},"see-also","See also",[1167,1168,1169,1176,1181],"ul",{},[1170,1171,1172],"li",{},[1173,1174,1175],"a",{"href":200},"AuthyraClient API →",[1170,1177,1178],{},[1173,1179,1180],{"href":138},"Token Refresh guide →",[1170,1182,1183],{},[1173,1184,1185],{"href":22},"Quick Start →",[1187,1188,1189],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":295,"searchDepth":317,"depth":317,"links":1191},[1192,1193,1194,1195,1196,1197,1198,1199,1200],{"id":287,"depth":317,"text":288},{"id":445,"depth":317,"text":446},{"id":593,"depth":317,"text":398},{"id":673,"depth":317,"text":417},{"id":836,"depth":317,"text":432},{"id":920,"depth":317,"text":923},{"id":1018,"depth":317,"text":1019},{"id":1094,"depth":317,"text":1095},{"id":1164,"depth":317,"text":1165},"AuthConfig options — token lifetime, auto-refresh, and refresh threshold.","md",null,{},{"icon":29},{"title":1207,"description":1208},"Configuration | Authyra","Configure AuthyraClient with AuthConfig — token lifetime, auto-refresh, and refresh-before-expiry threshold.","KJ7GpJlYtbsmqt7i1lDcUe23jK4q8byGV3WF7xzjdLc",[1211,1213],{"title":21,"path":22,"stem":23,"description":1212,"icon":24,"children":-1},"Add authentication to your Dart or Flutter project in under 5 minutes.",{"title":31,"path":32,"stem":33,"description":1214,"icon":34,"children":-1},"Your first end-to-end sign-in — email/password in under 50 lines.",1782700506039]