[{"data":1,"prerenderedAt":2145},["ShallowReactive",2],{"navigation_docs":3,"-providers-proxy-oauth":265,"-providers-proxy-oauth-surround":2140},[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":114,"body":267,"description":2132,"extension":2133,"links":2134,"meta":2135,"navigation":1057,"path":115,"seo":2136,"stem":116,"__hash__":2139},"docs/3.providers/6.proxy-oauth.md",{"type":268,"value":269,"toc":2113},"minimark",[270,278,288,291,304,307,312,322,350,352,356,412,455,457,460,638,806,808,812,817,822,828,831,871,875,880,885,891,1026,1028,1032,1036,1287,1291,1518,1522,1531,1568,1576,1626,1628,1632,1766,1768,1772,1789,1814,1827,1829,1833,1836,2010,2019,2021,2024,2029,2056,2063,2066,2074,2082,2084,2088,2109],[271,272,273,277],"p",{},[274,275,276],"code",{},"ProxyOAuthProvider"," delegates the entire OAuth code exchange to your backend. The app opens the authorization URL and handles the return deep link — your server does everything else: holds the client secret, exchanges the code, creates the session, and sends a custom token back to the app.",[271,279,280,284,285],{},[281,282,283],"strong",{},"Package",": ",[274,286,287],{},"authyra_flutter",[271,289,290],{},"Use this when:",[292,293,294,298,301],"ul",{},[295,296,297],"li",{},"You cannot safely embed a client secret in the app (GitHub, Facebook, or any provider that doesn't support PKCE).",[295,299,300],{},"You want full control over the session lifecycle on the server.",[295,302,303],{},"You are already running a backend for your app.",[305,306],"hr",{},[308,309,311],"h2",{"id":310},"how-it-works","How it works",[313,314,320],"pre",{"className":315,"code":317,"language":318,"meta":319},[316],"language-text","App                Backend                  Identity Provider\n │──POST /initiate──►│                              │\n │◄── { authorization_url } ───────────────────────│\n │                   │                              │\n │── opens browser ──►                              │\n │                                                 │\n │                   │◄── GET /oauth-callback?code ─│\n │                   │── exchange code ─────────────►│\n │                   │◄── { access_token, … } ──────│\n │                   │── create session              │\n │◄── myapp://callback?token=CUSTOM_JWT ────────────│\n │                   │                              │\n │──POST /callback { token }──►│                    │\n │◄── { user, accessToken, … } │                    │\n","text","",[274,321,317],{"__ignoreMap":319},[323,324,325,328,331,334,337,344,347],"ol",{},[295,326,327],{},"App POSTs to your backend's initiation endpoint.",[295,329,330],{},"Backend returns the full authorization URL (including any client secret it needs internally).",[295,332,333],{},"App opens the URL in the browser.",[295,335,336],{},"User authenticates with the identity provider.",[295,338,339,340,343],{},"Identity provider redirects to your ",[281,341,342],{},"backend"," callback URL.",[295,345,346],{},"Backend exchanges the code, creates a session, then deep-links the app with a short-lived custom token.",[295,348,349],{},"App calls its own backend callback endpoint with that token to exchange it for the full session.",[305,351],{},[308,353,355],{"id":354},"constructor","Constructor",[313,357,361],{"className":358,"code":359,"language":360,"meta":319,"style":319},"language-dart shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ProxyOAuthProvider({\n  required ProxyOAuthConfig config,\n  Dio? dio,\n})\n","dart",[274,362,363,375,392,406],{"__ignoreMap":319},[364,365,368,371],"span",{"class":366,"line":367},"line",1,[364,369,276],{"class":370},"sBMFI",[364,372,374],{"class":373},"sTEyZ","({\n",[364,376,378,382,385,388],{"class":366,"line":377},2,[364,379,381],{"class":380},"spNyl","  required",[364,383,384],{"class":370}," ProxyOAuthConfig",[364,386,387],{"class":373}," config",[364,389,391],{"class":390},"sMK4o",",\n",[364,393,395,398,401,404],{"class":366,"line":394},3,[364,396,397],{"class":370},"  Dio",[364,399,400],{"class":390},"?",[364,402,403],{"class":373}," dio",[364,405,391],{"class":390},[364,407,409],{"class":366,"line":408},4,[364,410,411],{"class":373},"})\n",[413,414,415,428],"table",{},[416,417,418],"thead",{},[419,420,421,425],"tr",{},[422,423,424],"th",{},"Parameter",[422,426,427],{},"Description",[429,430,431,445],"tbody",{},[419,432,433,439],{},[434,435,436],"td",{},[274,437,438],{},"config",[434,440,441,444],{},[274,442,443],{},"ProxyOAuthConfig"," — backend endpoints and callback scheme",[419,446,447,452],{},[434,448,449],{},[274,450,451],{},"dio",[434,453,454],{},"Optional Dio instance for testing or shared interceptors",[305,456],{},[308,458,443],{"id":459},"proxyoauthconfig",[313,461,463],{"className":358,"code":462,"language":360,"meta":319,"style":319},"ProxyOAuthConfig({\n  required String providerName,\n  required String initiationEndpoint,\n  required String callbackEndpoint,\n  required String backendRedirectUri,\n  required String appCallbackScheme,\n  required AuthUser Function(Map\u003CString, dynamic>) userExtractor,\n  String? userInfoEndpoint,\n  Map\u003CString, String>? headers,\n  Duration timeout = const Duration(minutes: 5),\n})\n",[274,464,465,471,483,494,505,517,529,563,576,600,633],{"__ignoreMap":319},[364,466,467,469],{"class":366,"line":367},[364,468,443],{"class":370},[364,470,374],{"class":373},[364,472,473,475,478,481],{"class":366,"line":377},[364,474,381],{"class":380},[364,476,477],{"class":370}," String",[364,479,480],{"class":373}," providerName",[364,482,391],{"class":390},[364,484,485,487,489,492],{"class":366,"line":394},[364,486,381],{"class":380},[364,488,477],{"class":370},[364,490,491],{"class":373}," initiationEndpoint",[364,493,391],{"class":390},[364,495,496,498,500,503],{"class":366,"line":408},[364,497,381],{"class":380},[364,499,477],{"class":370},[364,501,502],{"class":373}," callbackEndpoint",[364,504,391],{"class":390},[364,506,508,510,512,515],{"class":366,"line":507},5,[364,509,381],{"class":380},[364,511,477],{"class":370},[364,513,514],{"class":373}," backendRedirectUri",[364,516,391],{"class":390},[364,518,520,522,524,527],{"class":366,"line":519},6,[364,521,381],{"class":380},[364,523,477],{"class":370},[364,525,526],{"class":373}," appCallbackScheme",[364,528,391],{"class":390},[364,530,532,534,537,540,543,546,549,552,555,558,561],{"class":366,"line":531},7,[364,533,381],{"class":380},[364,535,536],{"class":370}," AuthUser",[364,538,539],{"class":370}," Function",[364,541,542],{"class":373},"(",[364,544,545],{"class":370},"Map",[364,547,548],{"class":373},"\u003C",[364,550,551],{"class":370},"String",[364,553,554],{"class":373},", ",[364,556,557],{"class":370},"dynamic",[364,559,560],{"class":373},">) userExtractor",[364,562,391],{"class":390},[364,564,566,569,571,574],{"class":366,"line":565},8,[364,567,568],{"class":370},"  String",[364,570,400],{"class":390},[364,572,573],{"class":373}," userInfoEndpoint",[364,575,391],{"class":390},[364,577,579,582,584,586,588,590,593,595,598],{"class":366,"line":578},9,[364,580,581],{"class":370},"  Map",[364,583,548],{"class":373},[364,585,551],{"class":370},[364,587,554],{"class":373},[364,589,551],{"class":370},[364,591,592],{"class":373},">",[364,594,400],{"class":390},[364,596,597],{"class":373}," headers",[364,599,391],{"class":390},[364,601,603,606,609,612,615,618,621,624,628,631],{"class":366,"line":602},10,[364,604,605],{"class":370},"  Duration",[364,607,608],{"class":373}," timeout ",[364,610,611],{"class":390},"=",[364,613,614],{"class":380}," const",[364,616,617],{"class":370}," Duration",[364,619,620],{"class":373},"(minutes",[364,622,623],{"class":390},":",[364,625,627],{"class":626},"sbssI"," 5",[364,629,630],{"class":373},")",[364,632,391],{"class":390},[364,634,636],{"class":366,"line":635},11,[364,637,411],{"class":373},[413,639,640,652],{},[416,641,642],{},[419,643,644,647,650],{},[422,645,646],{},"Field",[422,648,649],{},"Default",[422,651,427],{},[429,653,654,674,692,707,719,734,752,774,788],{},[419,655,656,661,664],{},[434,657,658],{},[274,659,660],{},"providerName",[434,662,663],{},"required",[434,665,666,667,670,671,630],{},"Lowercase slug — used as ",[274,668,669],{},"AuthProvider.id"," (e.g. ",[274,672,673],{},"'google'",[419,675,676,681,683],{},[434,677,678],{},[274,679,680],{},"initiationEndpoint",[434,682,663],{},[434,684,685,688,689],{},[274,686,687],{},"POST"," — returns ",[274,690,691],{},"{ \"authorization_url\": \"…\" }",[419,693,694,699,701],{},[434,695,696],{},[274,697,698],{},"callbackEndpoint",[434,700,663],{},[434,702,703,706],{},[274,704,705],{},"POST { \"token\": \"…\" }"," — returns user + session data",[419,708,709,714,716],{},[434,710,711],{},[274,712,713],{},"backendRedirectUri",[434,715,663],{},[434,717,718],{},"HTTPS URI the identity provider redirects to on your backend",[419,720,721,726,728],{},[434,722,723],{},[274,724,725],{},"appCallbackScheme",[434,727,663],{},[434,729,730,731,630],{},"Custom URI prefix the backend deep-links to after exchange (e.g. ",[274,732,733],{},"myapp://auth/callback",[419,735,736,741,743],{},[434,737,738],{},[274,739,740],{},"userExtractor",[434,742,663],{},[434,744,745,746,748,749],{},"Maps the ",[274,747,698],{}," response JSON to an ",[274,750,751],{},"AuthUser",[419,753,754,759,764],{},[434,755,756],{},[274,757,758],{},"userInfoEndpoint",[434,760,761],{},[274,762,763],{},"null",[434,765,766,767,770,771,773],{},"Optional — ",[274,768,769],{},"GET"," with Bearer token instead of using ",[274,772,698],{}," for user data",[419,775,776,781,785],{},[434,777,778],{},[274,779,780],{},"headers",[434,782,783],{},[274,784,763],{},[434,786,787],{},"Extra headers attached to every backend request",[419,789,790,795,800],{},[434,791,792],{},[274,793,794],{},"timeout",[434,796,797],{},[274,798,799],{},"5 min",[434,801,802,803],{},"Max wait before throwing ",[274,804,805],{},"AuthenticationCancelledException",[305,807],{},[308,809,811],{"id":810},"backend-contract","Backend contract",[813,814,816],"h3",{"id":815},"initiation-endpoint","Initiation endpoint",[271,818,819],{},[274,820,821],{},"POST \u003CinitiationEndpoint>",[271,823,824,825],{},"Request body: ",[274,826,827],{},"{ \"provider\": \"\u003CproviderName>\", \"redirect_uri\": \"\u003CbackendRedirectUri>\" }",[271,829,830],{},"Expected response:",[313,832,836],{"className":833,"code":834,"language":835,"meta":319,"style":319},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"authorization_url\": \"https://accounts.google.com/o/oauth2/v2/auth?...\"\n}\n","json",[274,837,838,843,866],{"__ignoreMap":319},[364,839,840],{"class":366,"line":367},[364,841,842],{"class":390},"{\n",[364,844,845,848,851,854,856,859,863],{"class":366,"line":377},[364,846,847],{"class":390},"  \"",[364,849,850],{"class":380},"authorization_url",[364,852,853],{"class":390},"\"",[364,855,623],{"class":390},[364,857,858],{"class":390}," \"",[364,860,862],{"class":861},"sfazB","https://accounts.google.com/o/oauth2/v2/auth?...",[364,864,865],{"class":390},"\"\n",[364,867,868],{"class":366,"line":394},[364,869,870],{"class":390},"}\n",[813,872,874],{"id":873},"callback-endpoint","Callback endpoint",[271,876,877],{},[274,878,879],{},"POST \u003CcallbackEndpoint>",[271,881,824,882],{},[274,883,884],{},"{ \"token\": \"\u003CCUSTOM_JWT>\" }",[271,886,887,888,890],{},"Expected response (passed to ",[274,889,740],{},"):",[313,892,894],{"className":833,"code":893,"language":835,"meta":319,"style":319},"{\n  \"id\":           \"usr_01j...\",\n  \"email\":        \"alice@example.com\",\n  \"name\":         \"Alice\",\n  \"accessToken\":  \"eyJhbGci...\",\n  \"refreshToken\": \"dGhpcyBp...\",\n  \"expiresAt\":    \"2026-06-01T12:00:00.000Z\"\n}\n",[274,895,896,900,921,942,963,983,1003,1022],{"__ignoreMap":319},[364,897,898],{"class":366,"line":367},[364,899,842],{"class":390},[364,901,902,904,907,909,911,914,917,919],{"class":366,"line":377},[364,903,847],{"class":390},[364,905,906],{"class":380},"id",[364,908,853],{"class":390},[364,910,623],{"class":390},[364,912,913],{"class":390},"           \"",[364,915,916],{"class":861},"usr_01j...",[364,918,853],{"class":390},[364,920,391],{"class":390},[364,922,923,925,928,930,932,935,938,940],{"class":366,"line":394},[364,924,847],{"class":390},[364,926,927],{"class":380},"email",[364,929,853],{"class":390},[364,931,623],{"class":390},[364,933,934],{"class":390},"        \"",[364,936,937],{"class":861},"alice@example.com",[364,939,853],{"class":390},[364,941,391],{"class":390},[364,943,944,946,949,951,953,956,959,961],{"class":366,"line":408},[364,945,847],{"class":390},[364,947,948],{"class":380},"name",[364,950,853],{"class":390},[364,952,623],{"class":390},[364,954,955],{"class":390},"         \"",[364,957,958],{"class":861},"Alice",[364,960,853],{"class":390},[364,962,391],{"class":390},[364,964,965,967,970,972,974,976,979,981],{"class":366,"line":507},[364,966,847],{"class":390},[364,968,969],{"class":380},"accessToken",[364,971,853],{"class":390},[364,973,623],{"class":390},[364,975,847],{"class":390},[364,977,978],{"class":861},"eyJhbGci...",[364,980,853],{"class":390},[364,982,391],{"class":390},[364,984,985,987,990,992,994,996,999,1001],{"class":366,"line":519},[364,986,847],{"class":390},[364,988,989],{"class":380},"refreshToken",[364,991,853],{"class":390},[364,993,623],{"class":390},[364,995,858],{"class":390},[364,997,998],{"class":861},"dGhpcyBp...",[364,1000,853],{"class":390},[364,1002,391],{"class":390},[364,1004,1005,1007,1010,1012,1014,1017,1020],{"class":366,"line":531},[364,1006,847],{"class":390},[364,1008,1009],{"class":380},"expiresAt",[364,1011,853],{"class":390},[364,1013,623],{"class":390},[364,1015,1016],{"class":390},"    \"",[364,1018,1019],{"class":861},"2026-06-01T12:00:00.000Z",[364,1021,865],{"class":390},[364,1023,1024],{"class":366,"line":565},[364,1025,870],{"class":390},[305,1027],{},[308,1029,1031],{"id":1030},"setup","Setup",[813,1033,1035],{"id":1034},"_1-configure-the-provider","1. Configure the provider",[313,1037,1040],{"className":358,"code":1038,"filename":1039,"language":360,"meta":319,"style":319},"import 'package:authyra_flutter/authyra_flutter.dart';\n\nfinal googleProxyProvider = ProxyOAuthProvider(\n  config: ProxyOAuthConfig(\n    providerName:       'google',\n    initiationEndpoint: 'https://api.example.com/auth/google/initiate',\n    callbackEndpoint:   'https://api.example.com/auth/google/callback',\n    backendRedirectUri: 'https://api.example.com/auth/google/oauth-callback',\n    appCallbackScheme:  'myapp://auth/callback',\n    userExtractor: (json) => AuthUser(\n      id:    json['id']    as String,\n      email: json['email'] as String?,\n      name:  json['name']  as String?,\n    ),\n    // Pass any auth header your backend requires:\n    headers: {'X-App-Version': '1.0.0'},\n  ),\n);\n","lib/auth/auth_providers.dart",[274,1041,1042,1053,1059,1075,1086,1098,1110,1122,1134,1146,1163,1186,1210,1233,1241,1248,1272,1280],{"__ignoreMap":319},[364,1043,1044,1047,1050],{"class":366,"line":367},[364,1045,1046],{"class":626},"import",[364,1048,1049],{"class":861}," 'package:authyra_flutter/authyra_flutter.dart'",[364,1051,1052],{"class":390},";\n",[364,1054,1055],{"class":366,"line":377},[364,1056,1058],{"emptyLinePlaceholder":1057},true,"\n",[364,1060,1061,1064,1067,1069,1072],{"class":366,"line":394},[364,1062,1063],{"class":380},"final",[364,1065,1066],{"class":373}," googleProxyProvider ",[364,1068,611],{"class":390},[364,1070,1071],{"class":370}," ProxyOAuthProvider",[364,1073,1074],{"class":373},"(\n",[364,1076,1077,1080,1082,1084],{"class":366,"line":408},[364,1078,1079],{"class":373},"  config",[364,1081,623],{"class":390},[364,1083,384],{"class":370},[364,1085,1074],{"class":373},[364,1087,1088,1091,1093,1096],{"class":366,"line":507},[364,1089,1090],{"class":373},"    providerName",[364,1092,623],{"class":390},[364,1094,1095],{"class":861},"       'google'",[364,1097,391],{"class":390},[364,1099,1100,1103,1105,1108],{"class":366,"line":519},[364,1101,1102],{"class":373},"    initiationEndpoint",[364,1104,623],{"class":390},[364,1106,1107],{"class":861}," 'https://api.example.com/auth/google/initiate'",[364,1109,391],{"class":390},[364,1111,1112,1115,1117,1120],{"class":366,"line":531},[364,1113,1114],{"class":373},"    callbackEndpoint",[364,1116,623],{"class":390},[364,1118,1119],{"class":861},"   'https://api.example.com/auth/google/callback'",[364,1121,391],{"class":390},[364,1123,1124,1127,1129,1132],{"class":366,"line":565},[364,1125,1126],{"class":373},"    backendRedirectUri",[364,1128,623],{"class":390},[364,1130,1131],{"class":861}," 'https://api.example.com/auth/google/oauth-callback'",[364,1133,391],{"class":390},[364,1135,1136,1139,1141,1144],{"class":366,"line":578},[364,1137,1138],{"class":373},"    appCallbackScheme",[364,1140,623],{"class":390},[364,1142,1143],{"class":861},"  'myapp://auth/callback'",[364,1145,391],{"class":390},[364,1147,1148,1151,1153,1156,1159,1161],{"class":366,"line":602},[364,1149,1150],{"class":373},"    userExtractor",[364,1152,623],{"class":390},[364,1154,1155],{"class":373}," (json) ",[364,1157,1158],{"class":390},"=>",[364,1160,536],{"class":370},[364,1162,1074],{"class":373},[364,1164,1165,1168,1170,1173,1176,1179,1182,1184],{"class":366,"line":635},[364,1166,1167],{"class":373},"      id",[364,1169,623],{"class":390},[364,1171,1172],{"class":373},"    json[",[364,1174,1175],{"class":861},"'id'",[364,1177,1178],{"class":373},"]    ",[364,1180,1181],{"class":390},"as",[364,1183,477],{"class":370},[364,1185,391],{"class":390},[364,1187,1189,1192,1194,1197,1200,1203,1205,1207],{"class":366,"line":1188},12,[364,1190,1191],{"class":373},"      email",[364,1193,623],{"class":390},[364,1195,1196],{"class":373}," json[",[364,1198,1199],{"class":861},"'email'",[364,1201,1202],{"class":373},"] ",[364,1204,1181],{"class":390},[364,1206,477],{"class":370},[364,1208,1209],{"class":390},"?,\n",[364,1211,1213,1216,1218,1221,1224,1227,1229,1231],{"class":366,"line":1212},13,[364,1214,1215],{"class":373},"      name",[364,1217,623],{"class":390},[364,1219,1220],{"class":373},"  json[",[364,1222,1223],{"class":861},"'name'",[364,1225,1226],{"class":373},"]  ",[364,1228,1181],{"class":390},[364,1230,477],{"class":370},[364,1232,1209],{"class":390},[364,1234,1236,1239],{"class":366,"line":1235},14,[364,1237,1238],{"class":373},"    )",[364,1240,391],{"class":390},[364,1242,1244],{"class":366,"line":1243},15,[364,1245,1247],{"class":1246},"sHwdD","    // Pass any auth header your backend requires:\n",[364,1249,1251,1254,1256,1259,1262,1264,1267,1270],{"class":366,"line":1250},16,[364,1252,1253],{"class":373},"    headers",[364,1255,623],{"class":390},[364,1257,1258],{"class":373}," {",[364,1260,1261],{"class":861},"'X-App-Version'",[364,1263,623],{"class":390},[364,1265,1266],{"class":861}," '1.0.0'",[364,1268,1269],{"class":373},"}",[364,1271,391],{"class":390},[364,1273,1275,1278],{"class":366,"line":1274},17,[364,1276,1277],{"class":373},"  )",[364,1279,391],{"class":390},[364,1281,1283,1285],{"class":366,"line":1282},18,[364,1284,630],{"class":373},[364,1286,1052],{"class":390},[813,1288,1290],{"id":1289},"_2-wire-deep-links-and-initialize","2. Wire deep links and initialize",[313,1292,1295],{"className":358,"code":1293,"filename":1294,"language":360,"meta":319,"style":319},"import 'package:app_links/app_links.dart';\nimport 'package:authyra_flutter/authyra_flutter.dart';\n\nFuture\u003Cvoid> main() async {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  // Register before Authyra.initialize\n  OAuth2CallbackHandler.registerProvider('myapp', googleProxyProvider);\n  AppLinks().uriLinkStream.listen(OAuth2CallbackHandler.handleCallback);\n\n  await Authyra.initialize(\n    client: AuthyraClient(\n      providers: [googleProxyProvider],\n      storage: SecureAuthStorage(),\n    ),\n  );\n\n  runApp(const MyApp());\n}\n","lib/main.dart",[274,1296,1297,1306,1314,1318,1345,1361,1365,1370,1393,1422,1426,1441,1453,1465,1479,1485,1491,1495,1513],{"__ignoreMap":319},[364,1298,1299,1301,1304],{"class":366,"line":367},[364,1300,1046],{"class":626},[364,1302,1303],{"class":861}," 'package:app_links/app_links.dart'",[364,1305,1052],{"class":390},[364,1307,1308,1310,1312],{"class":366,"line":377},[364,1309,1046],{"class":626},[364,1311,1049],{"class":861},[364,1313,1052],{"class":390},[364,1315,1316],{"class":366,"line":394},[364,1317,1058],{"emptyLinePlaceholder":1057},[364,1319,1320,1323,1325,1328,1331,1335,1338,1342],{"class":366,"line":408},[364,1321,1322],{"class":370},"Future",[364,1324,548],{"class":373},[364,1326,1327],{"class":380},"void",[364,1329,1330],{"class":373},"> ",[364,1332,1334],{"class":1333},"s2Zo4","main",[364,1336,1337],{"class":373},"() ",[364,1339,1341],{"class":1340},"s7zQu","async",[364,1343,1344],{"class":373}," {\n",[364,1346,1347,1350,1353,1356,1359],{"class":366,"line":507},[364,1348,1349],{"class":370},"  WidgetsFlutterBinding",[364,1351,1352],{"class":390},".",[364,1354,1355],{"class":1333},"ensureInitialized",[364,1357,1358],{"class":373},"()",[364,1360,1052],{"class":390},[364,1362,1363],{"class":366,"line":519},[364,1364,1058],{"emptyLinePlaceholder":1057},[364,1366,1367],{"class":366,"line":531},[364,1368,1369],{"class":1246},"  // Register before Authyra.initialize\n",[364,1371,1372,1375,1377,1380,1382,1385,1388,1391],{"class":366,"line":565},[364,1373,1374],{"class":370},"  OAuth2CallbackHandler",[364,1376,1352],{"class":390},[364,1378,1379],{"class":1333},"registerProvider",[364,1381,542],{"class":373},[364,1383,1384],{"class":861},"'myapp'",[364,1386,1387],{"class":390},",",[364,1389,1390],{"class":373}," googleProxyProvider)",[364,1392,1052],{"class":390},[364,1394,1395,1398,1400,1402,1405,1407,1410,1412,1415,1417,1420],{"class":366,"line":578},[364,1396,1397],{"class":370},"  AppLinks",[364,1399,1358],{"class":373},[364,1401,1352],{"class":390},[364,1403,1404],{"class":373},"uriLinkStream",[364,1406,1352],{"class":390},[364,1408,1409],{"class":1333},"listen",[364,1411,542],{"class":373},[364,1413,1414],{"class":370},"OAuth2CallbackHandler",[364,1416,1352],{"class":390},[364,1418,1419],{"class":373},"handleCallback)",[364,1421,1052],{"class":390},[364,1423,1424],{"class":366,"line":602},[364,1425,1058],{"emptyLinePlaceholder":1057},[364,1427,1428,1431,1434,1436,1439],{"class":366,"line":635},[364,1429,1430],{"class":1340},"  await",[364,1432,1433],{"class":370}," Authyra",[364,1435,1352],{"class":390},[364,1437,1438],{"class":1333},"initialize",[364,1440,1074],{"class":373},[364,1442,1443,1446,1448,1451],{"class":366,"line":1188},[364,1444,1445],{"class":373},"    client",[364,1447,623],{"class":390},[364,1449,1450],{"class":370}," AuthyraClient",[364,1452,1074],{"class":373},[364,1454,1455,1458,1460,1463],{"class":366,"line":1212},[364,1456,1457],{"class":373},"      providers",[364,1459,623],{"class":390},[364,1461,1462],{"class":373}," [googleProxyProvider]",[364,1464,391],{"class":390},[364,1466,1467,1470,1472,1475,1477],{"class":366,"line":1235},[364,1468,1469],{"class":373},"      storage",[364,1471,623],{"class":390},[364,1473,1474],{"class":370}," SecureAuthStorage",[364,1476,1358],{"class":373},[364,1478,391],{"class":390},[364,1480,1481,1483],{"class":366,"line":1243},[364,1482,1238],{"class":373},[364,1484,391],{"class":390},[364,1486,1487,1489],{"class":366,"line":1250},[364,1488,1277],{"class":373},[364,1490,1052],{"class":390},[364,1492,1493],{"class":366,"line":1274},[364,1494,1058],{"emptyLinePlaceholder":1057},[364,1496,1497,1500,1502,1505,1508,1511],{"class":366,"line":1282},[364,1498,1499],{"class":1333},"  runApp",[364,1501,542],{"class":373},[364,1503,1504],{"class":380},"const",[364,1506,1507],{"class":370}," MyApp",[364,1509,1510],{"class":373},"())",[364,1512,1052],{"class":390},[364,1514,1516],{"class":366,"line":1515},19,[364,1517,870],{"class":373},[813,1519,1521],{"id":1520},"_3-platform-deep-link-config","3. Platform deep-link config",[271,1523,1524,1527,1528,623],{},[281,1525,1526],{},"Android"," — ",[274,1529,1530],{},"android/app/src/main/AndroidManifest.xml",[313,1532,1536],{"className":1533,"code":1534,"language":1535,"meta":319,"style":319},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cintent-filter>\n  \u003Caction android:name=\"android.intent.action.VIEW\" />\n  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n  \u003Cdata android:scheme=\"myapp\" android:host=\"auth\" android:pathPrefix=\"/callback\" />\n\u003C/intent-filter>\n","xml",[274,1537,1538,1543,1548,1553,1558,1563],{"__ignoreMap":319},[364,1539,1540],{"class":366,"line":367},[364,1541,1542],{},"\u003Cintent-filter>\n",[364,1544,1545],{"class":366,"line":377},[364,1546,1547],{},"  \u003Caction android:name=\"android.intent.action.VIEW\" />\n",[364,1549,1550],{"class":366,"line":394},[364,1551,1552],{},"  \u003Ccategory android:name=\"android.intent.category.DEFAULT\" />\n",[364,1554,1555],{"class":366,"line":408},[364,1556,1557],{},"  \u003Ccategory android:name=\"android.intent.category.BROWSABLE\" />\n",[364,1559,1560],{"class":366,"line":507},[364,1561,1562],{},"  \u003Cdata android:scheme=\"myapp\" android:host=\"auth\" android:pathPrefix=\"/callback\" />\n",[364,1564,1565],{"class":366,"line":519},[364,1566,1567],{},"\u003C/intent-filter>\n",[271,1569,1570,1527,1573,623],{},[281,1571,1572],{},"iOS",[274,1574,1575],{},"ios/Runner/Info.plist",[313,1577,1579],{"className":1533,"code":1578,"language":1535,"meta":319,"style":319},"\u003Ckey>CFBundleURLTypes\u003C/key>\n\u003Carray>\n  \u003Cdict>\n    \u003Ckey>CFBundleURLSchemes\u003C/key>\n    \u003Carray>\n      \u003Cstring>myapp\u003C/string>\n    \u003C/array>\n  \u003C/dict>\n\u003C/array>\n",[274,1580,1581,1586,1591,1596,1601,1606,1611,1616,1621],{"__ignoreMap":319},[364,1582,1583],{"class":366,"line":367},[364,1584,1585],{},"\u003Ckey>CFBundleURLTypes\u003C/key>\n",[364,1587,1588],{"class":366,"line":377},[364,1589,1590],{},"\u003Carray>\n",[364,1592,1593],{"class":366,"line":394},[364,1594,1595],{},"  \u003Cdict>\n",[364,1597,1598],{"class":366,"line":408},[364,1599,1600],{},"    \u003Ckey>CFBundleURLSchemes\u003C/key>\n",[364,1602,1603],{"class":366,"line":507},[364,1604,1605],{},"    \u003Carray>\n",[364,1607,1608],{"class":366,"line":519},[364,1609,1610],{},"      \u003Cstring>myapp\u003C/string>\n",[364,1612,1613],{"class":366,"line":531},[364,1614,1615],{},"    \u003C/array>\n",[364,1617,1618],{"class":366,"line":565},[364,1619,1620],{},"  \u003C/dict>\n",[364,1622,1623],{"class":366,"line":578},[364,1624,1625],{},"\u003C/array>\n",[305,1627],{},[308,1629,1631],{"id":1630},"sign-in","Sign in",[313,1633,1635],{"className":358,"code":1634,"language":360,"meta":319,"style":319},"try {\n  final user = await Authyra.instance.signIn('google');\n  print('Hello, ${user.name}!');\n} on AuthenticationCancelledException {\n  // User closed the browser\n} on AuthenticationFailedException catch (e) {\n  print('Sign-in failed: $e');\n}\n",[274,1636,1637,1644,1677,1707,1720,1725,1740,1762],{"__ignoreMap":319},[364,1638,1639,1642],{"class":366,"line":367},[364,1640,1641],{"class":1340},"try",[364,1643,1344],{"class":373},[364,1645,1646,1649,1652,1654,1657,1659,1661,1664,1666,1669,1671,1673,1675],{"class":366,"line":377},[364,1647,1648],{"class":380},"  final",[364,1650,1651],{"class":373}," user ",[364,1653,611],{"class":390},[364,1655,1656],{"class":1340}," await",[364,1658,1433],{"class":370},[364,1660,1352],{"class":390},[364,1662,1663],{"class":373},"instance",[364,1665,1352],{"class":390},[364,1667,1668],{"class":1333},"signIn",[364,1670,542],{"class":373},[364,1672,673],{"class":861},[364,1674,630],{"class":373},[364,1676,1052],{"class":390},[364,1678,1679,1682,1684,1687,1690,1694,1696,1698,1700,1703,1705],{"class":366,"line":394},[364,1680,1681],{"class":1333},"  print",[364,1683,542],{"class":373},[364,1685,1686],{"class":861},"'Hello, ",[364,1688,1689],{"class":373},"${",[364,1691,1693],{"class":1692},"sHdIc","user",[364,1695,1352],{"class":373},[364,1697,948],{"class":1692},[364,1699,1269],{"class":373},[364,1701,1702],{"class":861},"!'",[364,1704,630],{"class":373},[364,1706,1052],{"class":390},[364,1708,1709,1712,1715,1718],{"class":366,"line":408},[364,1710,1711],{"class":373},"} ",[364,1713,1714],{"class":1340},"on",[364,1716,1717],{"class":370}," AuthenticationCancelledException",[364,1719,1344],{"class":373},[364,1721,1722],{"class":366,"line":507},[364,1723,1724],{"class":1246},"  // User closed the browser\n",[364,1726,1727,1729,1731,1734,1737],{"class":366,"line":519},[364,1728,1711],{"class":373},[364,1730,1714],{"class":1340},[364,1732,1733],{"class":370}," AuthenticationFailedException",[364,1735,1736],{"class":1340}," catch",[364,1738,1739],{"class":373}," (e) {\n",[364,1741,1742,1744,1746,1749,1752,1755,1758,1760],{"class":366,"line":531},[364,1743,1681],{"class":1333},[364,1745,542],{"class":373},[364,1747,1748],{"class":861},"'Sign-in failed: ",[364,1750,1751],{"class":373},"$",[364,1753,1754],{"class":1692},"e",[364,1756,1757],{"class":861},"'",[364,1759,630],{"class":373},[364,1761,1052],{"class":390},[364,1763,1764],{"class":366,"line":565},[364,1765,870],{"class":373},[305,1767],{},[308,1769,1771],{"id":1770},"full-session-with-tokens","Full session with tokens",[271,1773,1774,1775,554,1777,1779,1780,1782,1783,1785,1786,623],{},"If your backend returns ",[274,1776,969],{},[274,1778,989],{},", and ",[274,1781,1009],{}," in the callback response, capture them in ",[274,1784,740],{}," via ",[274,1787,1788],{},"AuthSignInResult",[313,1790,1792],{"className":358,"code":1791,"language":360,"meta":319,"style":319},"// Note: userExtractor returns AuthUser, but if you need tokens, implement\n// the full AuthProvider interface directly and return AuthSignInResult\n// from signIn(). ProxyOAuthProvider handles AuthSignInResult internally\n// when the callbackEndpoint response includes token fields.\n",[274,1793,1794,1799,1804,1809],{"__ignoreMap":319},[364,1795,1796],{"class":366,"line":367},[364,1797,1798],{"class":1246},"// Note: userExtractor returns AuthUser, but if you need tokens, implement\n",[364,1800,1801],{"class":366,"line":377},[364,1802,1803],{"class":1246},"// the full AuthProvider interface directly and return AuthSignInResult\n",[364,1805,1806],{"class":366,"line":394},[364,1807,1808],{"class":1246},"// from signIn(). ProxyOAuthProvider handles AuthSignInResult internally\n",[364,1810,1811],{"class":366,"line":408},[364,1812,1813],{"class":1246},"// when the callbackEndpoint response includes token fields.\n",[271,1815,1816,1817,554,1819,1779,1821,1823,1824,1826],{},"The provider automatically reads ",[274,1818,969],{},[274,1820,989],{},[274,1822,1009],{}," fields from the callback response JSON and stores them in the ",[274,1825,222],{},". No extra configuration is needed if your backend returns these standard field names.",[305,1828],{},[308,1830,1832],{"id":1831},"using-with-multiple-providers","Using with multiple providers",[271,1834,1835],{},"Register each proxy provider under its own callback scheme:",[313,1837,1839],{"className":358,"code":1838,"language":360,"meta":319,"style":319},"final googleProxy = ProxyOAuthProvider(\n  config: ProxyOAuthConfig(\n    providerName:      'google',\n    appCallbackScheme: 'myapp://auth/google/callback',\n    // ...\n  ),\n);\n\nfinal githubProxy = ProxyOAuthProvider(\n  config: ProxyOAuthConfig(\n    providerName:      'github',\n    appCallbackScheme: 'myapp://auth/github/callback',\n    // ...\n  ),\n);\n\nOAuth2CallbackHandler.registerProvider('myapp', googleProxy);\nOAuth2CallbackHandler.registerProvider('myapp', githubProxy);\n",[274,1840,1841,1854,1864,1875,1886,1891,1897,1903,1907,1920,1930,1941,1952,1956,1962,1968,1972,1991],{"__ignoreMap":319},[364,1842,1843,1845,1848,1850,1852],{"class":366,"line":367},[364,1844,1063],{"class":380},[364,1846,1847],{"class":373}," googleProxy ",[364,1849,611],{"class":390},[364,1851,1071],{"class":370},[364,1853,1074],{"class":373},[364,1855,1856,1858,1860,1862],{"class":366,"line":377},[364,1857,1079],{"class":373},[364,1859,623],{"class":390},[364,1861,384],{"class":370},[364,1863,1074],{"class":373},[364,1865,1866,1868,1870,1873],{"class":366,"line":394},[364,1867,1090],{"class":373},[364,1869,623],{"class":390},[364,1871,1872],{"class":861},"      'google'",[364,1874,391],{"class":390},[364,1876,1877,1879,1881,1884],{"class":366,"line":408},[364,1878,1138],{"class":373},[364,1880,623],{"class":390},[364,1882,1883],{"class":861}," 'myapp://auth/google/callback'",[364,1885,391],{"class":390},[364,1887,1888],{"class":366,"line":507},[364,1889,1890],{"class":1246},"    // ...\n",[364,1892,1893,1895],{"class":366,"line":519},[364,1894,1277],{"class":373},[364,1896,391],{"class":390},[364,1898,1899,1901],{"class":366,"line":531},[364,1900,630],{"class":373},[364,1902,1052],{"class":390},[364,1904,1905],{"class":366,"line":565},[364,1906,1058],{"emptyLinePlaceholder":1057},[364,1908,1909,1911,1914,1916,1918],{"class":366,"line":578},[364,1910,1063],{"class":380},[364,1912,1913],{"class":373}," githubProxy ",[364,1915,611],{"class":390},[364,1917,1071],{"class":370},[364,1919,1074],{"class":373},[364,1921,1922,1924,1926,1928],{"class":366,"line":602},[364,1923,1079],{"class":373},[364,1925,623],{"class":390},[364,1927,384],{"class":370},[364,1929,1074],{"class":373},[364,1931,1932,1934,1936,1939],{"class":366,"line":635},[364,1933,1090],{"class":373},[364,1935,623],{"class":390},[364,1937,1938],{"class":861},"      'github'",[364,1940,391],{"class":390},[364,1942,1943,1945,1947,1950],{"class":366,"line":1188},[364,1944,1138],{"class":373},[364,1946,623],{"class":390},[364,1948,1949],{"class":861}," 'myapp://auth/github/callback'",[364,1951,391],{"class":390},[364,1953,1954],{"class":366,"line":1212},[364,1955,1890],{"class":1246},[364,1957,1958,1960],{"class":366,"line":1235},[364,1959,1277],{"class":373},[364,1961,391],{"class":390},[364,1963,1964,1966],{"class":366,"line":1243},[364,1965,630],{"class":373},[364,1967,1052],{"class":390},[364,1969,1970],{"class":366,"line":1250},[364,1971,1058],{"emptyLinePlaceholder":1057},[364,1973,1974,1976,1978,1980,1982,1984,1986,1989],{"class":366,"line":1274},[364,1975,1414],{"class":370},[364,1977,1352],{"class":390},[364,1979,1379],{"class":1333},[364,1981,542],{"class":373},[364,1983,1384],{"class":861},[364,1985,1387],{"class":390},[364,1987,1988],{"class":373}," googleProxy)",[364,1990,1052],{"class":390},[364,1992,1993,1995,1997,1999,2001,2003,2005,2008],{"class":366,"line":1282},[364,1994,1414],{"class":370},[364,1996,1352],{"class":390},[364,1998,1379],{"class":1333},[364,2000,542],{"class":373},[364,2002,1384],{"class":861},[364,2004,1387],{"class":390},[364,2006,2007],{"class":373}," githubProxy)",[364,2009,1052],{"class":390},[271,2011,2012,2014,2015,2018],{},[274,2013,1414],{}," routes by scheme + path, so both share the ",[274,2016,2017],{},"myapp"," scheme with different paths.",[305,2020],{},[308,2022,254],{"id":2023},"troubleshooting",[271,2025,2026],{},[281,2027,2028],{},"App never receives the deep link",[323,2030,2031,2037,2047],{},[295,2032,2033,2034,2036],{},"Confirm ",[274,2035,725],{}," exactly matches what your backend redirects to after the OAuth exchange.",[295,2038,2039,2040,2043,2044,1352],{},"Confirm the scheme is registered in ",[274,2041,2042],{},"AndroidManifest.xml"," / ",[274,2045,2046],{},"Info.plist",[295,2048,2033,2049,2052,2053,1352],{},[274,2050,2051],{},"OAuth2CallbackHandler.registerProvider"," is called before ",[274,2054,2055],{},"Authyra.initialize",[271,2057,2058],{},[281,2059,2060,2062],{},[274,2061,698],{}," returns 401 / 403",[271,2064,2065],{},"The custom token your backend encoded in the deep link has expired or been consumed. The token should be short-lived (30–60 seconds) and single-use — add a check on the backend.",[271,2067,2068],{},[281,2069,2070,2073],{},[274,2071,2072],{},"AuthenticationFailedException"," after deep link arrives",[271,2075,2076,2077,2079,2080,1352],{},"The ",[274,2078,698],{}," returned an unexpected response. Log the raw JSON to confirm it matches the structure expected by ",[274,2081,740],{},[305,2083],{},[308,2085,2087],{"id":2086},"see-also","See also",[292,2089,2090,2097,2103],{},[295,2091,2092,2096],{},[2093,2094,2095],"a",{"href":99},"OAuth2Provider →"," — direct PKCE flow (no backend required)",[295,2098,2099,2102],{},[2093,2100,2101],{"href":107},"GitHubOAuth2Provider →"," — direct flow with client secret",[295,2104,2105,2108],{},[2093,2106,2107],{"href":171},"Flutter Setup →"," — deep-link wiring",[2110,2111,2112],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .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":319,"searchDepth":377,"depth":377,"links":2114},[2115,2116,2117,2118,2122,2127,2128,2129,2130,2131],{"id":310,"depth":377,"text":311},{"id":354,"depth":377,"text":355},{"id":459,"depth":377,"text":443},{"id":810,"depth":377,"text":811,"children":2119},[2120,2121],{"id":815,"depth":394,"text":816},{"id":873,"depth":394,"text":874},{"id":1030,"depth":377,"text":1031,"children":2123},[2124,2125,2126],{"id":1034,"depth":394,"text":1035},{"id":1289,"depth":394,"text":1290},{"id":1520,"depth":394,"text":1521},{"id":1630,"depth":377,"text":1631},{"id":1770,"depth":377,"text":1771},{"id":1831,"depth":377,"text":1832},{"id":2023,"depth":377,"text":254},{"id":2086,"depth":377,"text":2087},"Backend-delegated OAuth — the client secret never leaves your server.","md",null,{},{"title":2137,"description":2138},"Proxy OAuth Provider | Authyra","Use ProxyOAuthProvider to delegate OAuth code exchange to your backend. The client secret stays server-side; the app only opens a browser and handles the deep link.","Wt9_gH0VIp6g7azww09qKo8ONIjftWbNKvSJFYlxlss",[2141,2143],{"title":110,"path":111,"stem":112,"description":2142,"children":-1},"Sign in with Apple — OAuth 2.0 with PKCE, dynamic ES256 client secret, and id_token user extraction.",{"title":123,"path":124,"stem":125,"description":2144,"children":-1},"End-to-end guide for email and password authentication with a JWT backend.",1782700510652]