react-native-nitro-auth 0.5.12 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +88 -13
  3. package/android/build.gradle +4 -4
  4. package/android/gradle.properties +2 -2
  5. package/android/src/main/cpp/PlatformAuth+Android.cpp +87 -4
  6. package/android/src/main/java/com/auth/AuthAdapter.kt +85 -48
  7. package/android/src/main/java/com/auth/GoogleSignInActivity.kt +12 -2
  8. package/cpp/HybridAuth.cpp +168 -18
  9. package/cpp/HybridAuth.hpp +7 -0
  10. package/cpp/PlatformAuth.hpp +1 -0
  11. package/ios/AuthAdapter.swift +98 -24
  12. package/ios/PlatformAuth+iOS.mm +37 -1
  13. package/lib/commonjs/Auth.web.js +74 -21
  14. package/lib/commonjs/Auth.web.js.map +1 -1
  15. package/lib/commonjs/create-auth-service.js +10 -0
  16. package/lib/commonjs/create-auth-service.js.map +1 -1
  17. package/lib/commonjs/index.js +12 -0
  18. package/lib/commonjs/index.js.map +1 -1
  19. package/lib/commonjs/index.web.js +12 -0
  20. package/lib/commonjs/index.web.js.map +1 -1
  21. package/lib/commonjs/provider-options.js +6 -0
  22. package/lib/commonjs/provider-options.js.map +1 -0
  23. package/lib/commonjs/service.js.map +1 -1
  24. package/lib/commonjs/service.web.js.map +1 -1
  25. package/lib/commonjs/use-auth.js +21 -1
  26. package/lib/commonjs/use-auth.js.map +1 -1
  27. package/lib/module/Auth.web.js +74 -21
  28. package/lib/module/Auth.web.js.map +1 -1
  29. package/lib/module/create-auth-service.js +10 -0
  30. package/lib/module/create-auth-service.js.map +1 -1
  31. package/lib/module/global.d.js.map +1 -1
  32. package/lib/module/index.js +1 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/index.web.js +1 -0
  35. package/lib/module/index.web.js.map +1 -1
  36. package/lib/module/provider-options.js +4 -0
  37. package/lib/module/provider-options.js.map +1 -0
  38. package/lib/module/service.js.map +1 -1
  39. package/lib/module/service.web.js.map +1 -1
  40. package/lib/module/use-auth.js +21 -1
  41. package/lib/module/use-auth.js.map +1 -1
  42. package/lib/typescript/commonjs/Auth.nitro.d.ts +11 -0
  43. package/lib/typescript/commonjs/Auth.nitro.d.ts.map +1 -1
  44. package/lib/typescript/commonjs/Auth.web.d.ts +4 -0
  45. package/lib/typescript/commonjs/Auth.web.d.ts.map +1 -1
  46. package/lib/typescript/commonjs/create-auth-service.d.ts +2 -1
  47. package/lib/typescript/commonjs/create-auth-service.d.ts.map +1 -1
  48. package/lib/typescript/commonjs/index.d.ts +1 -0
  49. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  50. package/lib/typescript/commonjs/index.web.d.ts +1 -0
  51. package/lib/typescript/commonjs/index.web.d.ts.map +1 -1
  52. package/lib/typescript/commonjs/provider-options.d.ts +23 -0
  53. package/lib/typescript/commonjs/provider-options.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/service.d.ts +2 -2
  55. package/lib/typescript/commonjs/service.d.ts.map +1 -1
  56. package/lib/typescript/commonjs/service.web.d.ts +2 -2
  57. package/lib/typescript/commonjs/service.web.d.ts.map +1 -1
  58. package/lib/typescript/commonjs/use-auth.d.ts +4 -2
  59. package/lib/typescript/commonjs/use-auth.d.ts.map +1 -1
  60. package/lib/typescript/module/Auth.nitro.d.ts +11 -0
  61. package/lib/typescript/module/Auth.nitro.d.ts.map +1 -1
  62. package/lib/typescript/module/Auth.web.d.ts +4 -0
  63. package/lib/typescript/module/Auth.web.d.ts.map +1 -1
  64. package/lib/typescript/module/create-auth-service.d.ts +2 -1
  65. package/lib/typescript/module/create-auth-service.d.ts.map +1 -1
  66. package/lib/typescript/module/index.d.ts +1 -0
  67. package/lib/typescript/module/index.d.ts.map +1 -1
  68. package/lib/typescript/module/index.web.d.ts +1 -0
  69. package/lib/typescript/module/index.web.d.ts.map +1 -1
  70. package/lib/typescript/module/provider-options.d.ts +23 -0
  71. package/lib/typescript/module/provider-options.d.ts.map +1 -0
  72. package/lib/typescript/module/service.d.ts +2 -2
  73. package/lib/typescript/module/service.d.ts.map +1 -1
  74. package/lib/typescript/module/service.web.d.ts +2 -2
  75. package/lib/typescript/module/service.web.d.ts.map +1 -1
  76. package/lib/typescript/module/use-auth.d.ts +4 -2
  77. package/lib/typescript/module/use-auth.d.ts.map +1 -1
  78. package/nitrogen/generated/shared/c++/AuthUser.hpp +17 -1
  79. package/nitrogen/generated/shared/c++/HybridAuthSpec.cpp +1 -0
  80. package/nitrogen/generated/shared/c++/HybridAuthSpec.hpp +1 -0
  81. package/nitrogen/generated/shared/c++/LoginOptions.hpp +25 -1
  82. package/package.json +2 -2
  83. package/src/Auth.nitro.ts +11 -0
  84. package/src/Auth.web.ts +99 -16
  85. package/src/create-auth-service.ts +19 -9
  86. package/src/global.d.ts +2 -1
  87. package/src/index.ts +1 -0
  88. package/src/index.web.ts +1 -0
  89. package/src/provider-options.ts +62 -0
  90. package/src/service.ts +2 -1
  91. package/src/service.web.ts +2 -2
  92. package/src/use-auth.ts +22 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.6.0 - 2026-05-14
