Skip to content

Commit 55bbe41

Browse files
Merge pull request #1891 from EnsembleUI/firebase-custom-token-auth
Firebase custom token auth
2 parents b863ee0 + e8ea8d5 commit 55bbe41

File tree

7 files changed

+102
-7
lines changed

7 files changed

+102
-7
lines changed

modules/auth/lib/auth_module.dart

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:ensemble_auth/connect/widget/connect_with_google.dart';
88
import 'package:ensemble_auth/connect/widget/connect_with_microsoft.dart';
99
import 'package:ensemble_auth/signin/auth_manager.dart';
1010
import 'package:ensemble_auth/signin/sign_in_anonymous.dart';
11+
import 'package:ensemble_auth/signin/sign_in_with_custom_token.dart';
1112
import 'package:ensemble_auth/signin/widget/sign_in_with_apple.dart';
1213
// import 'package:ensemble_auth/signin/widget/sign_in_with_auth0.dart';
1314
import 'package:ensemble_auth/signin/widget/sign_in_with_google.dart';
@@ -26,5 +27,6 @@ class AuthModuleImpl implements AuthModule {
2627
GetIt.I.registerSingleton<TokenManager>(TokenManagerImpl());
2728
GetIt.I.registerFactory<OAuthController>(() => OAuthControllerImpl());
2829
GetIt.I.registerFactory<SignInAnonymous>(() => SignInAnonymousImpl());
30+
GetIt.I.registerFactory<SignInWithCustomToken>(() => SignInWithCustomTokenImpl());
2931
}
3032
}

modules/auth/lib/signin/auth_manager.dart

+32-7
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,8 @@ class AuthManager with UserAuthentication {
116116
print('Sign in anonymous failed');
117117
return null;
118118
}
119-
Future<void> updateCurrentUser(BuildContext context, User newUser) async {
120-
await StorageManager()
121-
.writeToSystemStorage(UserAuthentication._idKey, newUser.uid);
122-
await StorageManager()
123-
.writeToSystemStorage(UserAuthentication._isAnonymous, true);
124-
}
125119

126-
updateCurrentUser(context, user);
120+
updateCurrentFirebaseUser(context, user);
127121

128122
return user.isAnonymous;
129123
} catch (e) {
@@ -132,6 +126,37 @@ class AuthManager with UserAuthentication {
132126
}
133127
}
134128

129+
Future<String?> signInWithCustomToken(
130+
BuildContext context,
131+
{required String jwtToken}
132+
) async {
133+
try {
134+
customFirebaseApp ??= await _initializeFirebaseSignIn();
135+
final _auth = FirebaseAuth.instanceFor(app: customFirebaseApp!);
136+
137+
UserCredential userCredential = await _auth.signInWithCustomToken(jwtToken);
138+
User? user = userCredential.user;
139+
if (user == null) {
140+
print('Sign in with custom firebase auth token failed');
141+
return null;
142+
}
143+
String? firebaseToken = await user.getIdToken();
144+
145+
updateCurrentFirebaseUser(context, user);
146+
return firebaseToken;
147+
} catch (e) {
148+
print(e.toString());
149+
return null;
150+
}
151+
}
152+
153+
Future<void> updateCurrentFirebaseUser(BuildContext context, User newUser) async {
154+
await StorageManager()
155+
.writeToSystemStorage(UserAuthentication._idKey, newUser.uid);
156+
await StorageManager()
157+
.writeToSystemStorage(UserAuthentication._isAnonymous, newUser.isAnonymous);
158+
}
159+
135160
Future<String?> _signInLocally(BuildContext context,
136161
{required AuthenticatedUser user, AuthToken? token}) async {
137162
// update the current user
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:ensemble/framework/action.dart';
2+
import 'package:ensemble/framework/event.dart';
3+
import 'package:ensemble/framework/stub/auth_context_manager.dart';
4+
import 'package:ensemble/screen_controller.dart';
5+
import 'package:ensemble/widget/stub_widgets.dart';
6+
import 'package:ensemble_auth/signin/auth_manager.dart';
7+
import 'package:flutter/material.dart';
8+
9+
class SignInWithCustomTokenImpl implements SignInWithCustomToken {
10+
@override
11+
Future<void> signInWithCustomToken(BuildContext context,
12+
{required SignInWithCustomTokenAction action}) async {
13+
final idToken = await AuthManager().signInWithCustomToken(context, jwtToken: action.jwtToken!);
14+
if (idToken != null) {
15+
if (action.onAuthenticated != null) {
16+
AuthenticatedUser? currentUser = AuthManager().getCurrentUser();
17+
ScreenController().executeAction(context, action.onAuthenticated!,
18+
event: EnsembleEvent(null, data: {'user': currentUser, 'idToken': idToken}));
19+
}
20+
} else {
21+
if (action.onError != null) {
22+
ScreenController().executeAction(context, action.onError!);
23+
}
24+
}
25+
}
26+
}

modules/ensemble/lib/framework/action.dart

+25
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,28 @@ class SignInAnonymousAction extends EnsembleAction {
930930
}
931931
}
932932

