Flutter AWS认证插件aws_auth的使用

Flutter AWS认证插件aws_auth的使用

aws_auth 是一个用于在Dart中签名AWS API请求的低级库。以下是该库的使用方法。

使用

首先,创建 AWSCredentialsProvider 对象。可以通过使用 AWSStaticCredentialsProvider 类来设置凭据:

final credentialsProvider = AWSCredentialsProvider(
  'AWS_ACCESS_KEY_ID',
  'AWS_SECRET_ACCESS_KEY',
  sessionToken: 'AWS_SESSION_TOKEN',  // 这是可选的
);

你可以实现自己的提供者(provider),例如如果需要动态检索凭据并定期刷新它们。

接下来,初始化 AWS4Signer 对象以指定区域和服务:

final signer = AWS4Signer(
  credentialsProvider, 
  region: 'eu-central-1', 
  serviceName: 'sts',
);

创建 AWSRequest 对象,并将其传递给 signpresign 方法(见下面的示例)。签名器将修改请求并添加必要的头或查询参数(在预签名的情况下)以包含认证信息。

POST请求带有授权头

final req = AWSRequest.formData(
  'https://sts.eu-central-1.amazonaws.com/',
  body: {
    'Action': 'GetCallerIdentity',
    'Version': '2011-06-15',
  },
);
signer.sign(req);

print(req.headers['Authorization']);
print(req.headers['X-Amz-Date']);

GET请求带有查询字符串中的认证信息(预签名URL)

final req = AWSRequest(
  'https://sts.eu-central-1.amazonaws.com/',
  queryParameters: {
    'Action': 'GetCallerIdentity',
    'Version': '2011-06-15',
  },
);
signer.presign(req);

print(req.url);

完整示例

以下是一个完整的示例,展示了如何使用 aws_auth 库来创建签名和预签名的请求。

import 'package:aws_auth/aws_auth.dart';

// 创建预签名的 GetCallerIdentity 请求
AWSRequest createPresignGetCallerIdentityRequest(
  AWS4Signer signer,
  Duration expires,
) {
  // 创建请求
  final req = AWSRequest(
    'https://sts.${signer.region}.amazonaws.com/',
    queryParameters: {
      'Action': 'GetCallerIdentity',
      'Version': '2011-06-15',
    },
  );

  // 预签名请求
  signer.presign(req, expires: expires);

  return req;
}

// 创建带有签名的 GetCallerIdentity 请求
AWSRequest createGetCallerIdentityRequest(AWS4Signer signer) {
  // 创建请求
  final req = AWSRequest.formData(
    'https://sts.${signer.region}.amazonaws.com/',
    body: {
      'Action': 'GetCallerIdentity',
      'Version': '2011-06-15',
    },
  );

  // 签名请求
  signer.sign(req);

  return req;
}

// 将请求格式化为 curl 命令
String formatAsCurlCommand(AWSRequest req) {
  var cmd = ['curl', '-v'];

  // 设置方法
  cmd.add('-X ${req.method}');

  // 设置头部
  req.headers.forEach((key, value) {
    cmd.add("-H '$key: $value'");
  });

  // 设置主体
  if (req.body.isNotEmpty) {
    cmd.add("-d '${req.body}'");
  }

  // 设置 URL
  cmd.add(req.url.toString());

  return cmd.join(' ') + '\n';
}

void main() async {
  // 提供你的 AWS 配置
  final AWS_ACCESS_KEY_ID = 'aws_access_key_id';
  final AWS_SECRET_ACCESS_KEY = 'aws_secret_access_key';
  final AWS_REGION = 'eu-central-1';

  // 创建凭据对象
  final credentialsProvider = AWSStaticCredentialsProvider(
    AWS_ACCESS_KEY_ID,
    AWS_SECRET_ACCESS_KEY,
    sessionToken: null,
  );
  final signer = AWS4Signer(
    credentialsProvider,
    region: AWS_REGION,
    serviceName: 'sts',
  );

  print('SIGNING:');
  final signedReq = createGetCallerIdentityRequest(signer);
  print(formatAsCurlCommand(signedReq));

  print('PRESIGNING:');
  final presignedReq = createPresignGetCallerIdentityRequest(
    signer,
    Duration(minutes: 5),
  );
  print(formatAsCurlCommand(presignedReq));
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用aws_auth插件进行AWS认证的示例代码。aws_auth插件允许Flutter应用与AWS服务进行交互,包括用户认证和授权。请注意,这里假设你已经配置好了AWS的Cognito服务。

首先,确保在pubspec.yaml文件中添加aws_auth依赖:

dependencies:
  flutter:
    sdk: flutter
  aws_auth: ^x.y.z  # 请替换为最新的版本号

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

接下来,配置AWS Cognito的用户池和身份池信息。这些信息通常包括用户池ID、客户端ID、区域等。以下是一个基本的配置示例:

import 'package:aws_auth/aws_auth.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AWS Auth Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final AmplifyConfig _amplifyConfig = AmplifyConfig(
    awsconfig: '''{
      "aws_cognito_region": "YOUR_REGION",
      "aws_user_pools_id": "YOUR_USER_POOLS_ID",
      "aws_user_pools_web_client_id": "YOUR_CLIENT_ID",
      "mandatorySignIn": true
    }''',
  );

  @override
  void initState() {
    super.initState();
    _configureAmplify();
  }

  Future<void> _configureAmplify() async {
    try {
      await Amplify.configure(_amplifyConfig);
      print('AWS Amplify configured successfully');
      // 可以在这里进行认证操作,例如登录
      // await _signIn();
    } catch (e) {
      print('Failed to configure AWS Amplify: $e');
    }
  }

  Future<void> _signIn() async {
    try {
      // 使用Cognito User Pool进行登录
      SignUpResult result = await Auth.signUp(
        username: 'testuser@example.com',
        password: 'SuperSecretPassword123!',
        options: SignUpOptions(
          validationData: [
            {
              'key': 'custom:email',
              'value': 'testuser@example.com',
            },
          ],
        ),
      );

      // 确认用户(如果需要)
      // await Auth.confirmSignUp(
      //   username: 'testuser@example.com',
      //   confirmationCode: 'CONFIRMATION_CODE',
      // );

      // 登录用户
      // await Auth.signIn(username: 'testuser@example.com', password: 'SuperSecretPassword123!');

      print('Sign in result: $result');
    } catch (e) {
      print('Sign in failed: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () async {
            // 调用登录方法(示例中未自动调用以避免立即触发)
            await _signIn();
          },
          child: Text('Sign In'),
        ),
      ],
    );
  }
}

注意事项

  1. 配置信息:确保将YOUR_REGIONYOUR_USER_POOLS_IDYOUR_CLIENT_ID替换为你的AWS Cognito用户池的实际配置信息。
  2. 依赖管理aws_auth插件依赖于amplify-flutter,因此确保amplify-flutter及其依赖项也已正确安装。
  3. 用户交互:上面的示例代码中包含了一个简单的登录按钮,但实际的用户交互(如获取验证码、输入密码等)需要根据应用需求进行更复杂的处理。
  4. 错误处理:在实际应用中,应添加更多的错误处理和用户反馈机制,以提高用户体验。

这个示例展示了如何配置aws_auth并进行基本的用户注册和登录操作。根据具体需求,你可能需要扩展此代码以处理更多AWS服务或更复杂的用户交互流程。

回到顶部