[{"data":1,"prerenderedAt":2267},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-storage":265,"-core-concepts-storage-surround":2262},[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":70,"body":267,"description":2253,"extension":2254,"links":2255,"meta":2256,"navigation":2257,"path":71,"seo":2258,"stem":72,"__hash__":2261},"docs/2.core-concepts/4.storage.md",{"type":268,"value":269,"toc":2243},"minimark",[270,281,284,289,500,627,629,633,708,724,726,730,748,846,852,877,879,883,892,1168,1174,1176,1180,1186,2063,2068,2132,2134,2138,2143,2151,2163,2165,2169,2215,2217,2221,2239],[271,272,273,276,277,280],"p",{},[274,275,217],"code",{}," is the single persistence interface used by Authyra's ",[274,278,279],{},"SessionManager",". The core package ships no concrete implementation by design — you supply a backend suited to your runtime.",[282,283],"hr",{},[285,286,288],"h2",{"id":287},"interface","Interface",[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","abstract class AuthStorage {\n  Future\u003Cvoid>         initialize();\n  Future\u003CString?>      read(String key);\n  Future\u003Cvoid>         write(String key, String value);\n  Future\u003Cbool>         delete(String key);\n  Future\u003Cvoid>         clear();\n  Future\u003Cbool>         containsKey(String key);\n  Future\u003CList\u003CString>> getKeysWithPrefix(String prefix);\n}\n","dart","",[274,297,298,318,344,370,402,425,443,465,494],{"__ignoreMap":295},[299,300,303,307,310,314],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"sMK4o","abstract",[299,308,309],{"class":305}," class",[299,311,313],{"class":312},"sBMFI"," AuthStorage",[299,315,317],{"class":316},"sTEyZ"," {\n",[299,319,321,324,327,331,334,338,341],{"class":301,"line":320},2,[299,322,323],{"class":312},"  Future",[299,325,326],{"class":316},"\u003C",[299,328,330],{"class":329},"spNyl","void",[299,332,333],{"class":316},">         ",[299,335,337],{"class":336},"s2Zo4","initialize",[299,339,340],{"class":316},"()",[299,342,343],{"class":305},";\n",[299,345,347,349,351,354,357,360,363,365,368],{"class":301,"line":346},3,[299,348,323],{"class":312},[299,350,326],{"class":316},[299,352,353],{"class":312},"String",[299,355,356],{"class":316},"?>      ",[299,358,359],{"class":336},"read",[299,361,362],{"class":316},"(",[299,364,353],{"class":312},[299,366,367],{"class":316}," key)",[299,369,343],{"class":305},[299,371,373,375,377,379,381,384,386,388,391,394,397,400],{"class":301,"line":372},4,[299,374,323],{"class":312},[299,376,326],{"class":316},[299,378,330],{"class":329},[299,380,333],{"class":316},[299,382,383],{"class":336},"write",[299,385,362],{"class":316},[299,387,353],{"class":312},[299,389,390],{"class":316}," key",[299,392,393],{"class":305},",",[299,395,396],{"class":312}," String",[299,398,399],{"class":316}," value)",[299,401,343],{"class":305},[299,403,405,407,409,412,414,417,419,421,423],{"class":301,"line":404},5,[299,406,323],{"class":312},[299,408,326],{"class":316},[299,410,411],{"class":312},"bool",[299,413,333],{"class":316},[299,415,416],{"class":336},"delete",[299,418,362],{"class":316},[299,420,353],{"class":312},[299,422,367],{"class":316},[299,424,343],{"class":305},[299,426,428,430,432,434,436,439,441],{"class":301,"line":427},6,[299,429,323],{"class":312},[299,431,326],{"class":316},[299,433,330],{"class":329},[299,435,333],{"class":316},[299,437,438],{"class":336},"clear",[299,440,340],{"class":316},[299,442,343],{"class":305},[299,444,446,448,450,452,454,457,459,461,463],{"class":301,"line":445},7,[299,447,323],{"class":312},[299,449,326],{"class":316},[299,451,411],{"class":312},[299,453,333],{"class":316},[299,455,456],{"class":336},"containsKey",[299,458,362],{"class":316},[299,460,353],{"class":312},[299,462,367],{"class":316},[299,464,343],{"class":305},[299,466,468,470,472,475,477,479,482,485,487,489,492],{"class":301,"line":467},8,[299,469,323],{"class":312},[299,471,326],{"class":316},[299,473,474],{"class":312},"List",[299,476,326],{"class":316},[299,478,353],{"class":312},[299,480,481],{"class":316},">> ",[299,483,484],{"class":336},"getKeysWithPrefix",[299,486,362],{"class":316},[299,488,353],{"class":312},[299,490,491],{"class":316}," prefix)",[299,493,343],{"class":305},[299,495,497],{"class":301,"line":496},9,[299,498,499],{"class":316},"}\n",[501,502,503,516],"table",{},[504,505,506],"thead",{},[507,508,509,513],"tr",{},[510,511,512],"th",{},"Method",[510,514,515],{},"Description",[517,518,519,530,544,562,583,598,613],"tbody",{},[507,520,521,527],{},[522,523,524],"td",{},[274,525,526],{},"initialize()",[522,528,529],{},"One-time setup — key derivation, DB connection, schema migration. Must be idempotent.",[507,531,532,537],{},[522,533,534],{},[274,535,536],{},"read(key)",[522,538,539,540,543],{},"Return the stored string or ",[274,541,542],{},"null"," if absent",[507,545,546,551],{},[522,547,548],{},[274,549,550],{},"write(key, value)",[522,552,553,554,557,558,561],{},"Persist ",[274,555,556],{},"value"," under ",[274,559,560],{},"key",", overwriting any existing entry. Must survive process restarts.",[507,563,564,569],{},[522,565,566],{},[274,567,568],{},"delete(key)",[522,570,571,572,574,575,578,579,582],{},"Remove ",[274,573,560],{},". Return ",[274,576,577],{},"true"," if it existed, ",[274,580,581],{},"false"," if absent. Never throws for missing keys.",[507,584,585,590],{},[522,586,587],{},[274,588,589],{},"clear()",[522,591,592,593,597],{},"Delete ",[594,595,596],"strong",{},"all"," entries — irreversible. Call only during full sign-out-all or factory reset.",[507,599,600,605],{},[522,601,602],{},[274,603,604],{},"containsKey(key)",[522,606,607,609,610,612],{},[274,608,577],{}," if ",[274,611,560],{}," is present",[507,614,615,620],{},[522,616,617],{},[274,618,619],{},"getKeysWithPrefix(prefix)",[522,621,622,623,626],{},"Enumerate all keys starting with ",[274,624,625],{},"prefix"," — used for multi-account session discovery",[282,628],{},[285,630,632],{"id":631},"choosing-a-backend","Choosing a backend",[501,634,635,645],{},[504,636,637],{},[507,638,639,642],{},[510,640,641],{},"Runtime",[510,643,644],{},"Recommended",[517,646,647,662,678,692,700],{},[507,648,649,652],{},[522,650,651],{},"Flutter mobile",[522,653,654,657,658,661],{},[274,655,656],{},"SecureAuthStorage"," from ",[274,659,660],{},"authyra_flutter"," (Keychain on iOS, Keystore on Android)",[507,663,664,667],{},[522,665,666],{},"Flutter web",[522,668,669,657,671,673,674,677],{},[274,670,656],{},[274,672,660],{}," (Web Crypto encrypted ",[274,675,676],{},"localStorage",")",[507,679,680,683],{},[522,681,682],{},"Tests / dev",[522,684,685,657,688,691],{},[274,686,687],{},"InMemoryStorage",[274,689,690],{},"authyra"," (no persistence — resets between test cases)",[507,693,694,697],{},[522,695,696],{},"Dart CLI",[522,698,699],{},"Encrypted file or OS keyring",[507,701,702,705],{},[522,703,704],{},"Backend / Shelf",[522,706,707],{},"Redis, encrypted DB column, or a secrets manager",[709,710,712,713,716,717,720,721,723],"callout",{"icon":711},"i-lucide-shield","Authyra serialises access tokens and refresh tokens into storage. ",[594,714,715],{},"Never"," use plaintext backends — ",[274,718,719],{},"SharedPreferences",", plain ",[274,722,676],{},", or unencrypted files. Always use an encrypted store in production.",[282,725],{},[285,727,729],{"id":728},"flutter-secureauthstorage","Flutter — SecureAuthStorage",[271,731,732,734,735,744,745,747],{},[274,733,656],{}," wraps ",[736,737,741],"a",{"href":738,"rel":739},"https://pub.dev/packages/flutter_secure_storage",[740],"nofollow",[274,742,743],{},"flutter_secure_storage"," and is the ready-to-use implementation for Flutter apps. Import it from ",[274,746,660],{},":",[290,749,751],{"className":292,"code":750,"language":294,"meta":295,"style":295},"import 'package:authyra_flutter/authyra_flutter.dart';\n\nawait Authyra.initialize(\n  client: AuthyraClient(\n    providers: [...],\n    storage: SecureAuthStorage(),\n  ),\n);\n",[274,752,753,765,771,788,800,819,833,840],{"__ignoreMap":295},[299,754,755,759,763],{"class":301,"line":302},[299,756,758],{"class":757},"sbssI","import",[299,760,762],{"class":761},"sfazB"," 'package:authyra_flutter/authyra_flutter.dart'",[299,764,343],{"class":305},[299,766,767],{"class":301,"line":320},[299,768,770],{"emptyLinePlaceholder":769},true,"\n",[299,772,773,777,780,783,785],{"class":301,"line":346},[299,774,776],{"class":775},"s7zQu","await",[299,778,779],{"class":312}," Authyra",[299,781,782],{"class":305},".",[299,784,337],{"class":336},[299,786,787],{"class":316},"(\n",[299,789,790,793,795,798],{"class":301,"line":372},[299,791,792],{"class":316},"  client",[299,794,747],{"class":305},[299,796,797],{"class":312}," AuthyraClient",[299,799,787],{"class":316},[299,801,802,805,807,810,813,816],{"class":301,"line":404},[299,803,804],{"class":316},"    providers",[299,806,747],{"class":305},[299,808,809],{"class":316}," [",[299,811,812],{"class":305},"...",[299,814,815],{"class":316},"]",[299,817,818],{"class":305},",\n",[299,820,821,824,826,829,831],{"class":301,"line":427},[299,822,823],{"class":316},"    storage",[299,825,747],{"class":305},[299,827,828],{"class":312}," SecureAuthStorage",[299,830,340],{"class":316},[299,832,818],{"class":305},[299,834,835,838],{"class":301,"line":445},[299,836,837],{"class":316},"  )",[299,839,818],{"class":305},[299,841,842,844],{"class":301,"line":467},[299,843,677],{"class":316},[299,845,343],{"class":305},[271,847,848,849,851],{},"No configuration is needed. ",[274,850,743],{}," selects the platform-native encrypted store automatically:",[853,854,855,862,868],"ul",{},[856,857,858,861],"li",{},[594,859,860],{},"iOS / macOS"," → Keychain",[856,863,864,867],{},[594,865,866],{},"Android"," → EncryptedSharedPreferences (Android Keystore)",[856,869,870,873,874,876],{},[594,871,872],{},"Web"," → ",[274,875,676],{}," with Web Crypto AES-GCM encryption",[282,878],{},[285,880,882],{"id":881},"tests-inmemorystorage","Tests — InMemoryStorage",[271,884,885,887,888,891],{},[274,886,687],{}," stores everything in a ",[274,889,890],{},"Map\u003CString, String>"," — fast, portable, and resets between test cases automatically:",[290,893,895],{"className":292,"code":894,"language":294,"meta":295,"style":295},"import 'package:test/test.dart';\nimport 'package:authyra/authyra.dart';\n\nvoid main() {\n  late AuthyraClient client;\n\n  setUp(() async {\n    client = AuthyraClient(\n      providers: [myProvider],\n      storage: InMemoryStorage(),  // fresh instance per test\n    );\n    await client.initialize();\n  });\n\n  test('session is stored after sign-in', () async {\n    await client.signIn('email', params: {\n      'email': 'alice@example.com', 'password': 'secret',\n    });\n    final token = await client.getAccessToken();\n    expect(token, isNotNull);\n  });\n}\n",[274,896,897,906,915,919,929,941,945,958,970,982,1001,1009,1025,1033,1038,1058,1084,1107,1115,1140,1156,1163],{"__ignoreMap":295},[299,898,899,901,904],{"class":301,"line":302},[299,900,758],{"class":757},[299,902,903],{"class":761}," 'package:test/test.dart'",[299,905,343],{"class":305},[299,907,908,910,913],{"class":301,"line":320},[299,909,758],{"class":757},[299,911,912],{"class":761}," 'package:authyra/authyra.dart'",[299,914,343],{"class":305},[299,916,917],{"class":301,"line":346},[299,918,770],{"emptyLinePlaceholder":769},[299,920,921,923,926],{"class":301,"line":372},[299,922,330],{"class":329},[299,924,925],{"class":336}," main",[299,927,928],{"class":316},"() {\n",[299,930,931,934,936,939],{"class":301,"line":404},[299,932,933],{"class":329},"  late",[299,935,797],{"class":312},[299,937,938],{"class":316}," client",[299,940,343],{"class":305},[299,942,943],{"class":301,"line":427},[299,944,770],{"emptyLinePlaceholder":769},[299,946,947,950,953,956],{"class":301,"line":445},[299,948,949],{"class":336},"  setUp",[299,951,952],{"class":316},"(() ",[299,954,955],{"class":775},"async",[299,957,317],{"class":316},[299,959,960,963,966,968],{"class":301,"line":467},[299,961,962],{"class":316},"    client ",[299,964,965],{"class":305},"=",[299,967,797],{"class":312},[299,969,787],{"class":316},[299,971,972,975,977,980],{"class":301,"line":496},[299,973,974],{"class":316},"      providers",[299,976,747],{"class":305},[299,978,979],{"class":316}," [myProvider]",[299,981,818],{"class":305},[299,983,985,988,990,993,995,997],{"class":301,"line":984},10,[299,986,987],{"class":316},"      storage",[299,989,747],{"class":305},[299,991,992],{"class":312}," InMemoryStorage",[299,994,340],{"class":316},[299,996,393],{"class":305},[299,998,1000],{"class":999},"sHwdD","  // fresh instance per test\n",[299,1002,1004,1007],{"class":301,"line":1003},11,[299,1005,1006],{"class":316},"    )",[299,1008,343],{"class":305},[299,1010,1012,1015,1017,1019,1021,1023],{"class":301,"line":1011},12,[299,1013,1014],{"class":775},"    await",[299,1016,938],{"class":316},[299,1018,782],{"class":305},[299,1020,337],{"class":336},[299,1022,340],{"class":316},[299,1024,343],{"class":305},[299,1026,1028,1031],{"class":301,"line":1027},13,[299,1029,1030],{"class":316},"  })",[299,1032,343],{"class":305},[299,1034,1036],{"class":301,"line":1035},14,[299,1037,770],{"emptyLinePlaceholder":769},[299,1039,1041,1044,1046,1049,1051,1054,1056],{"class":301,"line":1040},15,[299,1042,1043],{"class":336},"  test",[299,1045,362],{"class":316},[299,1047,1048],{"class":761},"'session is stored after sign-in'",[299,1050,393],{"class":305},[299,1052,1053],{"class":316}," () ",[299,1055,955],{"class":775},[299,1057,317],{"class":316},[299,1059,1061,1063,1065,1067,1070,1072,1075,1077,1080,1082],{"class":301,"line":1060},16,[299,1062,1014],{"class":775},[299,1064,938],{"class":316},[299,1066,782],{"class":305},[299,1068,1069],{"class":336},"signIn",[299,1071,362],{"class":316},[299,1073,1074],{"class":761},"'email'",[299,1076,393],{"class":305},[299,1078,1079],{"class":316}," params",[299,1081,747],{"class":305},[299,1083,317],{"class":316},[299,1085,1087,1090,1092,1095,1097,1100,1102,1105],{"class":301,"line":1086},17,[299,1088,1089],{"class":761},"      'email'",[299,1091,747],{"class":305},[299,1093,1094],{"class":761}," 'alice@example.com'",[299,1096,393],{"class":305},[299,1098,1099],{"class":761}," 'password'",[299,1101,747],{"class":305},[299,1103,1104],{"class":761}," 'secret'",[299,1106,818],{"class":305},[299,1108,1110,1113],{"class":301,"line":1109},18,[299,1111,1112],{"class":316},"    })",[299,1114,343],{"class":305},[299,1116,1118,1121,1124,1126,1129,1131,1133,1136,1138],{"class":301,"line":1117},19,[299,1119,1120],{"class":329},"    final",[299,1122,1123],{"class":316}," token ",[299,1125,965],{"class":305},[299,1127,1128],{"class":775}," await",[299,1130,938],{"class":316},[299,1132,782],{"class":305},[299,1134,1135],{"class":336},"getAccessToken",[299,1137,340],{"class":316},[299,1139,343],{"class":305},[299,1141,1143,1146,1149,1151,1154],{"class":301,"line":1142},20,[299,1144,1145],{"class":336},"    expect",[299,1147,1148],{"class":316},"(token",[299,1150,393],{"class":305},[299,1152,1153],{"class":316}," isNotNull)",[299,1155,343],{"class":305},[299,1157,1159,1161],{"class":301,"line":1158},21,[299,1160,1030],{"class":316},[299,1162,343],{"class":305},[299,1164,1166],{"class":301,"line":1165},22,[299,1167,499],{"class":316},[271,1169,1170,1171,1173],{},"Never use ",[274,1172,687],{}," in production — sessions are lost on process restart.",[282,1175],{},[285,1177,1179],{"id":1178},"implementing-a-custom-backend","Implementing a custom backend",[271,1181,1182,1183,1185],{},"Implement ",[274,1184,217],{}," to connect any storage system. Below is a Redis example for a Dart backend:",[290,1187,1189],{"className":292,"code":1188,"language":294,"meta":295,"style":295},"import 'package:authyra/authyra.dart';\nimport 'package:resp_client/resp_client.dart';\n\nclass RedisAuthStorage implements AuthStorage {\n  final RespClient _client;\n  final String _namespace;\n\n  RedisAuthStorage(this._client, {String namespace = 'authyra'})\n      : _namespace = namespace;\n\n  String _k(String key) => '$_namespace:$key';\n\n  @override\n  Future\u003Cvoid> initialize() async {\n    // Verify the Redis connection is alive\n    await _client.command(['PING']);\n  }\n\n  @override\n  Future\u003CString?> read(String key) async {\n    final result = await _client.command(['GET', _k(key)]);\n    return result.payload as String?;\n  }\n\n  @override\n  Future\u003Cvoid> write(String key, String value) async {\n    await _client.command(['SET', _k(key), value]);\n  }\n\n  @override\n  Future\u003Cbool> delete(String key) async {\n    final deleted = await _client.command(['DEL', _k(key)]);\n    return (deleted.payload as int) > 0;\n  }\n\n  @override\n  Future\u003Cvoid> clear() async {\n    final keys = await getKeysWithPrefix('');\n    if (keys.isNotEmpty) {\n      await _client.command(['DEL', ...keys.map(_k)]);\n    }\n  }\n\n  @override\n  Future\u003Cbool> containsKey(String key) async {\n    final result = await _client.command(['EXISTS', _k(key)]);\n    return (result.payload as int) > 0;\n  }\n\n  @override\n  Future\u003CList\u003CString>> getKeysWithPrefix(String prefix) async {\n    final result = await _client.command(['KEYS', '${_k(prefix)}*']);\n    final fullKeys = (result.payload as List).cast\u003CString>();\n    // Strip the namespace prefix before returning\n    return fullKeys\n        .map((k) => k.substring('$_namespace:'.length))\n        .toList();\n  }\n}\n",[274,1190,1191,1199,1208,1212,1227,1240,1251,1255,1286,1301,1305,1344,1348,1353,1373,1378,1400,1405,1409,1413,1436,1467,1488,1493,1498,1503,1533,1563,1568,1573,1578,1601,1632,1660,1665,1670,1675,1694,1718,1732,1766,1772,1777,1782,1787,1810,1840,1864,1869,1874,1879,1907,1953,1990,1996,2004,2041,2053,2058],{"__ignoreMap":295},[299,1192,1193,1195,1197],{"class":301,"line":302},[299,1194,758],{"class":757},[299,1196,912],{"class":761},[299,1198,343],{"class":305},[299,1200,1201,1203,1206],{"class":301,"line":320},[299,1202,758],{"class":757},[299,1204,1205],{"class":761}," 'package:resp_client/resp_client.dart'",[299,1207,343],{"class":305},[299,1209,1210],{"class":301,"line":346},[299,1211,770],{"emptyLinePlaceholder":769},[299,1213,1214,1217,1220,1223,1225],{"class":301,"line":372},[299,1215,1216],{"class":305},"class",[299,1218,1219],{"class":312}," RedisAuthStorage",[299,1221,1222],{"class":305}," implements",[299,1224,313],{"class":312},[299,1226,317],{"class":316},[299,1228,1229,1232,1235,1238],{"class":301,"line":404},[299,1230,1231],{"class":329},"  final",[299,1233,1234],{"class":312}," RespClient",[299,1236,1237],{"class":316}," _client",[299,1239,343],{"class":305},[299,1241,1242,1244,1246,1249],{"class":301,"line":427},[299,1243,1231],{"class":329},[299,1245,396],{"class":312},[299,1247,1248],{"class":316}," _namespace",[299,1250,343],{"class":305},[299,1252,1253],{"class":301,"line":445},[299,1254,770],{"emptyLinePlaceholder":769},[299,1256,1257,1260,1263,1265,1268,1270,1273,1275,1278,1280,1283],{"class":301,"line":467},[299,1258,1259],{"class":312},"  RedisAuthStorage",[299,1261,1262],{"class":316},"(this",[299,1264,782],{"class":305},[299,1266,1267],{"class":316},"_client",[299,1269,393],{"class":305},[299,1271,1272],{"class":316}," {",[299,1274,353],{"class":312},[299,1276,1277],{"class":316}," namespace ",[299,1279,965],{"class":305},[299,1281,1282],{"class":761}," 'authyra'",[299,1284,1285],{"class":316},"})\n",[299,1287,1288,1291,1294,1296,1299],{"class":301,"line":496},[299,1289,1290],{"class":305},"      :",[299,1292,1293],{"class":316}," _namespace ",[299,1295,965],{"class":305},[299,1297,1298],{"class":316}," namespace",[299,1300,343],{"class":305},[299,1302,1303],{"class":301,"line":984},[299,1304,770],{"emptyLinePlaceholder":769},[299,1306,1307,1310,1313,1315,1317,1320,1323,1326,1329,1333,1335,1337,1339,1342],{"class":301,"line":1003},[299,1308,1309],{"class":312},"  String",[299,1311,1312],{"class":336}," _k",[299,1314,362],{"class":316},[299,1316,353],{"class":312},[299,1318,1319],{"class":316}," key) ",[299,1321,1322],{"class":305},"=>",[299,1324,1325],{"class":761}," '",[299,1327,1328],{"class":316},"$",[299,1330,1332],{"class":1331},"sHdIc","_namespace",[299,1334,747],{"class":761},[299,1336,1328],{"class":316},[299,1338,560],{"class":1331},[299,1340,1341],{"class":761},"'",[299,1343,343],{"class":305},[299,1345,1346],{"class":301,"line":1011},[299,1347,770],{"emptyLinePlaceholder":769},[299,1349,1350],{"class":301,"line":1027},[299,1351,1352],{"class":329},"  @override\n",[299,1354,1355,1357,1359,1361,1364,1366,1369,1371],{"class":301,"line":1035},[299,1356,323],{"class":312},[299,1358,326],{"class":316},[299,1360,330],{"class":329},[299,1362,1363],{"class":316},"> ",[299,1365,337],{"class":336},[299,1367,1368],{"class":316},"() ",[299,1370,955],{"class":775},[299,1372,317],{"class":316},[299,1374,1375],{"class":301,"line":1040},[299,1376,1377],{"class":999},"    // Verify the Redis connection is alive\n",[299,1379,1380,1382,1384,1386,1389,1392,1395,1398],{"class":301,"line":1060},[299,1381,1014],{"class":775},[299,1383,1237],{"class":316},[299,1385,782],{"class":305},[299,1387,1388],{"class":336},"command",[299,1390,1391],{"class":316},"([",[299,1393,1394],{"class":761},"'PING'",[299,1396,1397],{"class":316},"])",[299,1399,343],{"class":305},[299,1401,1402],{"class":301,"line":1086},[299,1403,1404],{"class":316},"  }\n",[299,1406,1407],{"class":301,"line":1109},[299,1408,770],{"emptyLinePlaceholder":769},[299,1410,1411],{"class":301,"line":1117},[299,1412,1352],{"class":329},[299,1414,1415,1417,1419,1421,1424,1426,1428,1430,1432,1434],{"class":301,"line":1142},[299,1416,323],{"class":312},[299,1418,326],{"class":316},[299,1420,353],{"class":312},[299,1422,1423],{"class":316},"?> ",[299,1425,359],{"class":336},[299,1427,362],{"class":316},[299,1429,353],{"class":312},[299,1431,1319],{"class":316},[299,1433,955],{"class":775},[299,1435,317],{"class":316},[299,1437,1438,1440,1443,1445,1447,1449,1451,1453,1455,1458,1460,1462,1465],{"class":301,"line":1158},[299,1439,1120],{"class":329},[299,1441,1442],{"class":316}," result ",[299,1444,965],{"class":305},[299,1446,1128],{"class":775},[299,1448,1237],{"class":316},[299,1450,782],{"class":305},[299,1452,1388],{"class":336},[299,1454,1391],{"class":316},[299,1456,1457],{"class":761},"'GET'",[299,1459,393],{"class":305},[299,1461,1312],{"class":336},[299,1463,1464],{"class":316},"(key)])",[299,1466,343],{"class":305},[299,1468,1469,1472,1475,1477,1480,1483,1485],{"class":301,"line":1165},[299,1470,1471],{"class":775},"    return",[299,1473,1474],{"class":316}," result",[299,1476,782],{"class":305},[299,1478,1479],{"class":316},"payload ",[299,1481,1482],{"class":305},"as",[299,1484,396],{"class":312},[299,1486,1487],{"class":305},"?;\n",[299,1489,1491],{"class":301,"line":1490},23,[299,1492,1404],{"class":316},[299,1494,1496],{"class":301,"line":1495},24,[299,1497,770],{"emptyLinePlaceholder":769},[299,1499,1501],{"class":301,"line":1500},25,[299,1502,1352],{"class":329},[299,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1529,1531],{"class":301,"line":1505},26,[299,1507,323],{"class":312},[299,1509,326],{"class":316},[299,1511,330],{"class":329},[299,1513,1363],{"class":316},[299,1515,383],{"class":336},[299,1517,362],{"class":316},[299,1519,353],{"class":312},[299,1521,390],{"class":316},[299,1523,393],{"class":305},[299,1525,396],{"class":312},[299,1527,1528],{"class":316}," value) ",[299,1530,955],{"class":775},[299,1532,317],{"class":316},[299,1534,1536,1538,1540,1542,1544,1546,1549,1551,1553,1556,1558,1561],{"class":301,"line":1535},27,[299,1537,1014],{"class":775},[299,1539,1237],{"class":316},[299,1541,782],{"class":305},[299,1543,1388],{"class":336},[299,1545,1391],{"class":316},[299,1547,1548],{"class":761},"'SET'",[299,1550,393],{"class":305},[299,1552,1312],{"class":336},[299,1554,1555],{"class":316},"(key)",[299,1557,393],{"class":305},[299,1559,1560],{"class":316}," value])",[299,1562,343],{"class":305},[299,1564,1566],{"class":301,"line":1565},28,[299,1567,1404],{"class":316},[299,1569,1571],{"class":301,"line":1570},29,[299,1572,770],{"emptyLinePlaceholder":769},[299,1574,1576],{"class":301,"line":1575},30,[299,1577,1352],{"class":329},[299,1579,1581,1583,1585,1587,1589,1591,1593,1595,1597,1599],{"class":301,"line":1580},31,[299,1582,323],{"class":312},[299,1584,326],{"class":316},[299,1586,411],{"class":312},[299,1588,1363],{"class":316},[299,1590,416],{"class":336},[299,1592,362],{"class":316},[299,1594,353],{"class":312},[299,1596,1319],{"class":316},[299,1598,955],{"class":775},[299,1600,317],{"class":316},[299,1602,1604,1606,1609,1611,1613,1615,1617,1619,1621,1624,1626,1628,1630],{"class":301,"line":1603},32,[299,1605,1120],{"class":329},[299,1607,1608],{"class":316}," deleted ",[299,1610,965],{"class":305},[299,1612,1128],{"class":775},[299,1614,1237],{"class":316},[299,1616,782],{"class":305},[299,1618,1388],{"class":336},[299,1620,1391],{"class":316},[299,1622,1623],{"class":761},"'DEL'",[299,1625,393],{"class":305},[299,1627,1312],{"class":336},[299,1629,1464],{"class":316},[299,1631,343],{"class":305},[299,1633,1635,1637,1640,1642,1644,1646,1649,1652,1655,1658],{"class":301,"line":1634},33,[299,1636,1471],{"class":775},[299,1638,1639],{"class":316}," (deleted",[299,1641,782],{"class":305},[299,1643,1479],{"class":316},[299,1645,1482],{"class":305},[299,1647,1648],{"class":312}," int",[299,1650,1651],{"class":316},") ",[299,1653,1654],{"class":305},">",[299,1656,1657],{"class":757}," 0",[299,1659,343],{"class":305},[299,1661,1663],{"class":301,"line":1662},34,[299,1664,1404],{"class":316},[299,1666,1668],{"class":301,"line":1667},35,[299,1669,770],{"emptyLinePlaceholder":769},[299,1671,1673],{"class":301,"line":1672},36,[299,1674,1352],{"class":329},[299,1676,1678,1680,1682,1684,1686,1688,1690,1692],{"class":301,"line":1677},37,[299,1679,323],{"class":312},[299,1681,326],{"class":316},[299,1683,330],{"class":329},[299,1685,1363],{"class":316},[299,1687,438],{"class":336},[299,1689,1368],{"class":316},[299,1691,955],{"class":775},[299,1693,317],{"class":316},[299,1695,1697,1699,1702,1704,1706,1709,1711,1714,1716],{"class":301,"line":1696},38,[299,1698,1120],{"class":329},[299,1700,1701],{"class":316}," keys ",[299,1703,965],{"class":305},[299,1705,1128],{"class":775},[299,1707,1708],{"class":336}," getKeysWithPrefix",[299,1710,362],{"class":316},[299,1712,1713],{"class":761},"''",[299,1715,677],{"class":316},[299,1717,343],{"class":305},[299,1719,1721,1724,1727,1729],{"class":301,"line":1720},39,[299,1722,1723],{"class":775},"    if",[299,1725,1726],{"class":316}," (keys",[299,1728,782],{"class":305},[299,1730,1731],{"class":316},"isNotEmpty) {\n",[299,1733,1735,1738,1740,1742,1744,1746,1748,1750,1753,1756,1758,1761,1764],{"class":301,"line":1734},40,[299,1736,1737],{"class":775},"      await",[299,1739,1237],{"class":316},[299,1741,782],{"class":305},[299,1743,1388],{"class":336},[299,1745,1391],{"class":316},[299,1747,1623],{"class":761},[299,1749,393],{"class":305},[299,1751,1752],{"class":305}," ...",[299,1754,1755],{"class":316},"keys",[299,1757,782],{"class":305},[299,1759,1760],{"class":336},"map",[299,1762,1763],{"class":316},"(_k)])",[299,1765,343],{"class":305},[299,1767,1769],{"class":301,"line":1768},41,[299,1770,1771],{"class":316},"    }\n",[299,1773,1775],{"class":301,"line":1774},42,[299,1776,1404],{"class":316},[299,1778,1780],{"class":301,"line":1779},43,[299,1781,770],{"emptyLinePlaceholder":769},[299,1783,1785],{"class":301,"line":1784},44,[299,1786,1352],{"class":329},[299,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1808],{"class":301,"line":1789},45,[299,1791,323],{"class":312},[299,1793,326],{"class":316},[299,1795,411],{"class":312},[299,1797,1363],{"class":316},[299,1799,456],{"class":336},[299,1801,362],{"class":316},[299,1803,353],{"class":312},[299,1805,1319],{"class":316},[299,1807,955],{"class":775},[299,1809,317],{"class":316},[299,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1832,1834,1836,1838],{"class":301,"line":1812},46,[299,1814,1120],{"class":329},[299,1816,1442],{"class":316},[299,1818,965],{"class":305},[299,1820,1128],{"class":775},[299,1822,1237],{"class":316},[299,1824,782],{"class":305},[299,1826,1388],{"class":336},[299,1828,1391],{"class":316},[299,1830,1831],{"class":761},"'EXISTS'",[299,1833,393],{"class":305},[299,1835,1312],{"class":336},[299,1837,1464],{"class":316},[299,1839,343],{"class":305},[299,1841,1843,1845,1848,1850,1852,1854,1856,1858,1860,1862],{"class":301,"line":1842},47,[299,1844,1471],{"class":775},[299,1846,1847],{"class":316}," (result",[299,1849,782],{"class":305},[299,1851,1479],{"class":316},[299,1853,1482],{"class":305},[299,1855,1648],{"class":312},[299,1857,1651],{"class":316},[299,1859,1654],{"class":305},[299,1861,1657],{"class":757},[299,1863,343],{"class":305},[299,1865,1867],{"class":301,"line":1866},48,[299,1868,1404],{"class":316},[299,1870,1872],{"class":301,"line":1871},49,[299,1873,770],{"emptyLinePlaceholder":769},[299,1875,1877],{"class":301,"line":1876},50,[299,1878,1352],{"class":329},[299,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1903,1905],{"class":301,"line":1881},51,[299,1883,323],{"class":312},[299,1885,326],{"class":316},[299,1887,474],{"class":312},[299,1889,326],{"class":316},[299,1891,353],{"class":312},[299,1893,481],{"class":316},[299,1895,484],{"class":336},[299,1897,362],{"class":316},[299,1899,353],{"class":312},[299,1901,1902],{"class":316}," prefix) ",[299,1904,955],{"class":775},[299,1906,317],{"class":316},[299,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1929,1931,1933,1936,1939,1941,1943,1946,1949,1951],{"class":301,"line":1909},52,[299,1911,1120],{"class":329},[299,1913,1442],{"class":316},[299,1915,965],{"class":305},[299,1917,1128],{"class":775},[299,1919,1237],{"class":316},[299,1921,782],{"class":305},[299,1923,1388],{"class":336},[299,1925,1391],{"class":316},[299,1927,1928],{"class":761},"'KEYS'",[299,1930,393],{"class":305},[299,1932,1325],{"class":761},[299,1934,1935],{"class":316},"${",[299,1937,1938],{"class":336},"_k",[299,1940,362],{"class":316},[299,1942,625],{"class":1331},[299,1944,1945],{"class":316},")}",[299,1947,1948],{"class":761},"*'",[299,1950,1397],{"class":316},[299,1952,343],{"class":305},[299,1954,1956,1958,1961,1963,1965,1967,1969,1971,1974,1976,1978,1981,1983,1985,1988],{"class":301,"line":1955},53,[299,1957,1120],{"class":329},[299,1959,1960],{"class":316}," fullKeys ",[299,1962,965],{"class":305},[299,1964,1847],{"class":316},[299,1966,782],{"class":305},[299,1968,1479],{"class":316},[299,1970,1482],{"class":305},[299,1972,1973],{"class":312}," List",[299,1975,677],{"class":316},[299,1977,782],{"class":305},[299,1979,1980],{"class":336},"cast",[299,1982,326],{"class":316},[299,1984,353],{"class":312},[299,1986,1987],{"class":316},">()",[299,1989,343],{"class":305},[299,1991,1993],{"class":301,"line":1992},54,[299,1994,1995],{"class":999},"    // Strip the namespace prefix before returning\n",[299,1997,1999,2001],{"class":301,"line":1998},55,[299,2000,1471],{"class":775},[299,2002,2003],{"class":316}," fullKeys\n",[299,2005,2007,2010,2012,2015,2017,2020,2022,2025,2027,2029,2031,2033,2036,2038],{"class":301,"line":2006},56,[299,2008,2009],{"class":305},"        .",[299,2011,1760],{"class":336},[299,2013,2014],{"class":316},"((k) ",[299,2016,1322],{"class":305},[299,2018,2019],{"class":316}," k",[299,2021,782],{"class":305},[299,2023,2024],{"class":336},"substring",[299,2026,362],{"class":316},[299,2028,1341],{"class":761},[299,2030,1328],{"class":316},[299,2032,1332],{"class":1331},[299,2034,2035],{"class":761},":'",[299,2037,782],{"class":305},[299,2039,2040],{"class":316},"length))\n",[299,2042,2044,2046,2049,2051],{"class":301,"line":2043},57,[299,2045,2009],{"class":305},[299,2047,2048],{"class":336},"toList",[299,2050,340],{"class":316},[299,2052,343],{"class":305},[299,2054,2056],{"class":301,"line":2055},58,[299,2057,1404],{"class":316},[299,2059,2061],{"class":301,"line":2060},59,[299,2062,499],{"class":316},[271,2064,2065,2066,747],{},"Pass it to ",[274,2067,199],{},[290,2069,2071],{"className":292,"code":2070,"language":294,"meta":295,"style":295},"final client = AuthyraClient(\n  providers: [myProvider],\n  storage: RedisAuthStorage(redisClient),\n);\nawait client.initialize();\n",[274,2072,2073,2087,2098,2112,2118],{"__ignoreMap":295},[299,2074,2075,2078,2081,2083,2085],{"class":301,"line":302},[299,2076,2077],{"class":329},"final",[299,2079,2080],{"class":316}," client ",[299,2082,965],{"class":305},[299,2084,797],{"class":312},[299,2086,787],{"class":316},[299,2088,2089,2092,2094,2096],{"class":301,"line":320},[299,2090,2091],{"class":316},"  providers",[299,2093,747],{"class":305},[299,2095,979],{"class":316},[299,2097,818],{"class":305},[299,2099,2100,2103,2105,2107,2110],{"class":301,"line":346},[299,2101,2102],{"class":316},"  storage",[299,2104,747],{"class":305},[299,2106,1219],{"class":312},[299,2108,2109],{"class":316},"(redisClient)",[299,2111,818],{"class":305},[299,2113,2114,2116],{"class":301,"line":372},[299,2115,677],{"class":316},[299,2117,343],{"class":305},[299,2119,2120,2122,2124,2126,2128,2130],{"class":301,"line":404},[299,2121,776],{"class":775},[299,2123,938],{"class":316},[299,2125,782],{"class":305},[299,2127,337],{"class":336},[299,2129,340],{"class":316},[299,2131,343],{"class":305},[282,2133],{},[285,2135,2137],{"id":2136},"key-structure","Key structure",[271,2139,2140,2142],{},[274,2141,279],{}," stores all session data under a single registry key by default:",[290,2144,2149],{"className":2145,"code":2147,"language":2148,"meta":295},[2146],"language-text","authyra:session_registry  →  { JSON-encoded SessionRegistry }\n","text",[274,2150,2147],{"__ignoreMap":295},[271,2152,2153,2155,2156,2159,2160,2162],{},[274,2154,484],{}," is used by multi-account flows to enumerate sessions. When implementing a custom backend, ensure ",[274,2157,2158],{},"getKeysWithPrefix('')"," (empty prefix) returns all keys managed by this storage instance so that ",[274,2161,589],{}," can remove them all.",[282,2164],{},[285,2166,2168],{"id":2167},"security-checklist","Security checklist",[853,2170,2173,2182,2191,2199,2207],{"className":2171},[2172],"contains-task-list",[856,2174,2177,2181],{"className":2175},[2176],"task-list-item",[2178,2179],"input",{"disabled":769,"type":2180},"checkbox"," Storage backend uses OS-level encryption (Keychain, Keystore, Web Crypto, Redis at-rest encryption)",[856,2183,2185,2187,2188,2190],{"className":2184},[2176],[2178,2186],{"disabled":769,"type":2180}," ",[274,2189,589],{}," is called on sign-out-all and account deletion flows",[856,2192,2194,2187,2196,2198],{"className":2193},[2176],[2178,2195],{"disabled":769,"type":2180},[274,2197,526],{}," is awaited before any other storage operation",[856,2200,2202,2187,2204,2206],{"className":2201},[2176],[2178,2203],{"disabled":769,"type":2180},[274,2205,383],{}," is durable — survives process restarts and power events",[856,2208,2210,2187,2212,2214],{"className":2209},[2176],[2178,2211],{"disabled":769,"type":2180},[274,2213,383],{}," is atomic — no partial writes that could corrupt session data",[282,2216],{},[285,2218,2220],{"id":2219},"see-also","See also",[853,2222,2223,2229,2234],{},[856,2224,2225,2228],{},[736,2226,2227],{"href":66},"Sessions →"," — what gets stored in each session",[856,2230,2231],{},[736,2232,2233],{"href":157},"Custom Storage guide →",[856,2235,2236],{},[736,2237,2238],{"href":171},"Flutter Setup →",[2240,2241,2242],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .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":295,"searchDepth":320,"depth":320,"links":2244},[2245,2246,2247,2248,2249,2250,2251,2252],{"id":287,"depth":320,"text":288},{"id":631,"depth":320,"text":632},{"id":728,"depth":320,"text":729},{"id":881,"depth":320,"text":882},{"id":1178,"depth":320,"text":1179},{"id":2136,"depth":320,"text":2137},{"id":2167,"depth":320,"text":2168},{"id":2219,"depth":320,"text":2220},"The AuthStorage interface — pluggable session persistence, security guidance, and implementing a custom backend.","md",null,{},{"icon":73},{"title":2259,"description":2260},"Storage | Authyra","AuthStorage interface — implement encrypted session persistence for Flutter (SecureAuthStorage), Dart backend (Redis), or tests (InMemoryStorage).","6HL6Vw9EFvlF07NdO4ckdPtHiFRyXlHdxVbUfF5DG6Q",[2263,2265],{"title":65,"path":66,"stem":67,"description":2264,"icon":68,"children":-1},"AuthSession lifecycle — fields, expiry helpers, token refresh, and multi-account support.",{"title":75,"path":76,"stem":77,"description":2266,"icon":78,"children":-1},"authStateChanges stream, sessionStream, synchronous state cache, and integration with StreamBuilder, Riverpod, Bloc, and GoRouter.",1782700506039]