4
+
5
+ ### Added
6
+
7
+ - Added provider option support for Google nonce, hosted domain, OpenID realm, authorized-account filtering, verified phone number requests, refresh-code forcing, and Android legacy Google sign-in.
8
+ - Added Apple nonce and authorization-code/user-id result support.
9
+ - Added Microsoft tenant and prompt option coverage across native and web flows.
10
+ - Added `revokeAccess()` to the native/web auth API and `useAuth()` hook.
11
+ - Added native logging hooks and platform-gated example controls for supported provider options only.
12
+ - Added provider-specific TypeScript option types for `AuthService.login()` and `useAuth().login()`.
13
+
14
+ ### Changed
15
+
16
+ - Updated Nitro Modules and native SDK dependencies, including Android Credential Manager, Activity, Browser, and API 36 targets.
17
+ - Hardened native and web promise handling so stale sign-in, scope, restore, revoke, and token operations settle consistently.
18
+ - Updated Android Google sign-out to avoid noisy Credential Manager cleanup during normal logout while preserving deep cleanup through revoke access.
19
+
20
+ ### Fixed
21
+
22
+ - Fixed Android Metro watcher noise from transient Bun `node_modules/.old-*` directories in the example app.
23
+ - Fixed Android Google cancellation handling so cancellations are not reported as unknown failures.
24
+ - Fixed native session cleanup paths to reject pending work before clearing provider state.
25
+
3
26
  ## 0.5.12 - 2026-05-13
4
27
 
5
28
  ### Changed
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # react-native-nitro-auth
2
2
 
