kotlin/usecases/cognito_flutter_mobile_app/README.md
flutter doctor --android-licenses.flutter doctor -v.flutter emulators --create --name android-device.flutter emulators --launch android-deviceflutter pub add amazon_cognito_identity_dart_2 in your flutter project.flutter pub add flutter_secure_storage in your flutter project.pubspec.yaml.Update assets/config.json and initialize your Cognito user pool with your Pool ID and App Client ID:
{
"UserPoolID": "<<YOUR USER POOL ID>>",
"ClientID": "<< YOUR CLIENT ID>>"
}
See cognito_manager.dart for an example of integrating with AWS Cognito, e.g.,,
import 'package:amazon_cognito_identity_dart_2/cognito.dart';
import 'config.dart';
class CognitoServiceException implements Exception {
final String message;
CognitoServiceException(this.message);
}
class User {
String username;
bool userConfirmed;
bool sessionValid;
String? userSub;
Map<String, dynamic> claims;
User(this.username, this.userConfirmed, this.sessionValid, this.userSub,
this.claims);
}
class CognitoManager {
late final CognitoUserPool userPool;
CognitoManager();
Future<void> init() async {
final config = await loadConfig();
userPool = CognitoUserPool(config.userPoolID, config.clientID);
}
Future<User> signUp(String email, String password) async {
final userAttributes = [
AttributeArg(name: 'email', value: email),
// Add other attributes as needed
];
try {
final result = await userPool.signUp(email, password,
userAttributes: userAttributes);
return User(
email, result.userConfirmed ?? false, false, result.userSub, {});
} catch (e) {
throw CognitoServiceException(e.toString());
}
}
Future<bool> confirmUser(String email, String confirmationCode) async {
final cognitoUser = CognitoUser(email, userPool);
try {
return await cognitoUser.confirmRegistration(confirmationCode);
} catch (e) {
throw CognitoServiceException(e.toString());
}
}
Future<User> signIn(String email, String password) async {
final cognitoUser = CognitoUser(email, userPool);
final authDetails =
AuthenticationDetails(username: email, password: password);
try {
final session = await cognitoUser.authenticateUser(authDetails);
if (session == null) {
throw CognitoClientException("session not found");
}
var claims = <String, dynamic>{};
claims.addAll(session.idToken.payload);
claims.addAll(session.accessToken.payload);
return User(email, true, session.isValid(),
session.idToken.getSub() ?? "", claims);
} catch (e) {
throw CognitoServiceException(e.toString());
}
}
}
See main.dart for a sample UI to implement sign up or sign in functionality, e.g.,
import 'package:flutter/material.dart';
import 'cognito_manager.dart';
...
class SignUpView extends StatefulWidget {
@override
_SignUpViewState createState() => _SignUpViewState();
}
class _SignUpViewState extends State<SignUpView> {
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
late final CognitoManager _cognitoManager;
@override
void initState() {
super.initState();
_cognitoManager = CognitoManager();
_initCognitoManager();
}
Future<void> _initCognitoManager() async {
await _cognitoManager.init();
}
void _signUp() async {
final email = _emailController.text;
final password = _passwordController.text;
try {
await _cognitoManager.signUp(email, password);
DefaultTabController.of(context).animateTo(1);
} on CognitoServiceException catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.message)),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Sign Up')),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
TextField(
controller: _emailController,
decoration: const InputDecoration(labelText: 'Email'),
),
TextField(
controller: _passwordController,
decoration: const InputDecoration(labelText: 'Password'),
obscureText: true,
),
ElevatedButton(
onPressed: _signUp,
child: const Text('Sign Up'),
),
],
),
),
);
}
}
...
Launch the application using flutter run.