@@ -124,7 +124,12 @@ METHOD_LOOKUP_DEFINITION(twittercred,
124
124
X (NewBuilder, " newBuilder" , \
125
125
" (Ljava/lang/String;Lcom/google/firebase/auth/FirebaseAuth;)" \
126
126
" Lcom/google/firebase/auth/OAuthProvider$Builder;" , \
127
+ util::kMethodTypeStatic ), \
128
+ X (NewCredentialBuilder, " newCredentialBuilder" , \
129
+ " (Ljava/lang/String;)" \
130
+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" , \
127
131
util::kMethodTypeStatic )
132
+
128
133
// clang-format on
129
134
METHOD_LOOKUP_DECLARATION (oauthprovider, OAUTHPROVIDER_METHODS)
130
135
METHOD_LOOKUP_DEFINITION (oauthprovider,
@@ -180,6 +185,29 @@ METHOD_LOOKUP_DEFINITION(oauthprovider_builder,
180
185
PROGUARD_KEEP_CLASS
181
186
" com/google/firebase/auth/OAuthProvider$Builder" ,
182
187
OAUTHPROVIDER_BUILDER_METHODS)
188
+
189
+ // clang-format off
190
+ #define OAUTHPROVIDER_CREDENTIALBUILDER_METHODS (X ) \
191
+ X (SetAccessToken, " setAccessToken" , \
192
+ " (Ljava/lang/String;)" \
193
+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
194
+ X (SetIdToken, " setIdToken" , \
195
+ " (Ljava/lang/String;)" \
196
+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
197
+ X (SetIdTokenWithRawNonce, " setIdTokenWithRawNonce" , \
198
+ " (Ljava/lang/String;Ljava/lang/String;)" \
199
+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
200
+ X (Build, " build" , " ()Lcom/google/firebase/auth/AuthCredential;" )
201
+ // clang-format on
202
+
203
+ METHOD_LOOKUP_DECLARATION (oauthprovider_credentialbuilder,
204
+ OAUTHPROVIDER_CREDENTIALBUILDER_METHODS)
205
+ METHOD_LOOKUP_DEFINITION (
206
+ oauthprovider_credentialbuilder,
207
+ PROGUARD_KEEP_CLASS
208
+ " com/google/firebase/auth/OAuthProvider$CredentialBuilder" ,
209
+ OAUTHPROVIDER_CREDENTIALBUILDER_METHODS)
210
+
183
211
// clang-format off
184
212
#define AUTH_IDP_METHODS (X ) \
185
213
X (StartActivityForSignInWithProvider, " startActivityForSignInWithProvider" , \
@@ -275,19 +303,21 @@ bool CacheCredentialMethodIds(
275
303
return false ;
276
304
}
277
305
278
- g_methods_cached = credential::CacheMethodIds (env, activity) &&
279
- emailcred::CacheMethodIds (env, activity) &&
280
- facebookcred::CacheMethodIds (env, activity) &&
281
- githubcred::CacheMethodIds (env, activity) &&
282
- googlecred::CacheMethodIds (env, activity) &&
283
- oauthprovider::CacheMethodIds (env, activity) &&
284
- oauthprovider_builder::CacheMethodIds (env, activity) &&
285
- auth_idp::CacheMethodIds (env, activity) &&
286
- user_idp::CacheMethodIds (env, activity) &&
287
- phonecred::CacheMethodIds (env, activity) &&
288
- timeunit::CacheFieldIds (env, activity) &&
289
- playgamescred::CacheMethodIds (env, activity) &&
290
- twittercred::CacheMethodIds (env, activity);
306
+ g_methods_cached =
307
+ credential::CacheMethodIds (env, activity) &&
308
+ emailcred::CacheMethodIds (env, activity) &&
309
+ facebookcred::CacheMethodIds (env, activity) &&
310
+ githubcred::CacheMethodIds (env, activity) &&
311
+ googlecred::CacheMethodIds (env, activity) &&
312
+ oauthprovider::CacheMethodIds (env, activity) &&
313
+ oauthprovider_builder::CacheMethodIds (env, activity) &&
314
+ oauthprovider_credentialbuilder::CacheMethodIds (env, activity) &&
315
+ auth_idp::CacheMethodIds (env, activity) &&
316
+ user_idp::CacheMethodIds (env, activity) &&
317
+ phonecred::CacheMethodIds (env, activity) &&
318
+ timeunit::CacheFieldIds (env, activity) &&
319
+ playgamescred::CacheMethodIds (env, activity) &&
320
+ twittercred::CacheMethodIds (env, activity);
291
321
292
322
return g_methods_cached;
293
323
}
@@ -303,6 +333,7 @@ void ReleaseCredentialClasses(JNIEnv* env) {
303
333
jniphone::ReleaseClass (env);
304
334
oauthprovider::ReleaseClass (env);
305
335
oauthprovider_builder::ReleaseClass (env);
336
+ oauthprovider_credentialbuilder::ReleaseClass (env);
306
337
phonecred::ReleaseClass (env);
307
338
timeunit::ReleaseClass (env);
308
339
twittercred::ReleaseClass (env);
@@ -549,6 +580,76 @@ Credential OAuthProvider::GetCredential(const char* provider_id,
549
580
return Credential (CredentialLocalToGlobalRef (j_cred));
550
581
}
551
582
583
+
584
+ // static
585
+ Credential OAuthProvider::GetCredential (const char * provider_id,
586
+ const char * id_token,
587
+ const char * raw_nonce,
588
+ const char * access_token) {
589
+ FIREBASE_ASSERT_RETURN (Credential (),
590
+ provider_id && id_token && raw_nonce );
591
+ FIREBASE_ASSERT_MESSAGE_RETURN (Credential (), g_methods_cached,
592
+ kMethodsNotCachedError );
593
+
594
+ JNIEnv* env = GetJniEnv ();
595
+ jstring j_provider_id = env->NewStringUTF (provider_id);
596
+ jstring j_id_token = env->NewStringUTF (id_token);
597
+ jstring j_raw_nonce = env->NewStringUTF (raw_nonce);
598
+
599
+ jobject j_cred_builder = env->CallStaticObjectMethod (
600
+ oauthprovider::GetClass (),
601
+ oauthprovider::GetMethodId (oauthprovider::kNewCredentialBuilder ),
602
+ j_provider_id);
603
+
604
+ jobject j_cred = nullptr ;
605
+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
606
+ jobject builder_return_ref = env->CallObjectMethod (
607
+ j_cred_builder,
608
+ oauthprovider_credentialbuilder::GetMethodId (
609
+ oauthprovider_credentialbuilder::kSetIdTokenWithRawNonce ),
610
+ j_id_token, j_raw_nonce);
611
+
612
+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
613
+ env->DeleteLocalRef (builder_return_ref);
614
+ // add the access token, if it exists.
615
+ if (access_token != nullptr ) {
616
+ jobject j_access_token = env->NewStringUTF (access_token);
617
+ builder_return_ref = env->CallObjectMethod (
618
+ j_cred_builder,
619
+ oauthprovider_credentialbuilder::GetMethodId (
620
+ oauthprovider_credentialbuilder::kSetAccessToken ),
621
+ j_access_token);
622
+
623
+ env->DeleteLocalRef (j_access_token);
624
+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
625
+ env->DeleteLocalRef (builder_return_ref);
626
+ } else {
627
+ env->DeleteLocalRef (j_cred_builder);
628
+ j_cred_builder = nullptr ;
629
+ }
630
+ }
631
+ }
632
+
633
+ // If we have a valid credential builder, build a credential.
634
+ if (j_cred_builder != nullptr ) {
635
+ j_cred = env->CallObjectMethod (
636
+ j_cred_builder, oauthprovider_credentialbuilder::GetMethodId (
637
+ oauthprovider_credentialbuilder::kBuild ));
638
+ if (firebase::util::CheckAndClearJniExceptions (env)) {
639
+ j_cred = nullptr ;
640
+ }
641
+
642
+ env->DeleteLocalRef (j_cred_builder);
643
+ }
644
+ }
645
+
646
+ env->DeleteLocalRef (j_provider_id);
647
+ env->DeleteLocalRef (j_raw_nonce);
648
+ env->DeleteLocalRef (j_id_token);
649
+
650
+ return Credential (CredentialLocalToGlobalRef (j_cred));
651
+ }
652
+
552
653
// static
553
654
Future<Credential> GameCenterAuthProvider::GetCredential () {
554
655
// Game Center is not available on Android
0 commit comments