3
- ![npm](https://img.shields.io/badge/npm-v0.5.12-f97316?style=flat-square)
3
+ ![npm](https://img.shields.io/badge/npm-v0.6.0-f97316?style=flat-square)
4
4
  ![license](https://img.shields.io/badge/license-MIT-007ec6?style=flat-square)
5
5
  ![react-native](https://img.shields.io/badge/react--native-%3E%3D0.75-61dafb?style=flat-square)
6
6
  ![nitro-modules](https://img.shields.io/badge/nitro--modules-%3E%3D0.35.0-black?style=flat-square)
@@ -232,29 +232,45 @@ tokensUnsubscribe();
232
232
  await login("google", {
233
233
  scopes: ["email", "profile"],
234
234
  loginHint: "user@example.com",
235
+ nonce: "opaque-nonce",
235
236
  useOneTap: true,
236
- useSheet: true,
237
237
  forceAccountPicker: true,
238
+ filterByAuthorizedAccounts: true,
238
239
  useLegacyGoogleSignIn: true,
240
+ forceCodeForRefreshToken: true,
241
+ hostedDomain: "company.com",
242
+ requestVerifiedPhoneNumber: true,
243
+ });
244
+
245
+ await login("apple", {
246
+ scopes: ["email", "name"],
247
+ nonce: "opaque-nonce",
239
248
  });
240
249
 
241
250
  await login("microsoft", {
242
251
  scopes: ["openid", "profile", "email", "offline_access", "User.Read"],
252
+ loginHint: "user@example.com",
243
253
  tenant: "organizations",
244
254
  prompt: "select_account",
245
255
  });
246
256
  ```
247
257
 
248
- | Option | Applies to | Notes |
249
- | ----------------------- | ----------------- | ---------------------------------------------------- |
250
- | `scopes` | Google, Microsoft | Requested OAuth scopes |
251
- | `loginHint` | Google, Microsoft | Prefills account selection when supported |
252
- | `useOneTap` | Android Google | Enables Credential Manager auto-select |
253
- | `useSheet` | iOS Google | Uses native sign-in sheet behavior |
254
- | `forceAccountPicker` | Google | Forces account picker |
255
- | `useLegacyGoogleSignIn` | Android Google | Uses legacy Google Sign-In path for server auth code |
256
- | `tenant` | Microsoft | Overrides configured tenant |
257
- | `prompt` | Microsoft | `login`, `consent`, `select_account`, or `none` |
258
+ | Option | Provider | Platform | Notes |
259
+ | ---------------------------- | ------------ | ---------------- | ----------------------------------------------------------- |
260
+ | `scopes` | All | iOS, Android, web | Requested OAuth scopes. Apple is unavailable on Android. |
261
+ | `loginHint` | Google, Microsoft | iOS, Android, web | Prefills account selection when supported by the provider. |
262
+ | `nonce` | Google, Apple | iOS, Android, web | Passed to provider ID-token flows when the SDK supports it. |
263
+ | `useOneTap` | Google | Android | Enables Credential Manager auto-select. |
264
+ | `useSheet` | Google | iOS | Compatibility alias; prefer `forceAccountPicker`. |
265
+ | `forceAccountPicker` | Google | iOS, Android, web | Forces an account picker. Android uses the legacy chooser. |
266
+ | `filterByAuthorizedAccounts` | Google | Android | Limits Credential Manager to authorized accounts. |
267
+ | `useLegacyGoogleSignIn` | Google | Android | Uses legacy Google Sign-In for server auth code flows. |
268
+ | `forceCodeForRefreshToken` | Google | Android | Forces a new server auth code on the legacy Google path. |
269
+ | `hostedDomain` | Google | iOS, Android, web | Hints or filters Google Workspace hosted-domain accounts. |
270
+ | `openIDRealm` | Google | iOS, web | Adds OpenID realm support where the SDK exposes it. |
271
+ | `requestVerifiedPhoneNumber` | Google | Android | Requests verified phone number through Credential Manager. |
272
+ | `tenant` | Microsoft | iOS, Android, web | Overrides configured tenant. |
273
+ | `prompt` | Microsoft | iOS, Android, web | `login`, `consent`, `select_account`, or `none`. |
258
274
 
259
275
  ## Incremental Scopes
260
276
 
@@ -357,6 +373,18 @@ Main exports:
357
373
  - `AuthUser`
358
374
  - `AuthTokens`
359
375
  - `LoginOptions`
376
+ - `ProviderLoginOptions`
377
+ - `LoginOptionsByProvider`
378
+ - `GoogleLoginOptions`
379
+ - `GoogleIOSLoginOptions`
380
+ - `GoogleAndroidLoginOptions`
381
+ - `GoogleWebLoginOptions`
382
+ - `AppleLoginOptions`
383
+ - `AppleIOSLoginOptions`
384
+ - `AppleWebLoginOptions`
385
+ - `MicrosoftLoginOptions`
386
+ - `AuthLogin`
387
+ - `TypedAuth`
360
388
 
361
389
  ### useAuth()
362
390
 
@@ -371,12 +399,54 @@ type UseAuthReturn = {
371
399
  logout(): void;
372
400
  requestScopes(scopes: string[]): Promise<void>;
373
401
  revokeScopes(scopes: string[]): Promise<void>;
402
+ revokeAccess(): Promise<void>;
374
403
  getAccessToken(): Promise<string | undefined>;
375
404
  refreshToken(): Promise<AuthTokens>;
376
405
  silentRestore(): Promise<void>;
377
406
  };
378
407
  ```
379
408
 
409
+ ### Strong Login Types
410
+
411
+ `AuthService.login()` and `useAuth().login()` infer the allowed option object from the provider argument.
412
+
413
+ ```ts
414
+ await AuthService.login("apple", {
415
+ nonce: "opaque-nonce",
416
+ });
417
+
418
+ await AuthService.login("microsoft", {
419
+ tenant: "organizations",
420
+ prompt: "select_account",
421
+ });
422
+ ```
423
+
424
+ Provider/platform option helpers are exported for config builders and AI-generated integrations:
425
+
426
+ ```ts
427
+ import type {
428
+ GoogleAndroidLoginOptions,
429
+ GoogleIOSLoginOptions,
430
+ MicrosoftLoginOptions,
431
+ } from "react-native-nitro-auth";
432
+
433
+ const androidGoogleOptions = {
434
+ useOneTap: true,
435
+ filterByAuthorizedAccounts: true,
436
+ requestVerifiedPhoneNumber: true,
437
+ } satisfies GoogleAndroidLoginOptions;
438
+
439
+ const iosGoogleOptions = {
440
+ hostedDomain: "company.com",
441
+ openIDRealm: "https://example.com",
442
+ } satisfies GoogleIOSLoginOptions;
443
+
444
+ const microsoftOptions = {
445
+ tenant: "organizations",
446
+ prompt: "select_account",
447
+ } satisfies MicrosoftLoginOptions;
448
+ ```
449
+
380
450
  ### AuthUser
381
451
 
382
452
  ```ts
@@ -389,6 +459,10 @@ type AuthUser = {
389
459
  accessToken?: string;
390
460
  refreshToken?: string;
391
461
  serverAuthCode?: string;
462
+ authorizationCode?: string;
463
+ userId?: string;
464
+ phoneNumber?: string;
465
+ hostedDomain?: string;
392
466
  scopes?: string[];
393
467
  expirationTime?: number;
394
468
  underlyingError?: string;
@@ -411,7 +485,8 @@ The demo includes:
411
485
 
412
486
  - Provider cards for Google, Apple, and Microsoft.
413
487
  - Token and scope operations.
414
- - Silent restore and account picker actions.
488
+ - Silent restore, account picker, revoke access, and native logging actions.
489
+ - Platform-gated controls for each supported Google, Apple, and Microsoft option.
415
490
  - App-owned disk snapshot example with `react-native-nitro-storage`.
416
491
  - Runtime smoke tests for the public API.
417
492
 
@@ -96,13 +96,13 @@ dependencies {
96
96
  implementation "com.google.android.gms:play-services-auth:21.5.1"
97
97
 
98
98
  // Activity result APIs
99
- implementation "androidx.activity:activity-ktx:1.9.3"
99
+ implementation "androidx.activity:activity-ktx:1.13.0"
100
100
 
101
101
  // Custom Tabs (Microsoft OAuth in-app browser)
102
- implementation "androidx.browser:browser:1.8.0"
102
+ implementation "androidx.browser:browser:1.10.0"
103
103
 
104
104
  // Google Credential Manager (One-Tap / Passkeys)
105
- implementation "androidx.credentials:credentials:1.5.0"
106
- implementation "androidx.credentials:credentials-play-services-auth:1.5.0"
105
+ implementation "androidx.credentials:credentials:1.6.0"
106
+ implementation "androidx.credentials:credentials-play-services-auth:1.6.0"
107
107
  implementation "com.google.android.libraries.identity.googleid:googleid:1.2.0"
108
108
  }
@@ -1,4 +1,4 @@
1
1
  NitroAuth_ndkVersion=27.1.12297006
2
- NitroAuth_compileSdkVersion=35
3
- NitroAuth_targetSdkVersion=35
2
+ NitroAuth_compileSdkVersion=36
3
+ NitroAuth_targetSdkVersion=36
4
4
  NitroAuth_minSdkVersion=24
@@ -25,6 +25,7 @@ static jmethodID gRefreshMethod = nullptr;
25
25
  static jmethodID gRestoreMethod = nullptr;
26
26
  static jmethodID gHasPlayMethod = nullptr;
27
27
  static jmethodID gLogoutMethod = nullptr;
28
+ static jmethodID gRevokeAccessMethod = nullptr;
28
29
 
29
30
  // Call from JNI_OnUnload or dispose to prevent stale refs after a module reload.
30
31
  static void clearCachedJniRefs(JNIEnv* env) {
@@ -38,13 +39,14 @@ static void clearCachedJniRefs(JNIEnv* env) {
38
39
  gRestoreMethod = nullptr;
39
40
  gHasPlayMethod = nullptr;
40
41
  gLogoutMethod = nullptr;
42
+ gRevokeAccessMethod = nullptr;
41
43
  }
42
44
 
43
45
  static void ensureAuthAdapterMethods(JNIEnv* env) {
44
46
  if (gAuthAdapterClass != nullptr && gLoginMethod != nullptr
45
47
  && gRequestScopesMethod != nullptr && gRefreshMethod != nullptr
46
48
  && gRestoreMethod != nullptr && gHasPlayMethod != nullptr
47
- && gLogoutMethod != nullptr) {
49
+ && gLogoutMethod != nullptr && gRevokeAccessMethod != nullptr) {
48
50
  return;
49
51
  }
50
52
 
@@ -61,7 +63,7 @@ static void ensureAuthAdapterMethods(JNIEnv* env) {
61
63
  gLoginMethod = env->GetStaticMethodID(
62
64
  gAuthAdapterClass,
63
65
  "loginSync",
64
- "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;ZZZLjava/lang/String;Ljava/lang/String;)V"
66
+ "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZZZZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"
65
67
  );
66
68
  }
67
69
  if (gRequestScopesMethod == nullptr) {
@@ -99,6 +101,13 @@ static void ensureAuthAdapterMethods(JNIEnv* env) {
99
101
  "(Landroid/content/Context;)V"
100
102
  );
101
103
  }
104
+ if (gRevokeAccessMethod == nullptr) {
105
+ gRevokeAccessMethod = env->GetStaticMethodID(
106
+ gAuthAdapterClass,
107
+ "revokeAccessSync",
108
+ "(Landroid/content/Context;)V"
109
+ );
110
+ }
102
111
  }
103
112
 
104
113
  std::shared_ptr<Promise<AuthUser>> PlatformAuth::login(AuthProvider provider, const std::optional<LoginOptions>& options) {
@@ -127,16 +136,25 @@ std::shared_ptr<Promise<AuthUser>> PlatformAuth::login(AuthProvider provider, co
127
136
 
128
137
  std::vector<std::string> scopes = {"email", "profile"};
129
138
  std::optional<std::string> loginHint;
139
+ std::optional<std::string> nonce;
130
140
  std::optional<std::string> tenant;
131
141
  std::optional<std::string> prompt;
142
+ std::optional<std::string> hostedDomain;
143
+ std::optional<std::string> openIDRealm;
132
144
  bool useOneTap = false;
133
145
  bool forceAccountPicker = false;
134
146
  bool useLegacyGoogleSignIn = false;
147
+ bool filterByAuthorizedAccounts = false;
148
+ bool forceCodeForRefreshToken = false;
149
+ bool requestVerifiedPhoneNumber = false;
135
150
 
136
151
  if (options) {
137
152
  if (options->scopes) scopes = *options->scopes;
138
153
  loginHint = options->loginHint;
154
+ nonce = options->nonce;
139
155
  tenant = options->tenant;
156
+ hostedDomain = options->hostedDomain;
157
+ openIDRealm = options->openIDRealm;
140
158
  if (options->prompt.has_value()) {
141
159
  switch (options->prompt.value()) {
142
160
  case MicrosoftPrompt::LOGIN: prompt = "login"; break;
@@ -148,6 +166,9 @@ std::shared_ptr<Promise<AuthUser>> PlatformAuth::login(AuthProvider provider, co
148
166
  useOneTap = options->useOneTap.value_or(false);
149
167
  forceAccountPicker = options->forceAccountPicker.value_or(false);
150
168
  useLegacyGoogleSignIn = options->useLegacyGoogleSignIn.value_or(false);
169
+ filterByAuthorizedAccounts = options->filterByAuthorizedAccounts.value_or(false);
170
+ forceCodeForRefreshToken = options->forceCodeForRefreshToken.value_or(false);
171
+ requestVerifiedPhoneNumber = options->requestVerifiedPhoneNumber.value_or(false);
151
172
  }
152
173
 
153
174
  JNIEnv* env = Environment::current();
@@ -170,18 +191,30 @@ std::shared_ptr<Promise<AuthUser>> PlatformAuth::login(AuthProvider provider, co
170
191
 
171
192
  local_ref<JString> providerRef = make_jstring(providerStr);
172
193
  local_ref<JString> loginHintRef;
194
+ local_ref<JString> nonceRef;
173
195
  local_ref<JString> tenantRef;
174
196
  local_ref<JString> promptRef;
197
+ local_ref<JString> hostedDomainRef;
198
+ local_ref<JString> openIDRealmRef;
175
199
 
176
200
  if (loginHint.has_value()) {
177
201
  loginHintRef = make_jstring(loginHint.value());
178
202
  }
203
+ if (nonce.has_value()) {
204
+ nonceRef = make_jstring(nonce.value());
205
+ }
179
206
  if (tenant.has_value()) {
180
207
  tenantRef = make_jstring(tenant.value());
181
208
  }
182
209
  if (prompt.has_value()) {
183
210
  promptRef = make_jstring(prompt.value());
184
211
  }
212
+ if (hostedDomain.has_value()) {
213
+ hostedDomainRef = make_jstring(hostedDomain.value());
214
+ }
215
+ if (openIDRealm.has_value()) {
216
+ openIDRealmRef = make_jstring(openIDRealm.value());
217
+ }
185
218
 
186
219
  env->CallStaticVoidMethod(gAuthAdapterClass, gLoginMethod,
187
220
  contextPtr,
@@ -189,11 +222,17 @@ std::shared_ptr<Promise<AuthUser>> PlatformAuth::login(AuthProvider provider, co
189
222
  nullptr,
190
223
  jScopes,
191
224
  loginHintRef.get(),
225
+ nonceRef.get(),
192
226
  (jboolean)useOneTap,
193
227
  (jboolean)forceAccountPicker,
194
228
  (jboolean)useLegacyGoogleSignIn,
229
+ (jboolean)filterByAuthorizedAccounts,
230
+ (jboolean)forceCodeForRefreshToken,
231
+ (jboolean)requestVerifiedPhoneNumber,
195
232
  tenantRef.get(),
196
- promptRef.get());
233
+ promptRef.get(),
234
+ hostedDomainRef.get(),
235
+ openIDRealmRef.get());
197
236
 
198
237
  env->DeleteLocalRef(jScopes);
199
238
  env->DeleteLocalRef(stringClass);
@@ -396,13 +435,42 @@ void PlatformAuth::logout() {
396
435
  }
397
436
  }
398
437
 
438
+ std::shared_ptr<Promise<void>> PlatformAuth::revokeAccess() {
439
+ auto promise = Promise<void>::create();
440
+ auto contextPtr = static_cast<jobject>(AuthCache::getAndroidContext());
441
+ if (!contextPtr) {
442
+ promise->resolve();
443
+ return promise;
444
+ }
445
+
446
+ JNIEnv* env = Environment::current();
447
+ try {
448
+ ensureAuthAdapterMethods(env);
449
+ } catch (...) {
450
+ promise->reject(std::current_exception());
451
+ return promise;
452
+ }
453
+
454
+ env->CallStaticVoidMethod(gAuthAdapterClass, gRevokeAccessMethod, contextPtr);
455
+
456
+ if (env->ExceptionCheck()) {
457
+ env->ExceptionDescribe();
458
+ env->ExceptionClear();
459
+ promise->reject(std::make_exception_ptr(std::runtime_error("JNI call failed")));
460
+ return promise;
461
+ }
462
+
463
+ promise->resolve();
464
+ return promise;
465
+ }
466
+
399
467
  extern "C" JNIEXPORT void JNICALL Java_com_auth_AuthAdapter_nativeInitialize(JNIEnv*, jclass, jobject context) {
400
468
  AuthCache::setAndroidContext(context);
401
469
  }
402
470
 
403
471
  extern "C" JNIEXPORT void JNICALL Java_com_auth_AuthAdapter_nativeOnLoginSuccess(
404
472
  JNIEnv* env, jclass,
405
- jstring origin, jstring provider, jstring email, jstring name, jstring photo, jstring idToken, jstring accessToken, jstring serverAuthCode, jobjectArray scopes, jobject expirationTime) {
473
+ jstring origin, jstring provider, jstring email, jstring name, jstring photo, jstring idToken, jstring accessToken, jstring serverAuthCode, jstring userId, jstring phoneNumber, jstring hostedDomain, jobjectArray scopes, jobject expirationTime) {
406
474
 
407
475
  const char* originCStr = env->GetStringUTFChars(origin, nullptr);
408
476
  std::string originStr(originCStr);
@@ -467,6 +535,21 @@ extern "C" JNIEXPORT void JNICALL Java_com_auth_AuthAdapter_nativeOnLoginSuccess
467
535
  user.serverAuthCode = std::string(s);
468
536
  env->ReleaseStringUTFChars(serverAuthCode, s);
469
537
  }
538
+ if (userId) {
539
+ const char* s = env->GetStringUTFChars(userId, nullptr);
540
+ user.userId = std::string(s);
541
+ env->ReleaseStringUTFChars(userId, s);
542
+ }
543
+ if (phoneNumber) {
544
+ const char* s = env->GetStringUTFChars(phoneNumber, nullptr);
545
+ user.phoneNumber = std::string(s);
546
+ env->ReleaseStringUTFChars(phoneNumber, s);
547
+ }
548
+ if (hostedDomain) {
549
+ const char* s = env->GetStringUTFChars(hostedDomain, nullptr);
550
+ user.hostedDomain = std::string(s);
551
+ env->ReleaseStringUTFChars(hostedDomain, s);
552
+ }
470
553
  if (scopes) {
471
554
  int len = env->GetArrayLength(scopes);
472
555
  std::vector<std::string> scopeVec;