ちょっと話題の記事

Flutter3 と Amplify UI Components で認証付きのWebページを作ってみました

2022.08.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX事業本部デリバリー部の平内(SIN)です。

Flutterは、iOS・Androidなどで共通したUIを一度に作ることができるフレームワークですが、Webアプリでも利用することができます。 今回は、Amplify UI Components を使用して、簡単に認証付きのWebページを作成してみました。

なお、Flutter対応のAmplify Authenticationは、2022/08/28現在、Developers Previewであり、Flutter SDK 3.0.0以上が必要です。


https://ui.docs.amplify.aws/flutter/connected-components/authenticator


https://docs.amplify.aws/lib/auth/getting-started/q/platform/flutter/#prerequisites

2 環境

作業した環境は以下の通りで、Flutterは最新の3.0.5です。

% flutter --version
Flutter 3.0.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f1875d570e (6 weeks ago) • 2022-07-13 11:24:16 -0700
Engine • revision e85ea0e79c
Tools • Dart 2.17.6 • DevTools 2.12.2

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.0.5, on macOS 12.5 21G72 darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] VS Code (version 1.70.2)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!

3 Flutter アプリ作成

最初にFlutterのアプリを作成します。

% flutter create sample_app
% cd sample_app

続いて、pubspec.yamlに下記を追記して、Amplify用のライブラリを追加します。

dependencies:
  amplify_flutter: ^1.0.0-0
  amplify_auth_cognito: ^1.0.0-0
  amplify_authenticator: ^1.0.0-0
% flutter pub get

4 Amplifyアプリ作成

最初に認証機能だけを有効にしてAmplifyアプリを作成します。

% amplify init
% amplify add auth
>configuration: Default configuration
>sign in: Username
>configure advanced settings: No, I am done.

% amplify push

lib/main.dartは、次のように編集しました。

import 'dart:developer';

import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
import 'package:amplify_authenticator/amplify_authenticator.dart';
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:flutter/material.dart';

import 'amplifyconfiguration.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State createState() => _MyAppState();
}

class _MyAppState extends State {
  @override
  void initState() {
    super.initState();
    _configureAmplify();
  }

  // MyAppの表示前にAmplifyの初期化を行う
  void _configureAmplify() async {
    try {
      await Amplify.addPlugin(AmplifyAuthCognito());
      await Amplify.configure(amplifyconfig);
      log('Successfully configured ?');
    } on Exception catch (err) {
      log('Error configuring Amplify: $err');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Authenticator( // Amplify UI Components
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        builder: Authenticator.builder(),
        home: const HomePage(),
      ),
    );
  }
}

// ログイン後に表示されるページ
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
        actions: [
          IconButton(
            icon: const Icon(Icons.logout),
            onPressed: () {
              Amplify.Auth.signOut();
            },
          ),
        ],
      ),
      body: Container(
        color: Colors.white,
      ),
    );
  }
}

この時点で、デバイスをChromeにしてデバッグ実行すると、ローカルで動作を確認できます。

5 ホスティング

Amplifyでホスティングを行うために、hostingを追加します。

% amplify add hosting
✔ Select the plugin module to execute · Amazon CloudFront and S3
? Select the environment setup: PROD (S3 with CloudFront using HTTPS)
? hosting bucket name (sampleapp-20220828091131-hostingbucket)

後ほど、リソースを配置するため、上記のBucket名(sampleapp-20220828091131-hostingbucket)をメモしておきます。

publishすることで、S3バケット及び、CloudFrontが準備されます。

% amplify publish
Hosting endpoint: https://d3lpb0dfkqt5bx.cloudfront.net

Hosting endpointが、CloudFrontにアクセスするためのドメイン名(d3lpb0dfkqt5bx.cloudfront.net)となるので、メモしておきます。

6 Webリソース作成

Webのリソースは、以下のコマンドで、build/webに作成されます。

% flutter build web

build/webの内容を全てS3バケットにアップロードします。

これで、https://d3lpb0dfkqt5bx.cloudfront.net/index.htmlからアクセス可能になります。

7 最後に

今回は、Amplify UI Components を使用して、簡単に認証付きのWebページを作成してみました。

Amplifyで提供されるコンポーネントを使用することで、ログイン完了までのUIが、超簡単に実装できます。Webページでもこれが利用できることは、個人的に非常に嬉しいです。