Skip to content

Commit 286a100

Browse files
firebase with custom auth token from backend
1 parent 3375794 commit 286a100

File tree

6 files changed

+73
-0
lines changed

6 files changed

+73
-0
lines changed

modules/auth/lib/auth_module.dart

Lines changed: 2 additions & 0 deletions
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_auth.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<SignInWithCustomAuth>(() => SignInWithCustomAuthImpl());
2931
}
3032
}

modules/auth/lib/signin/auth_manager.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,35 @@ class AuthManager with UserAuthentication {
132132
}
133133
}
134134

135+
Future<bool?> signInWithCustomAuth(
136+
BuildContext context,
137+
{required String idToken}
138+
) async {
139+
try {
140+
customFirebaseApp ??= await _initializeFirebaseSignIn();
141+
final _auth = FirebaseAuth.instanceFor(app: customFirebaseApp!);
142+
143+
UserCredential userCredential = await _auth.signInWithCustomToken(idToken);
144+
User? user = userCredential.user;
145+
if (user == null) {
146+
print('Sign in with custom firebase auth token failed');
147+
return null;
148+
}
149+
Future<void> updateCurrentUser(BuildContext context, User newUser) async {
150+
await StorageManager()
151+
.writeToSystemStorage(UserAuthentication._idKey, newUser.uid);
152+
await StorageManager()
153+
.writeToSystemStorage(UserAuthentication._isAnonymous, user.isAnonymous);
154+
}
155+
156+
updateCurrentUser(context, user);
157+
return user.isAnonymous;
158+
} catch (e) {
159+
print(e.toString());
160+
return null;
161+
}
162+
}
163+
135164
Future<String?> _signInLocally(BuildContext context,
136165
{required AuthenticatedUser user, AuthToken? token}) async {
137166
// update the current user

modules/ensemble/lib/framework/action.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,28 @@ class SignInAnonymousAction extends EnsembleAction {
930930
}
931931
}
932932

933+
class SignInWithCustomAuthAction extends EnsembleAction {
934+
final EnsembleAction? onAuthenticated;
935+
final EnsembleAction? onError;
936+
final String? idToken;
937+
938+
SignInWithCustomAuthAction({
939+
super.initiator,
940+
super.inputs,
941+
required this.onAuthenticated,
942+
required this.onError,
943+
this.idToken,
944+
});
945+
946+
factory SignInWithCustomAuthAction.fromYaml({Map? payload}) {
947+
return SignInWithCustomAuthAction(
948+
onAuthenticated: EnsembleAction.from(payload?['onAuthenticated']),
949+
onError: EnsembleAction.from(payload?['onError']),
950+
idToken: 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+
signInWithCustomAuth,
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.signInWithCustomAuth) {
1197+
return SignInWithCustomAuthAction.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

Lines changed: 1 addition & 0 deletions
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<SignInWithCustomAuth>(() => SignInWithCustomAuthStub());
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

Lines changed: 2 additions & 0 deletions
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 SignInWithCustomAuthAction) {
409+
GetIt.I<SignInWithCustomAuth>().signInWithCustomAuth(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

Lines changed: 14 additions & 0 deletions
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 SignInWithCustomAuth {
73+
Future<void> signInWithCustomAuth(BuildContext context,
74+
{required SignInWithCustomAuthAction action});
75+
}
76+
77+
class SignInWithCustomAuthStub implements SignInWithCustomAuth {
78+
@override
79+
Future<void> signInWithCustomAuth(BuildContext context,
80+
{required SignInWithCustomAuthAction action}) {
81+
throw ConfigError(
82+
"Auth is not enabled. Please review the Ensemble documentation.");
83+
}
84+
}

0 commit comments

Comments
 (0)