933+
class SignInWithCustomTokenAction extends EnsembleAction {
934+
final EnsembleAction? onAuthenticated;
935+
final EnsembleAction? onError;
936+
final String? jwtToken;
937+
938+
SignInWithCustomTokenAction({
939+
super.initiator,
940+
super.inputs,
941+
required this.onAuthenticated,
942+
required this.onError,
943+
this.jwtToken,
944+
});
945+
946+
factory SignInWithCustomTokenAction.fromYaml({Map? payload}) {
947+
return SignInWithCustomTokenAction(
948+
onAuthenticated: EnsembleAction.from(payload?['onAuthenticated']),
949+
onError: EnsembleAction.from(payload?['onError']),
950+
jwtToken: payload?['token'],
951+
);
952+
}
953+
}
954+
933955
class ClearKeychain extends EnsembleAction {
934956
ClearKeychain({
935957
required this.key,
@@ -1038,6 +1060,7 @@ enum ActionType {
10381060
setLocale,
10391061
clearLocale,
10401062
signInAnonymous,
1063+
signInWithCustomToken,
10411064
handleDeeplink,
10421065
createDeeplink,
10431066
verifySignIn,
@@ -1170,6 +1193,8 @@ abstract class EnsembleAction {
11701193
return FileUploadAction.fromYaml(payload: payload);
11711194
} else if (actionType == ActionType.signInAnonymous) {
11721195
return SignInAnonymousAction.fromYaml(payload: payload);
1196+
} else if (actionType == ActionType.signInWithCustomToken) {
1197+
return SignInWithCustomTokenAction.fromYaml(payload: payload);
11731198
} else if (actionType == ActionType.pickFiles) {
11741199
return FilePickerAction.fromYaml(payload: payload);
11751200
} else if (actionType == ActionType.openUrl) {

modules/ensemble/lib/module/auth_module.dart

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class AuthModuleStub implements AuthModule {
1717
GetIt.I.registerSingleton<TokenManager>(TokenManagerStub());
1818
GetIt.I.registerFactory<OAuthController>(() => OAuthControllerStub());
1919
GetIt.I.registerFactory<SignInAnonymous>(() => SignInAnonymousStub());
20+
GetIt.I.registerFactory<SignInWithCustomToken>(() => SignInWithCustomTokenStub());
2021
// note that we don't inject AuthContextManagerStub(), since its presence
2122
// will prevent data_context to load
2223
}

modules/ensemble/lib/screen_controller.dart

+2
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ class ScreenController {
405405
GetIt.I<FileManager>().pickFiles(context, action, scopeManager);
406406
} else if (action is SignInAnonymousAction) {
407407
GetIt.I<SignInAnonymous>().signInAnonymously(context, action: action);
408+
} else if (action is SignInWithCustomTokenAction) {
409+
GetIt.I<SignInWithCustomToken>().signInWithCustomToken(context, action: action);
408410
} else if (action is WalletConnectAction) {
409411
// TODO store session: WalletConnectSession? session = await sessionStorage.getSession();
410412

modules/ensemble/lib/widget/stub_widgets.dart

+14
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,17 @@ class SignInAnonymousStub implements SignInAnonymous {
6868
"Auth is not enabled. Please review the Ensemble documentation.");
6969
}
7070
}
71+
72+
abstract class SignInWithCustomToken {
73+
Future<void> signInWithCustomToken(BuildContext context,
74+
{required SignInWithCustomTokenAction action});
75+
}
76+
77+
class SignInWithCustomTokenStub implements SignInWithCustomToken {
78+
@override
79+
Future<void> signInWithCustomToken(BuildContext context,
80+
{required SignInWithCustomTokenAction action}) {
81+
throw ConfigError(
82+
"Auth is not enabled. Please review the Ensemble documentation.");
83+
}
84+
}

0 commit comments

Comments
 (0)