Flutter AWS Cognito身份认证插件amazon_cognito_identity_dart的使用

Flutter AWS Cognito身份认证插件amazon_cognito_identity_dart的使用

简介

amazon_cognito_identity_dart 是一个基于 Dart 编写的 AWS Cognito 身份认证 SDK。它提供了多种功能,包括用户注册、登录、验证、密码重置等。该库基于官方的 amazon-cognito-identity-js 库,并适用于 Flutter 开发。

注意: 该包目前尚未达到生产就绪状态,但在开发阶段可以使用。


使用案例

使用案例 1:用户注册

通过提供 UserPoolIdClientId 创建 CognitoUserPool 对象,并使用用户名、密码及属性列表完成用户注册。

import 'package:amazon_cognito_identity_dart/cognito.dart';

final userPool = new CognitoUserPool(
    'ap-southeast-1_xxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxx');
final userAttributes = [
  new AttributeArg(name: 'first_name', value: 'Jimmy'),
  new AttributeArg(name: 'last_name', value: 'Wong'),
];

var data;
try {
  data = await userPool.signUp('email@inspire.my', 'Password001',
      userAttributes: userAttributes);
} catch (e) {
  print(e);
}

使用案例 2:确认未认证用户的注册

通过接收到的短信或邮件验证码完成用户注册确认。

import 'package:amazon_cognito_identity_dart/cognito.dart';

final userPool = new CognitoUserPool(
    'ap-southeast-1_xxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxx');

final cognitoUser = new CognitoUser(
    'email@inspire.my', userPool);

bool registrationConfirmed = false;
try {
  registrationConfirmed = await cognitoUser.confirmRegistration('123456');
} catch (e) {
  print(e);
}
print(registrationConfirmed);

使用案例 4:用户登录并获取会话

通过提供用户名和密码完成用户登录,并获取身份认证会话。

import 'package:amazon_cognito_identity_dart/cognito.dart';

final userPool = new CognitoUserPool(
    'ap-southeast-1_xxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxx');
final cognitoUser = new CognitoUser(
    'email@inspire.my', userPool);
final authDetails = new AuthenticationDetails(
    username: 'email@inspire.my', password: 'Password001');
CognitoUserSession session;
try {
  session = await cognitoUser.authenticateUser(authDetails);
} on CognitoUserNewPasswordRequiredException catch (e) {
  // 处理需要新密码的情况
} catch (e) {
  print(e);
}
print(session.getAccessToken().getJwtToken());

使用案例 5:获取已认证用户的属性

获取已认证用户的属性列表。

List<CognitoUserAttribute> attributes;
try {
  attributes = await cognitoUser.getUserAttributes();
} catch (e) {
  print(e);
}
attributes.forEach((attribute) {
  print('attribute ${attribute.getName()} has value ${attribute.getValue()}');
});

使用案例 14:注销用户

注销当前用户会话。

await cognitoUser.signOut();

使用案例 15:全局注销用户

全局注销所有设备上的用户会话。

await cognitoUser.globalSignOut();

额外功能

获取 AWS 凭证

通过身份认证会话获取 AWS 凭证,用于签名其他 AWS 请求。

final credentials = new CognitoCredentials(
    'ap-southeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', userPool);
await credentials.getAwsCredentials(session.getIdToken().getJwtToken());
print(credentials.accessKeyId);
print(credentials.secretAccessKey);
print(credentials.sessionToken);

S3 文件上传(HTTP Presigned Post)

使用 HTTP Presigned Post 上传文件到 S3。

// 省略部分代码,请参考完整示例

S3 文件下载(带授权)

使用签名请求从 S3 下载文件。

// 省略部分代码,请参考完整示例

GraphQL 请求签名

为 AppSync 的 GraphQL 请求签名。

// 省略部分代码,请参考完整示例

API Gateway & Lambda 请求签名

为 API Gateway 和 Lambda 请求签名。

// 省略部分代码,请参考完整示例

自定义存储实现

使用自定义存储机制持久化用户会话。

class CustomStorage extends CognitoStorage {
  String prefix;
  CustomStorage(this.prefix);

  [@override](/user/override)
  Future setItem(String key, value) async {
    _storage[prefix+key] = json.encode(value);
    return _storage[prefix+key];
  }

  [@override](/user/override)
  Future getItem(String key) async {
    if (_storage[prefix+key] != null) {
      return json.decode(_storage[prefix+key]);
    }
    return null;
  }

  [@override](/user/override)
  Future removeItem(String key) async {
    return _storage.remove(prefix+key);
  }

  [@override](/user/override)
  Future<void> clear() async {
    _storage = {};
  }
}

final customStore = new CustomStorage('custom:');
final userPool = new CognitoUserPool(
    'ap-southeast-1_xxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxxxx',
    storage: customStore);
final cognitoUser = new CognitoUser(
    'email@inspire.my', userPool,
    storage: customStore);
final authDetails = new AuthenticationDetails(
    username: 'email@inspire.my', password: 'Password001');
await cognitoUser.authenticateUser(authDetails);

更多关于Flutter AWS Cognito身份认证插件amazon_cognito_identity_dart的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter AWS Cognito身份认证插件amazon_cognito_identity_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


amazon_cognito_identity_dart 是一个用于在 Flutter 应用中与 AWS Cognito 进行身份认证的 Dart 插件。它允许你实现用户注册、登录、密码重置等功能。以下是如何在 Flutter 项目中使用 amazon_cognito_identity_dart 插件的步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 amazon_cognito_identity_dart 依赖:

dependencies:
  flutter:
    sdk: flutter
  amazon_cognito_identity_dart: ^2.0.0

