[{"data":1,"prerenderedAt":2436},["ShallowReactive",2],{"navigation_docs":3,"-providers-credentials":265,"-providers-credentials-surround":2431},[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":94,"body":267,"description":2423,"extension":2424,"links":2425,"meta":2426,"navigation":1468,"path":95,"seo":2427,"stem":96,"__hash__":2430},"docs/3.providers/1.credentials.md",{"type":268,"value":269,"toc":2411},"minimark",[270,278,289,292,297,302,305,542,575,579,582,847,872,874,878,883,984,992,1058,1060,1064,1237,1239,1243,1251,1358,1360,1364,1373,1381,1863,1865,1868,1875,2376,2378,2382,2407],[271,272,273,277],"p",{},[274,275,276],"code",{},"CredentialsProvider"," handles any username/password or form-based authentication flow. It delegates credential validation to a callback you supply — you own the logic and connect it to any backend.",[271,279,280,284,285,288],{},[281,282,283],"strong",{},"Package",": ",[274,286,287],{},"authyra"," (pure Dart, no Flutter dependency)",[290,291],"hr",{},[293,294,296],"h2",{"id":295},"two-constructors","Two constructors",[298,299,301],"h3",{"id":300},"basic-user-profile-only","Basic — user profile only",[271,303,304],{},"Use when your backend manages sessions server-side (cookies, opaque tokens) and only returns the user profile on login:",[306,307,312],"pre",{"className":308,"code":309,"language":310,"meta":311,"style":311},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CredentialsProvider(\n  id: 'email',\n  authorize: (creds) async {\n    final res = await myApi.post('/auth/login', body: creds);\n    if (res.statusCode != 200) return null; // wrong credentials\n    return AuthUser(\n      id:    res.data['id'],\n      email: res.data['email'],\n      name:  res.data['name'],\n    );\n  },\n)\n","dart","",[274,313,314,326,343,361,407,441,452,476,498,520,528,536],{"__ignoreMap":311},[315,316,319,322],"span",{"class":317,"line":318},"line",1,[315,320,276],{"class":321},"sBMFI",[315,323,325],{"class":324},"sTEyZ","(\n",[315,327,329,332,336,340],{"class":317,"line":328},2,[315,330,331],{"class":324},"  id",[315,333,335],{"class":334},"sMK4o",":",[315,337,339],{"class":338},"sfazB"," 'email'",[315,341,342],{"class":334},",\n",[315,344,346,349,351,354,358],{"class":317,"line":345},3,[315,347,348],{"class":324},"  authorize",[315,350,335],{"class":334},[315,352,353],{"class":324}," (creds) ",[315,355,357],{"class":356},"s7zQu","async",[315,359,360],{"class":324}," {\n",[315,362,364,368,371,374,377,380,383,387,390,393,396,399,401,404],{"class":317,"line":363},4,[315,365,367],{"class":366},"spNyl","    final",[315,369,370],{"class":324}," res ",[315,372,373],{"class":334},"=",[315,375,376],{"class":356}," await",[315,378,379],{"class":324}," myApi",[315,381,382],{"class":334},".",[315,384,386],{"class":385},"s2Zo4","post",[315,388,389],{"class":324},"(",[315,391,392],{"class":338},"'/auth/login'",[315,394,395],{"class":334},",",[315,397,398],{"class":324}," body",[315,400,335],{"class":334},[315,402,403],{"class":324}," creds)",[315,405,406],{"class":334},";\n",[315,408,410,413,416,418,421,424,428,431,434,437],{"class":317,"line":409},5,[315,411,412],{"class":356},"    if",[315,414,415],{"class":324}," (res",[315,417,382],{"class":334},[315,419,420],{"class":324},"statusCode ",[315,422,423],{"class":334},"!=",[315,425,427],{"class":426},"sbssI"," 200",[315,429,430],{"class":324},") ",[315,432,433],{"class":356},"return",[315,435,436],{"class":334}," null;",[315,438,440],{"class":439},"sHwdD"," // wrong credentials\n",[315,442,444,447,450],{"class":317,"line":443},6,[315,445,446],{"class":356},"    return",[315,448,449],{"class":321}," AuthUser",[315,451,325],{"class":324},[315,453,455,458,460,463,465,468,471,474],{"class":317,"line":454},7,[315,456,457],{"class":324},"      id",[315,459,335],{"class":334},[315,461,462],{"class":324},"    res",[315,464,382],{"class":334},[315,466,467],{"class":324},"data[",[315,469,470],{"class":338},"'id'",[315,472,473],{"class":324},"]",[315,475,342],{"class":334},[315,477,479,482,484,487,489,491,494,496],{"class":317,"line":478},8,[315,480,481],{"class":324},"      email",[315,483,335],{"class":334},[315,485,486],{"class":324}," res",[315,488,382],{"class":334},[315,490,467],{"class":324},[315,492,493],{"class":338},"'email'",[315,495,473],{"class":324},[315,497,342],{"class":334},[315,499,501,504,506,509,511,513,516,518],{"class":317,"line":500},9,[315,502,503],{"class":324},"      name",[315,505,335],{"class":334},[315,507,508],{"class":324},"  res",[315,510,382],{"class":334},[315,512,467],{"class":324},[315,514,515],{"class":338},"'name'",[315,517,473],{"class":324},[315,519,342],{"class":334},[315,521,523,526],{"class":317,"line":522},10,[315,524,525],{"class":324},"    )",[315,527,406],{"class":334},[315,529,531,534],{"class":317,"line":530},11,[315,532,533],{"class":324},"  }",[315,535,342],{"class":334},[315,537,539],{"class":317,"line":538},12,[315,540,541],{"class":324},")\n",[271,543,544,545,548,549,552,553,556,557,560,561,564,565,567,568,571,572,382],{},"The ",[274,546,547],{},"authorize"," callback receives the ",[274,550,551],{},"params"," map passed to ",[274,554,555],{},"Authyra.instance.signIn()"," and returns an ",[274,558,559],{},"AuthUser"," or ",[274,562,563],{},"null",". Returning ",[274,566,563],{}," causes ",[274,569,570],{},"signIn"," to throw ",[274,573,574],{},"AuthenticationFailedException",[298,576,578],{"id":577},"with-tokens-jwt-backend","With tokens — JWT backend",[271,580,581],{},"Use when your backend returns access and refresh tokens in the sign-in response. Authyra stores them in the session and can refresh them silently:",[306,583,585],{"className":308,"code":584,"language":310,"meta":311,"style":311},"CredentialsProvider.withTokens(\n  id: 'email',\n  authorize: (creds) async {\n    final res = await myApi.post('/auth/login', body: creds);\n    if (res.statusCode != 200) return null;\n    return AuthSignInResult(\n      user: AuthUser(\n        id:    res.data['userId'],\n        email: res.data['email'],\n        name:  res.data['name'],\n      ),\n      accessToken:  res.data['accessToken'],\n      refreshToken: res.data['refreshToken'],\n      expiresAt:    DateTime.parse(res.data['expiresAt']),\n    );\n  },\n)\n",[274,586,587,598,608,620,650,671,680,691,711,730,749,756,776,797,828,835,842],{"__ignoreMap":311},[315,588,589,591,593,596],{"class":317,"line":318},[315,590,276],{"class":321},[315,592,382],{"class":334},[315,594,595],{"class":385},"withTokens",[315,597,325],{"class":324},[315,599,600,602,604,606],{"class":317,"line":328},[315,601,331],{"class":324},[315,603,335],{"class":334},[315,605,339],{"class":338},[315,607,342],{"class":334},[315,609,610,612,614,616,618],{"class":317,"line":345},[315,611,348],{"class":324},[315,613,335],{"class":334},[315,615,353],{"class":324},[315,617,357],{"class":356},[315,619,360],{"class":324},[315,621,622,624,626,628,630,632,634,636,638,640,642,644,646,648],{"class":317,"line":363},[315,623,367],{"class":366},[315,625,370],{"class":324},[315,627,373],{"class":334},[315,629,376],{"class":356},[315,631,379],{"class":324},[315,633,382],{"class":334},[315,635,386],{"class":385},[315,637,389],{"class":324},[315,639,392],{"class":338},[315,641,395],{"class":334},[315,643,398],{"class":324},[315,645,335],{"class":334},[315,647,403],{"class":324},[315,649,406],{"class":334},[315,651,652,654,656,658,660,662,664,666,668],{"class":317,"line":409},[315,653,412],{"class":356},[315,655,415],{"class":324},[315,657,382],{"class":334},[315,659,420],{"class":324},[315,661,423],{"class":334},[315,663,427],{"class":426},[315,665,430],{"class":324},[315,667,433],{"class":356},[315,669,670],{"class":334}," null;\n",[315,672,673,675,678],{"class":317,"line":443},[315,674,446],{"class":356},[315,676,677],{"class":321}," AuthSignInResult",[315,679,325],{"class":324},[315,681,682,685,687,689],{"class":317,"line":454},[315,683,684],{"class":324},"      user",[315,686,335],{"class":334},[315,688,449],{"class":321},[315,690,325],{"class":324},[315,692,693,696,698,700,702,704,707,709],{"class":317,"line":478},[315,694,695],{"class":324},"        id",[315,697,335],{"class":334},[315,699,462],{"class":324},[315,701,382],{"class":334},[315,703,467],{"class":324},[315,705,706],{"class":338},"'userId'",[315,708,473],{"class":324},[315,710,342],{"class":334},[315,712,713,716,718,720,722,724,726,728],{"class":317,"line":500},[315,714,715],{"class":324},"        email",[315,717,335],{"class":334},[315,719,486],{"class":324},[315,721,382],{"class":334},[315,723,467],{"class":324},[315,725,493],{"class":338},[315,727,473],{"class":324},[315,729,342],{"class":334},[315,731,732,735,737,739,741,743,745,747],{"class":317,"line":522},[315,733,734],{"class":324},"        name",[315,736,335],{"class":334},[315,738,508],{"class":324},[315,740,382],{"class":334},[315,742,467],{"class":324},[315,744,515],{"class":338},[315,746,473],{"class":324},[315,748,342],{"class":334},[315,750,751,754],{"class":317,"line":530},[315,752,753],{"class":324},"      )",[315,755,342],{"class":334},[315,757,758,761,763,765,767,769,772,774],{"class":317,"line":538},[315,759,760],{"class":324},"      accessToken",[315,762,335],{"class":334},[315,764,508],{"class":324},[315,766,382],{"class":334},[315,768,467],{"class":324},[315,770,771],{"class":338},"'accessToken'",[315,773,473],{"class":324},[315,775,342],{"class":334},[315,777,779,782,784,786,788,790,793,795],{"class":317,"line":778},13,[315,780,781],{"class":324},"      refreshToken",[315,783,335],{"class":334},[315,785,486],{"class":324},[315,787,382],{"class":334},[315,789,467],{"class":324},[315,791,792],{"class":338},"'refreshToken'",[315,794,473],{"class":324},[315,796,342],{"class":334},[315,798,800,803,805,808,810,813,816,818,820,823,826],{"class":317,"line":799},14,[315,801,802],{"class":324},"      expiresAt",[315,804,335],{"class":334},[315,806,807],{"class":321},"    DateTime",[315,809,382],{"class":334},[315,811,812],{"class":385},"parse",[315,814,815],{"class":324},"(res",[315,817,382],{"class":334},[315,819,467],{"class":324},[315,821,822],{"class":338},"'expiresAt'",[315,824,825],{"class":324},"])",[315,827,342],{"class":334},[315,829,831,833],{"class":317,"line":830},15,[315,832,525],{"class":324},[315,834,406],{"class":334},[315,836,838,840],{"class":317,"line":837},16,[315,839,533],{"class":324},[315,841,342],{"class":334},[315,843,845],{"class":317,"line":844},17,[315,846,541],{"class":324},[848,849,851,852,855,856,859,860,863,864,867,868,871],"callout",{"icon":850},"i-lucide-lightbulb","Always use ",[274,853,854],{},".withTokens"," when your backend returns JWTs. It stores ",[274,857,858],{},"accessToken",", ",[274,861,862],{},"refreshToken",", and ",[274,865,866],{},"expiresAt"," in the session — enabling ",[274,869,870],{},"getAccessToken()",", token refresh, and expiry tracking.",[290,873],{},[293,875,877],{"id":876},"registration","Registration",[271,879,880,881,335],{},"Pass the provider to ",[274,882,199],{},[306,884,886],{"className":308,"code":885,"language":310,"meta":311,"style":311},"final client = AuthyraClient(\n  providers: [\n    CredentialsProvider.withTokens(\n      id: 'email',\n      authorize: myAuthorize,\n    ),\n  ],\n  storage: SecureAuthStorage(), // or InMemoryStorage() for tests\n);\n",[274,887,888,903,913,924,934,946,952,959,977],{"__ignoreMap":311},[315,889,890,893,896,898,901],{"class":317,"line":318},[315,891,892],{"class":366},"final",[315,894,895],{"class":324}," client ",[315,897,373],{"class":334},[315,899,900],{"class":321}," AuthyraClient",[315,902,325],{"class":324},[315,904,905,908,910],{"class":317,"line":328},[315,906,907],{"class":324},"  providers",[315,909,335],{"class":334},[315,911,912],{"class":324}," [\n",[315,914,915,918,920,922],{"class":317,"line":345},[315,916,917],{"class":321},"    CredentialsProvider",[315,919,382],{"class":334},[315,921,595],{"class":385},[315,923,325],{"class":324},[315,925,926,928,930,932],{"class":317,"line":363},[315,927,457],{"class":324},[315,929,335],{"class":334},[315,931,339],{"class":338},[315,933,342],{"class":334},[315,935,936,939,941,944],{"class":317,"line":409},[315,937,938],{"class":324},"      authorize",[315,940,335],{"class":334},[315,942,943],{"class":324}," myAuthorize",[315,945,342],{"class":334},[315,947,948,950],{"class":317,"line":443},[315,949,525],{"class":324},[315,951,342],{"class":334},[315,953,954,957],{"class":317,"line":454},[315,955,956],{"class":324},"  ]",[315,958,342],{"class":334},[315,960,961,964,966,969,972,974],{"class":317,"line":478},[315,962,963],{"class":324},"  storage",[315,965,335],{"class":334},[315,967,968],{"class":321}," SecureAuthStorage",[315,970,971],{"class":324},"()",[315,973,395],{"class":334},[315,975,976],{"class":439}," // or InMemoryStorage() for tests\n",[315,978,979,982],{"class":317,"line":500},[315,980,981],{"class":324},")",[315,983,406],{"class":334},[271,985,544,986,989,990,335],{},[274,987,988],{},"id"," must be unique within a client. Use it as the first argument to ",[274,991,570],{},[306,993,995],{"className":308,"code":994,"language":310,"meta":311,"style":311},"await Authyra.instance.signIn('email', params: {\n  'email':    'alice@example.com',\n  'password': 's3cr3t',\n});\n",[274,996,997,1027,1039,1051],{"__ignoreMap":311},[315,998,999,1002,1005,1007,1010,1012,1014,1016,1018,1020,1023,1025],{"class":317,"line":318},[315,1000,1001],{"class":356},"await",[315,1003,1004],{"class":321}," Authyra",[315,1006,382],{"class":334},[315,1008,1009],{"class":324},"instance",[315,1011,382],{"class":334},[315,1013,570],{"class":385},[315,1015,389],{"class":324},[315,1017,493],{"class":338},[315,1019,395],{"class":334},[315,1021,1022],{"class":324}," params",[315,1024,335],{"class":334},[315,1026,360],{"class":324},[315,1028,1029,1032,1034,1037],{"class":317,"line":328},[315,1030,1031],{"class":338},"  'email'",[315,1033,335],{"class":334},[315,1035,1036],{"class":338},"    'alice@example.com'",[315,1038,342],{"class":334},[315,1040,1041,1044,1046,1049],{"class":317,"line":345},[315,1042,1043],{"class":338},"  'password'",[315,1045,335],{"class":334},[315,1047,1048],{"class":338}," 's3cr3t'",[315,1050,342],{"class":334},[315,1052,1053,1056],{"class":317,"line":363},[315,1054,1055],{"class":324},"})",[315,1057,406],{"class":334},[290,1059],{},[293,1061,1063],{"id":1062},"signing-in","Signing in",[306,1065,1067],{"className":308,"code":1066,"language":310,"meta":311,"style":311},"try {\n  final user = await Authyra.instance.signIn('email', params: {\n    'email':    'alice@example.com',\n    'password': 's3cr3t',\n  });\n  print('Welcome, ${user.name}');\n} on AuthenticationFailedException {\n  // Provider returned null — wrong credentials\n  showError('Invalid email or password');\n} on ProviderNotFoundException {\n  // No provider registered with id 'email'\n  showError('Auth not configured');\n}\n",[274,1068,1069,1076,1110,1121,1132,1139,1171,1184,1189,1203,1214,1219,1232],{"__ignoreMap":311},[315,1070,1071,1074],{"class":317,"line":318},[315,1072,1073],{"class":356},"try",[315,1075,360],{"class":324},[315,1077,1078,1081,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1106,1108],{"class":317,"line":328},[315,1079,1080],{"class":366},"  final",[315,1082,1083],{"class":324}," user ",[315,1085,373],{"class":334},[315,1087,376],{"class":356},[315,1089,1004],{"class":321},[315,1091,382],{"class":334},[315,1093,1009],{"class":324},[315,1095,382],{"class":334},[315,1097,570],{"class":385},[315,1099,389],{"class":324},[315,1101,493],{"class":338},[315,1103,395],{"class":334},[315,1105,1022],{"class":324},[315,1107,335],{"class":334},[315,1109,360],{"class":324},[315,1111,1112,1115,1117,1119],{"class":317,"line":345},[315,1113,1114],{"class":338},"    'email'",[315,1116,335],{"class":334},[315,1118,1036],{"class":338},[315,1120,342],{"class":334},[315,1122,1123,1126,1128,1130],{"class":317,"line":363},[315,1124,1125],{"class":338},"    'password'",[315,1127,335],{"class":334},[315,1129,1048],{"class":338},[315,1131,342],{"class":334},[315,1133,1134,1137],{"class":317,"line":409},[315,1135,1136],{"class":324},"  })",[315,1138,406],{"class":334},[315,1140,1141,1144,1146,1149,1152,1156,1158,1161,1164,1167,1169],{"class":317,"line":443},[315,1142,1143],{"class":385},"  print",[315,1145,389],{"class":324},[315,1147,1148],{"class":338},"'Welcome, ",[315,1150,1151],{"class":324},"${",[315,1153,1155],{"class":1154},"sHdIc","user",[315,1157,382],{"class":324},[315,1159,1160],{"class":1154},"name",[315,1162,1163],{"class":324},"}",[315,1165,1166],{"class":338},"'",[315,1168,981],{"class":324},[315,1170,406],{"class":334},[315,1172,1173,1176,1179,1182],{"class":317,"line":454},[315,1174,1175],{"class":324},"} ",[315,1177,1178],{"class":356},"on",[315,1180,1181],{"class":321}," AuthenticationFailedException",[315,1183,360],{"class":324},[315,1185,1186],{"class":317,"line":478},[315,1187,1188],{"class":439},"  // Provider returned null — wrong credentials\n",[315,1190,1191,1194,1196,1199,1201],{"class":317,"line":500},[315,1192,1193],{"class":385},"  showError",[315,1195,389],{"class":324},[315,1197,1198],{"class":338},"'Invalid email or password'",[315,1200,981],{"class":324},[315,1202,406],{"class":334},[315,1204,1205,1207,1209,1212],{"class":317,"line":522},[315,1206,1175],{"class":324},[315,1208,1178],{"class":356},[315,1210,1211],{"class":321}," ProviderNotFoundException",[315,1213,360],{"class":324},[315,1215,1216],{"class":317,"line":530},[315,1217,1218],{"class":439},"  // No provider registered with id 'email'\n",[315,1220,1221,1223,1225,1228,1230],{"class":317,"line":538},[315,1222,1193],{"class":385},[315,1224,389],{"class":324},[315,1226,1227],{"class":338},"'Auth not configured'",[315,1229,981],{"class":324},[315,1231,406],{"class":334},[315,1233,1234],{"class":317,"line":778},[315,1235,1236],{"class":324},"}\n",[290,1238],{},[293,1240,1242],{"id":1241},"multiple-credential-providers","Multiple credential providers",[271,1244,1245,1246,1248,1249,335],{},"Register as many ",[274,1247,276],{}," instances as you need, each with a unique ",[274,1250,988],{},[306,1252,1254],{"className":308,"code":1253,"language":310,"meta":311,"style":311},"AuthyraClient(\n  providers: [\n    CredentialsProvider(id: 'email', authorize: emailAuthorize),\n    CredentialsProvider(id: 'username', authorize: usernameAuthorize),\n    CredentialsProvider(id: 'phone', authorize: phoneAuthorize),\n  ],\n  storage: storage,\n)\n",[274,1255,1256,1262,1270,1293,1315,1337,1343,1354],{"__ignoreMap":311},[315,1257,1258,1260],{"class":317,"line":318},[315,1259,199],{"class":321},[315,1261,325],{"class":324},[315,1263,1264,1266,1268],{"class":317,"line":328},[315,1265,907],{"class":324},[315,1267,335],{"class":334},[315,1269,912],{"class":324},[315,1271,1272,1274,1277,1279,1281,1283,1286,1288,1291],{"class":317,"line":345},[315,1273,917],{"class":321},[315,1275,1276],{"class":324},"(id",[315,1278,335],{"class":334},[315,1280,339],{"class":338},[315,1282,395],{"class":334},[315,1284,1285],{"class":324}," authorize",[315,1287,335],{"class":334},[315,1289,1290],{"class":324}," emailAuthorize)",[315,1292,342],{"class":334},[315,1294,1295,1297,1299,1301,1304,1306,1308,1310,1313],{"class":317,"line":363},[315,1296,917],{"class":321},[315,1298,1276],{"class":324},[315,1300,335],{"class":334},[315,1302,1303],{"class":338}," 'username'",[315,1305,395],{"class":334},[315,1307,1285],{"class":324},[315,1309,335],{"class":334},[315,1311,1312],{"class":324}," usernameAuthorize)",[315,1314,342],{"class":334},[315,1316,1317,1319,1321,1323,1326,1328,1330,1332,1335],{"class":317,"line":409},[315,1318,917],{"class":321},[315,1320,1276],{"class":324},[315,1322,335],{"class":334},[315,1324,1325],{"class":338}," 'phone'",[315,1327,395],{"class":334},[315,1329,1285],{"class":324},[315,1331,335],{"class":334},[315,1333,1334],{"class":324}," phoneAuthorize)",[315,1336,342],{"class":334},[315,1338,1339,1341],{"class":317,"line":443},[315,1340,956],{"class":324},[315,1342,342],{"class":334},[315,1344,1345,1347,1349,1352],{"class":317,"line":454},[315,1346,963],{"class":324},[315,1348,335],{"class":334},[315,1350,1351],{"class":324}," storage",[315,1353,342],{"class":334},[315,1355,1356],{"class":317,"line":478},[315,1357,541],{"class":324},[290,1359],{},[293,1361,1363],{"id":1362},"token-refresh","Token refresh",[271,1365,1366,1368,1369,1372],{},[274,1367,276],{}," sets ",[274,1370,1371],{},"supportsRefresh: false"," by default — it has no built-in refresh implementation.",[271,1374,1375,1376,1378,1379,335],{},"To add refresh support, implement ",[274,1377,212],{}," directly instead of using ",[274,1380,276],{},[306,1382,1384],{"className":308,"code":1383,"language":310,"meta":311,"style":311},"class MyApiProvider implements AuthProvider {\n  @override String get id => 'my-api';\n  @override AuthProviderType get type => AuthProviderType.credentials;\n  @override bool get supportsRefresh => true;\n\n  @override\n  Future\u003CAuthSignInResult?> signIn({Map\u003CString, dynamic>? params}) async {\n    final res = await myApi.post('/auth/login', body: params);\n    if (res.statusCode != 200) return null;\n    return AuthSignInResult(\n      user:         AuthUser(id: res.data['id'], email: res.data['email']),\n      accessToken:  res.data['accessToken'],\n      refreshToken: res.data['refreshToken'],\n      expiresAt:    DateTime.parse(res.data['expiresAt']),\n    );\n  }\n\n  @override\n  Future\u003CAuthTokenResult?> refreshToken(String refreshToken) async {\n    final res = await myApi.post('/auth/refresh',\n        body: {'refreshToken': refreshToken});\n    if (res.statusCode != 200) return null;\n    return AuthTokenResult(\n      accessToken: res.data['accessToken'],\n      expiresAt:   DateTime.parse(res.data['expiresAt']),\n    );\n  }\n}\n",[274,1385,1386,1402,1424,1447,1464,1470,1475,1520,1551,1571,1579,1621,1639,1657,1681,1687,1692,1696,1701,1726,1750,1770,1791,1801,1820,1846,1853,1858],{"__ignoreMap":311},[315,1387,1388,1391,1394,1397,1400],{"class":317,"line":318},[315,1389,1390],{"class":334},"class",[315,1392,1393],{"class":321}," MyApiProvider",[315,1395,1396],{"class":334}," implements",[315,1398,1399],{"class":321}," AuthProvider",[315,1401,360],{"class":324},[315,1403,1404,1407,1410,1413,1416,1419,1422],{"class":317,"line":328},[315,1405,1406],{"class":366},"  @override",[315,1408,1409],{"class":321}," String",[315,1411,1412],{"class":334}," get",[315,1414,1415],{"class":324}," id ",[315,1417,1418],{"class":334},"=>",[315,1420,1421],{"class":338}," 'my-api'",[315,1423,406],{"class":334},[315,1425,1426,1428,1431,1433,1436,1438,1440,1442,1445],{"class":317,"line":345},[315,1427,1406],{"class":366},[315,1429,1430],{"class":321}," AuthProviderType",[315,1432,1412],{"class":334},[315,1434,1435],{"class":324}," type ",[315,1437,1418],{"class":334},[315,1439,1430],{"class":321},[315,1441,382],{"class":334},[315,1443,1444],{"class":324},"credentials",[315,1446,406],{"class":334},[315,1448,1449,1451,1454,1456,1459,1461],{"class":317,"line":363},[315,1450,1406],{"class":366},[315,1452,1453],{"class":321}," bool",[315,1455,1412],{"class":334},[315,1457,1458],{"class":324}," supportsRefresh ",[315,1460,1418],{"class":334},[315,1462,1463],{"class":334}," true;\n",[315,1465,1466],{"class":317,"line":409},[315,1467,1469],{"emptyLinePlaceholder":1468},true,"\n",[315,1471,1472],{"class":317,"line":443},[315,1473,1474],{"class":366},"  @override\n",[315,1476,1477,1480,1483,1486,1489,1491,1494,1497,1499,1502,1504,1507,1510,1513,1516,1518],{"class":317,"line":454},[315,1478,1479],{"class":321},"  Future",[315,1481,1482],{"class":324},"\u003C",[315,1484,1485],{"class":321},"AuthSignInResult",[315,1487,1488],{"class":324},"?> ",[315,1490,570],{"class":385},[315,1492,1493],{"class":324},"({",[315,1495,1496],{"class":321},"Map",[315,1498,1482],{"class":324},[315,1500,1501],{"class":321},"String",[315,1503,859],{"class":324},[315,1505,1506],{"class":321},"dynamic",[315,1508,1509],{"class":324},">",[315,1511,1512],{"class":334},"?",[315,1514,1515],{"class":324}," params}) ",[315,1517,357],{"class":356},[315,1519,360],{"class":324},[315,1521,1522,1524,1526,1528,1530,1532,1534,1536,1538,1540,1542,1544,1546,1549],{"class":317,"line":478},[315,1523,367],{"class":366},[315,1525,370],{"class":324},[315,1527,373],{"class":334},[315,1529,376],{"class":356},[315,1531,379],{"class":324},[315,1533,382],{"class":334},[315,1535,386],{"class":385},[315,1537,389],{"class":324},[315,1539,392],{"class":338},[315,1541,395],{"class":334},[315,1543,398],{"class":324},[315,1545,335],{"class":334},[315,1547,1548],{"class":324}," params)",[315,1550,406],{"class":334},[315,1552,1553,1555,1557,1559,1561,1563,1565,1567,1569],{"class":317,"line":500},[315,1554,412],{"class":356},[315,1556,415],{"class":324},[315,1558,382],{"class":334},[315,1560,420],{"class":324},[315,1562,423],{"class":334},[315,1564,427],{"class":426},[315,1566,430],{"class":324},[315,1568,433],{"class":356},[315,1570,670],{"class":334},[315,1572,1573,1575,1577],{"class":317,"line":522},[315,1574,446],{"class":356},[315,1576,677],{"class":321},[315,1578,325],{"class":324},[315,1580,1581,1583,1585,1588,1590,1592,1594,1596,1598,1600,1602,1604,1607,1609,1611,1613,1615,1617,1619],{"class":317,"line":530},[315,1582,684],{"class":324},[315,1584,335],{"class":334},[315,1586,1587],{"class":321},"         AuthUser",[315,1589,1276],{"class":324},[315,1591,335],{"class":334},[315,1593,486],{"class":324},[315,1595,382],{"class":334},[315,1597,467],{"class":324},[315,1599,470],{"class":338},[315,1601,473],{"class":324},[315,1603,395],{"class":334},[315,1605,1606],{"class":324}," email",[315,1608,335],{"class":334},[315,1610,486],{"class":324},[315,1612,382],{"class":334},[315,1614,467],{"class":324},[315,1616,493],{"class":338},[315,1618,825],{"class":324},[315,1620,342],{"class":334},[315,1622,1623,1625,1627,1629,1631,1633,1635,1637],{"class":317,"line":538},[315,1624,760],{"class":324},[315,1626,335],{"class":334},[315,1628,508],{"class":324},[315,1630,382],{"class":334},[315,1632,467],{"class":324},[315,1634,771],{"class":338},[315,1636,473],{"class":324},[315,1638,342],{"class":334},[315,1640,1641,1643,1645,1647,1649,1651,1653,1655],{"class":317,"line":778},[315,1642,781],{"class":324},[315,1644,335],{"class":334},[315,1646,486],{"class":324},[315,1648,382],{"class":334},[315,1650,467],{"class":324},[315,1652,792],{"class":338},[315,1654,473],{"class":324},[315,1656,342],{"class":334},[315,1658,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679],{"class":317,"line":799},[315,1660,802],{"class":324},[315,1662,335],{"class":334},[315,1664,807],{"class":321},[315,1666,382],{"class":334},[315,1668,812],{"class":385},[315,1670,815],{"class":324},[315,1672,382],{"class":334},[315,1674,467],{"class":324},[315,1676,822],{"class":338},[315,1678,825],{"class":324},[315,1680,342],{"class":334},[315,1682,1683,1685],{"class":317,"line":830},[315,1684,525],{"class":324},[315,1686,406],{"class":334},[315,1688,1689],{"class":317,"line":837},[315,1690,1691],{"class":324},"  }\n",[315,1693,1694],{"class":317,"line":844},[315,1695,1469],{"emptyLinePlaceholder":1468},[315,1697,1699],{"class":317,"line":1698},18,[315,1700,1474],{"class":366},[315,1702,1704,1706,1708,1711,1713,1715,1717,1719,1722,1724],{"class":317,"line":1703},19,[315,1705,1479],{"class":321},[315,1707,1482],{"class":324},[315,1709,1710],{"class":321},"AuthTokenResult",[315,1712,1488],{"class":324},[315,1714,862],{"class":385},[315,1716,389],{"class":324},[315,1718,1501],{"class":321},[315,1720,1721],{"class":324}," refreshToken) ",[315,1723,357],{"class":356},[315,1725,360],{"class":324},[315,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1748],{"class":317,"line":1728},20,[315,1730,367],{"class":366},[315,1732,370],{"class":324},[315,1734,373],{"class":334},[315,1736,376],{"class":356},[315,1738,379],{"class":324},[315,1740,382],{"class":334},[315,1742,386],{"class":385},[315,1744,389],{"class":324},[315,1746,1747],{"class":338},"'/auth/refresh'",[315,1749,342],{"class":334},[315,1751,1753,1756,1758,1761,1763,1765,1768],{"class":317,"line":1752},21,[315,1754,1755],{"class":324},"        body",[315,1757,335],{"class":334},[315,1759,1760],{"class":324}," {",[315,1762,792],{"class":338},[315,1764,335],{"class":334},[315,1766,1767],{"class":324}," refreshToken})",[315,1769,406],{"class":334},[315,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789],{"class":317,"line":1772},22,[315,1774,412],{"class":356},[315,1776,415],{"class":324},[315,1778,382],{"class":334},[315,1780,420],{"class":324},[315,1782,423],{"class":334},[315,1784,427],{"class":426},[315,1786,430],{"class":324},[315,1788,433],{"class":356},[315,1790,670],{"class":334},[315,1792,1794,1796,1799],{"class":317,"line":1793},23,[315,1795,446],{"class":356},[315,1797,1798],{"class":321}," AuthTokenResult",[315,1800,325],{"class":324},[315,1802,1804,1806,1808,1810,1812,1814,1816,1818],{"class":317,"line":1803},24,[315,1805,760],{"class":324},[315,1807,335],{"class":334},[315,1809,486],{"class":324},[315,1811,382],{"class":334},[315,1813,467],{"class":324},[315,1815,771],{"class":338},[315,1817,473],{"class":324},[315,1819,342],{"class":334},[315,1821,1823,1825,1827,1830,1832,1834,1836,1838,1840,1842,1844],{"class":317,"line":1822},25,[315,1824,802],{"class":324},[315,1826,335],{"class":334},[315,1828,1829],{"class":321},"   DateTime",[315,1831,382],{"class":334},[315,1833,812],{"class":385},[315,1835,815],{"class":324},[315,1837,382],{"class":334},[315,1839,467],{"class":324},[315,1841,822],{"class":338},[315,1843,825],{"class":324},[315,1845,342],{"class":334},[315,1847,1849,1851],{"class":317,"line":1848},26,[315,1850,525],{"class":324},[315,1852,406],{"class":334},[315,1854,1856],{"class":317,"line":1855},27,[315,1857,1691],{"class":324},[315,1859,1861],{"class":317,"line":1860},28,[315,1862,1236],{"class":324},[290,1864],{},[293,1866,160],{"id":1867},"testing",[271,1869,1870,1871,1874],{},"Use ",[274,1872,1873],{},"InMemoryStorage"," and a simple authorize callback to test without a real backend:",[306,1876,1878],{"className":308,"code":1877,"language":310,"meta":311,"style":311},"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: [\n        CredentialsProvider(\n          id: 'email',\n          authorize: (creds) async {\n            if (creds?['password'] == 'correct') {\n              return AuthUser(id: '1', email: creds!['email'] as String);\n            }\n            return null; // wrong password\n          },\n        ),\n      ],\n      storage: InMemoryStorage(),\n    );\n    await client.initialize();\n  });\n\n  test('returns user on valid credentials', () async {\n    final user = await client.signIn('email', params: {\n      'email':    'alice@example.com',\n      'password': 'correct',\n    });\n    expect(user.email, 'alice@example.com');\n  });\n\n  test('throws on wrong password', () {\n    expect(\n      () => client.signIn('email', params: {\n        'email':    'alice@example.com',\n        'password': 'wrong',\n      }),\n      throwsA(isA\u003CAuthenticationFailedException>()),\n    );\n  });\n}\n",[274,1879,1880,1890,1899,1903,1914,1926,1930,1942,1953,1962,1969,1980,1993,2021,2062,2067,2077,2084,2091,2098,2112,2118,2134,2140,2144,2163,2191,2202,2213,2221,2244,2251,2256,2271,2278,2304,2316,2329,2337,2357,2364,2371],{"__ignoreMap":311},[315,1881,1882,1885,1888],{"class":317,"line":318},[315,1883,1884],{"class":426},"import",[315,1886,1887],{"class":338}," 'package:test/test.dart'",[315,1889,406],{"class":334},[315,1891,1892,1894,1897],{"class":317,"line":328},[315,1893,1884],{"class":426},[315,1895,1896],{"class":338}," 'package:authyra/authyra.dart'",[315,1898,406],{"class":334},[315,1900,1901],{"class":317,"line":345},[315,1902,1469],{"emptyLinePlaceholder":1468},[315,1904,1905,1908,1911],{"class":317,"line":363},[315,1906,1907],{"class":366},"void",[315,1909,1910],{"class":385}," main",[315,1912,1913],{"class":324},"() {\n",[315,1915,1916,1919,1921,1924],{"class":317,"line":409},[315,1917,1918],{"class":366},"  late",[315,1920,900],{"class":321},[315,1922,1923],{"class":324}," client",[315,1925,406],{"class":334},[315,1927,1928],{"class":317,"line":443},[315,1929,1469],{"emptyLinePlaceholder":1468},[315,1931,1932,1935,1938,1940],{"class":317,"line":454},[315,1933,1934],{"class":385},"  setUp",[315,1936,1937],{"class":324},"(() ",[315,1939,357],{"class":356},[315,1941,360],{"class":324},[315,1943,1944,1947,1949,1951],{"class":317,"line":478},[315,1945,1946],{"class":324},"    client ",[315,1948,373],{"class":334},[315,1950,900],{"class":321},[315,1952,325],{"class":324},[315,1954,1955,1958,1960],{"class":317,"line":500},[315,1956,1957],{"class":324},"      providers",[315,1959,335],{"class":334},[315,1961,912],{"class":324},[315,1963,1964,1967],{"class":317,"line":522},[315,1965,1966],{"class":321},"        CredentialsProvider",[315,1968,325],{"class":324},[315,1970,1971,1974,1976,1978],{"class":317,"line":530},[315,1972,1973],{"class":324},"          id",[315,1975,335],{"class":334},[315,1977,339],{"class":338},[315,1979,342],{"class":334},[315,1981,1982,1985,1987,1989,1991],{"class":317,"line":538},[315,1983,1984],{"class":324},"          authorize",[315,1986,335],{"class":334},[315,1988,353],{"class":324},[315,1990,357],{"class":356},[315,1992,360],{"class":324},[315,1994,1995,1998,2001,2003,2006,2009,2012,2015,2018],{"class":317,"line":778},[315,1996,1997],{"class":356},"            if",[315,1999,2000],{"class":324}," (creds",[315,2002,1512],{"class":334},[315,2004,2005],{"class":324},"[",[315,2007,2008],{"class":338},"'password'",[315,2010,2011],{"class":324},"] ",[315,2013,2014],{"class":334},"==",[315,2016,2017],{"class":338}," 'correct'",[315,2019,2020],{"class":324},") {\n",[315,2022,2023,2026,2028,2030,2032,2035,2037,2039,2041,2044,2047,2049,2051,2053,2056,2058,2060],{"class":317,"line":799},[315,2024,2025],{"class":356},"              return",[315,2027,449],{"class":321},[315,2029,1276],{"class":324},[315,2031,335],{"class":334},[315,2033,2034],{"class":338}," '1'",[315,2036,395],{"class":334},[315,2038,1606],{"class":324},[315,2040,335],{"class":334},[315,2042,2043],{"class":324}," creds",[315,2045,2046],{"class":334},"!",[315,2048,2005],{"class":324},[315,2050,493],{"class":338},[315,2052,2011],{"class":324},[315,2054,2055],{"class":334},"as",[315,2057,1409],{"class":321},[315,2059,981],{"class":324},[315,2061,406],{"class":334},[315,2063,2064],{"class":317,"line":830},[315,2065,2066],{"class":324},"            }\n",[315,2068,2069,2072,2074],{"class":317,"line":837},[315,2070,2071],{"class":356},"            return",[315,2073,436],{"class":334},[315,2075,2076],{"class":439}," // wrong password\n",[315,2078,2079,2082],{"class":317,"line":844},[315,2080,2081],{"class":324},"          }",[315,2083,342],{"class":334},[315,2085,2086,2089],{"class":317,"line":1698},[315,2087,2088],{"class":324},"        )",[315,2090,342],{"class":334},[315,2092,2093,2096],{"class":317,"line":1703},[315,2094,2095],{"class":324},"      ]",[315,2097,342],{"class":334},[315,2099,2100,2103,2105,2108,2110],{"class":317,"line":1728},[315,2101,2102],{"class":324},"      storage",[315,2104,335],{"class":334},[315,2106,2107],{"class":321}," InMemoryStorage",[315,2109,971],{"class":324},[315,2111,342],{"class":334},[315,2113,2114,2116],{"class":317,"line":1752},[315,2115,525],{"class":324},[315,2117,406],{"class":334},[315,2119,2120,2123,2125,2127,2130,2132],{"class":317,"line":1772},[315,2121,2122],{"class":356},"    await",[315,2124,1923],{"class":324},[315,2126,382],{"class":334},[315,2128,2129],{"class":385},"initialize",[315,2131,971],{"class":324},[315,2133,406],{"class":334},[315,2135,2136,2138],{"class":317,"line":1793},[315,2137,1136],{"class":324},[315,2139,406],{"class":334},[315,2141,2142],{"class":317,"line":1803},[315,2143,1469],{"emptyLinePlaceholder":1468},[315,2145,2146,2149,2151,2154,2156,2159,2161],{"class":317,"line":1822},[315,2147,2148],{"class":385},"  test",[315,2150,389],{"class":324},[315,2152,2153],{"class":338},"'returns user on valid credentials'",[315,2155,395],{"class":334},[315,2157,2158],{"class":324}," () ",[315,2160,357],{"class":356},[315,2162,360],{"class":324},[315,2164,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189],{"class":317,"line":1848},[315,2166,367],{"class":366},[315,2168,1083],{"class":324},[315,2170,373],{"class":334},[315,2172,376],{"class":356},[315,2174,1923],{"class":324},[315,2176,382],{"class":334},[315,2178,570],{"class":385},[315,2180,389],{"class":324},[315,2182,493],{"class":338},[315,2184,395],{"class":334},[315,2186,1022],{"class":324},[315,2188,335],{"class":334},[315,2190,360],{"class":324},[315,2192,2193,2196,2198,2200],{"class":317,"line":1855},[315,2194,2195],{"class":338},"      'email'",[315,2197,335],{"class":334},[315,2199,1036],{"class":338},[315,2201,342],{"class":334},[315,2203,2204,2207,2209,2211],{"class":317,"line":1860},[315,2205,2206],{"class":338},"      'password'",[315,2208,335],{"class":334},[315,2210,2017],{"class":338},[315,2212,342],{"class":334},[315,2214,2216,2219],{"class":317,"line":2215},29,[315,2217,2218],{"class":324},"    })",[315,2220,406],{"class":334},[315,2222,2224,2227,2230,2232,2235,2237,2240,2242],{"class":317,"line":2223},30,[315,2225,2226],{"class":385},"    expect",[315,2228,2229],{"class":324},"(user",[315,2231,382],{"class":334},[315,2233,2234],{"class":324},"email",[315,2236,395],{"class":334},[315,2238,2239],{"class":338}," 'alice@example.com'",[315,2241,981],{"class":324},[315,2243,406],{"class":334},[315,2245,2247,2249],{"class":317,"line":2246},31,[315,2248,1136],{"class":324},[315,2250,406],{"class":334},[315,2252,2254],{"class":317,"line":2253},32,[315,2255,1469],{"emptyLinePlaceholder":1468},[315,2257,2259,2261,2263,2266,2268],{"class":317,"line":2258},33,[315,2260,2148],{"class":385},[315,2262,389],{"class":324},[315,2264,2265],{"class":338},"'throws on wrong password'",[315,2267,395],{"class":334},[315,2269,2270],{"class":324}," () {\n",[315,2272,2274,2276],{"class":317,"line":2273},34,[315,2275,2226],{"class":385},[315,2277,325],{"class":324},[315,2279,2281,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302],{"class":317,"line":2280},35,[315,2282,2283],{"class":324},"      () ",[315,2285,1418],{"class":334},[315,2287,1923],{"class":324},[315,2289,382],{"class":334},[315,2291,570],{"class":385},[315,2293,389],{"class":324},[315,2295,493],{"class":338},[315,2297,395],{"class":334},[315,2299,1022],{"class":324},[315,2301,335],{"class":334},[315,2303,360],{"class":324},[315,2305,2307,2310,2312,2314],{"class":317,"line":2306},36,[315,2308,2309],{"class":338},"        'email'",[315,2311,335],{"class":334},[315,2313,1036],{"class":338},[315,2315,342],{"class":334},[315,2317,2319,2322,2324,2327],{"class":317,"line":2318},37,[315,2320,2321],{"class":338},"        'password'",[315,2323,335],{"class":334},[315,2325,2326],{"class":338}," 'wrong'",[315,2328,342],{"class":334},[315,2330,2332,2335],{"class":317,"line":2331},38,[315,2333,2334],{"class":324},"      })",[315,2336,342],{"class":334},[315,2338,2340,2343,2345,2348,2350,2352,2355],{"class":317,"line":2339},39,[315,2341,2342],{"class":385},"      throwsA",[315,2344,389],{"class":324},[315,2346,2347],{"class":385},"isA",[315,2349,1482],{"class":324},[315,2351,574],{"class":321},[315,2353,2354],{"class":324},">())",[315,2356,342],{"class":334},[315,2358,2360,2362],{"class":317,"line":2359},40,[315,2361,525],{"class":324},[315,2363,406],{"class":334},[315,2365,2367,2369],{"class":317,"line":2366},41,[315,2368,1136],{"class":324},[315,2370,406],{"class":334},[315,2372,2374],{"class":317,"line":2373},42,[315,2375,1236],{"class":324},[290,2377],{},[293,2379,2381],{"id":2380},"see-also","See also",[2383,2384,2385,2393,2402],"ul",{},[2386,2387,2388,2392],"li",{},[2389,2390,2391],"a",{"href":124},"Email Auth guide →"," — full end-to-end walkthrough",[2386,2394,2395,2398,2399,2401],{},[2389,2396,2397],{"href":153},"Custom Provider →"," — implement ",[274,2400,212],{}," directly",[2386,2403,2404],{},[2389,2405,2406],{"href":200},"API Reference — AuthyraClient →",[2408,2409,2410],"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 .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 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 .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 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 .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":311,"searchDepth":328,"depth":328,"links":2412},[2413,2417,2418,2419,2420,2421,2422],{"id":295,"depth":328,"text":296,"children":2414},[2415,2416],{"id":300,"depth":345,"text":301},{"id":577,"depth":345,"text":578},{"id":876,"depth":328,"text":877},{"id":1062,"depth":328,"text":1063},{"id":1241,"depth":328,"text":1242},{"id":1362,"depth":328,"text":1363},{"id":1867,"depth":328,"text":160},{"id":2380,"depth":328,"text":2381},"Email/password and any form-based authentication with CredentialsProvider.","md",null,{},{"title":2428,"description":2429},"Credentials Provider | Authyra","Use CredentialsProvider for email/password or any custom credentials flow. Basic and .withTokens variants explained.","Gw9ImgPnJvVhU6hZQZvkJRSk2lzSAhqC20DAb6q5eOU",[2432,2434],{"title":85,"path":86,"stem":87,"description":2433,"icon":88,"children":-1},"AuthEventBus — écouter les événements post-action (SignInEvent, SignOutEvent, TokenRefreshEvent…).",{"title":98,"path":99,"stem":100,"description":2435,"children":-1},"Generic OAuth 2.0 Authorization Code provider with PKCE for any identity provider.",1782700510206]