然后运行 flutter pub get 来安装依赖。

2. 配置 AWS Cognito

在 AWS 控制台中创建一个 Cognito 用户池,并获取以下信息:

  • User Pool ID: 用户池的唯一标识符。
  • Client ID: 用户池中应用的客户端 ID。

3. 初始化 Cognito 客户端

在你的 Flutter 应用中,初始化 Cognito 客户端:

import 'package:amazon_cognito_identity_dart_2/cognito.dart';

final userPool = CognitoUserPool(
  'YOUR_USER_POOL_ID',
  'YOUR_CLIENT_ID',
);

4. 用户注册

使用 CognitoUserPool 来注册新用户:

Future<void> signUp(String username, String password, String email) async {
  final userAttributes = [
    AttributeArg(name: 'email', value: email),
  ];

  try {
    final result = await userPool.signUp(username, password, userAttributes: userAttributes);
    print('User signed up: ${result.userSub}');
  } catch (e) {
    print('Error signing up: $e');
  }
}

5. 用户登录

使用 CognitoUser 来登录用户:

Future<void> signIn(String username, String password) async {
  final cognitoUser = CognitoUser(username, userPool);
  final authDetails = AuthenticationDetails(
    username: username,
    password: password,
  );

  try {
    final session = await cognitoUser.authenticateUser(authDetails);
    print('User signed in: ${session.accessToken.jwtToken}');
  } catch (e) {
    print('Error signing in: $e');
  }
}

6. 获取用户信息

登录后,你可以获取用户的详细信息:

Future<void> getUserInfo(CognitoUser cognitoUser) async {
  try {
    final attributes = await cognitoUser.getUserAttributes();
    attributes.forEach((attribute) {
      print('${attribute.name}: ${attribute.value}');
    });
  } catch (e) {
    print('Error getting user info: $e');
  }
}

7. 用户注销

注销用户:

Future<void> signOut(CognitoUser cognitoUser) async {
  try {
    await cognitoUser.signOut();
    print('User signed out');
  } catch (e) {
    print('Error signing out: $e');
  }
}

8. 密码重置

用户可以请求重置密码:

Future<void> resetPassword(String username) async {
  final cognitoUser = CognitoUser(username, userPool);

  try {
    await cognitoUser.forgotPassword();
    print('Password reset code sent');
  } catch (e) {
    print('Error resetting password: $e');
  }
}

9. 确认密码重置

用户输入验证码和新密码后,确认密码重置:

Future<void> confirmPasswordReset(String username, String verificationCode, String newPassword) async {
  final cognitoUser = CognitoUser(username, userPool);

  try {
    await cognitoUser.confirmPassword(verificationCode, newPassword);
    print('Password reset confirmed');
  } catch (e) {
    print('Error confirming password reset: $e');
  }
}

10. 处理会话

你可以检查用户是否已经登录,并获取会话信息:

Future<void> checkSession(CognitoUser cognitoUser) async {
  try {
    final session = await cognitoUser.getSession();
    if (session.isValid()) {
      print('User is logged in');
    } else {
      print('User is not logged in');
    }
  } catch (e) {
    print('Error checking session: $e');
  }
}

11. 刷新 Token

如果访问令牌过期,你可以刷新它:

Future<void> refreshToken(CognitoUser cognitoUser) async {
  try {
    final session = await cognitoUser.refreshSession();
    print('Token refreshed: ${session.accessToken.jwtToken}');
  } catch (e) {
    print('Error refreshing token: $e');
  }
}

12. 错误处理

在实际应用中,确保处理所有可能的错误,例如网络错误、用户输入错误等。

13. 完整示例

以下是一个完整的示例,展示了如何使用 amazon_cognito_identity_dart 进行用户注册、登录和注销:

import 'package:flutter/material.dart';
import 'package:amazon_cognito_identity_dart_2/cognito.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AuthScreen(),
    );
  }
}

class AuthScreen extends StatefulWidget {
  [@override](/user/override)
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final userPool = CognitoUserPool('YOUR_USER_POOL_ID', 'YOUR_CLIENT_ID');
  final usernameController = TextEditingController();
  final passwordController = TextEditingController();
  final emailController = TextEditingController();

  Future<void> signUp() async {
    final userAttributes = [
      AttributeArg(name: 'email', value: emailController.text),
    ];

    try {
      final result = await userPool.signUp(usernameController.text, passwordController.text, userAttributes: userAttributes);
      print('User signed up: ${result.userSub}');
    } catch (e) {
      print('Error signing up: $e');
    }
  }

  Future<void> signIn() async {
    final cognitoUser = CognitoUser(usernameController.text, userPool);
    final authDetails = AuthenticationDetails(
      username: usernameController.text,
      password: passwordController.text,
    );

    try {
      final session = await cognitoUser.authenticateUser(authDetails);
      print('User signed in: ${session.accessToken.jwtToken}');
    } catch (e) {
      print('Error signing in: $e');
    }
  }

  Future<void> signOut(CognitoUser cognitoUser) async {
    try {
      await cognitoUser.signOut();
      print('User signed out');
    } catch (e) {
      print('Error signing out: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AWS Cognito Auth'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: usernameController,
              decoration: InputDecoration(labelText: 'Username'),
            ),
            TextField(
              controller: passwordController,
              decoration: InputDecoration(labelText: 'Password'),
              obscureText: true,
            ),
            TextField(
              controller: emailController,
              decoration: InputDecoration(labelText: 'Email'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: signUp,
              child: Text('Sign Up'),
            ),
            ElevatedButton(
              onPressed: signIn,
              child: Text('Sign In'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部