FlutterアプリにAmazon Cognitoを使った認証機能を実装し、認証トークンを利用してGPT APIキーにアクセスする方法を紹介します。
Amazon Cognitoを使うことで、ユーザー認証をセキュアに管理し、その後の認証情報を使用して他のAPIにアクセスすることができます。
ここではGPT APIへのリクエストを送る例を解説します。
前提条件
以下のツールが必要です。
- AWSアカウント(Cognito設定済み)
- GPT APIキー(OpenAIから取得)
- Flutter開発環境(Android Studioなど)
- AWS Amplify CLI(Cognitoとの連携)
Amazon Cognitoでの認証とトークン取得
まずは、FlutterアプリでAmazon Cognitoを使ってユーザー認証を行い、認証トークンを取得します。
これにより、GPT APIキーへの安全なアクセスが可能になります。
UIの構築
最初に、ユーザー名とパスワードを入力するログイン画面を作成します。
以下のコードは基本的なログインフォームの例です。
import 'package:flutter/material.dart';
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _usernameController = TextEditingController();
final _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Amazon Cognitoログイン'),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextField(
controller: _usernameController,
decoration: InputDecoration(labelText: 'ユーザー名'),
),
TextField(
controller: _passwordController,
decoration: InputDecoration(labelText: 'パスワード'),
obscureText: true,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _login,
child: Text('ログイン'),
),
],
),
),
);
}
void _login() {
final username = _usernameController.text;
final password = _passwordController.text;
_authenticateUser(username, password);
}
void _authenticateUser(String username, String password) async {
try {
SignInResult result = await Amplify.Auth.signIn(
username: username,
password: password,
);
if (result.isSignedIn) {
print('ログイン成功');
String token = (await Amplify.Auth.fetchAuthSession()).userPoolTokens.idToken;
print('ID Token: $token');
_callGPTAPI(token);
} else {
print('ログイン失敗');
}
} catch (e) {
print('ログイン中にエラーが発生しました: $e');
}
}
// GPT APIの呼び出し
void _callGPTAPI(String token) async {
final response = await post(
Uri.parse('https://api.openai.com/v1/chat/completions'),
headers: {
'Authorization': 'Bearer $token', // Cognito認証トークンを使用
'Content-Type': 'application/json',
},
body: jsonEncode({
'model': 'gpt-3.5-turbo',
'messages': [
{'role': 'user', 'content': 'Hello, GPT!'}
],
}),
);
if (response.statusCode == 200) {
print('GPT API成功: ${response.body}');
} else {
print('GPT API失敗: ${response.statusCode}');
}
}
}
認証プロセスの流れ
- ユーザーがログインすると、Amazon Cognitoが認証を行い、IDトークンが返されます。
- 取得したトークンを使用して、GPT APIへのリクエストを送信します。
このトークンは、GPT APIキーの代わりに使うことができ、認証されたユーザーのみがAPIにアクセス可能になります。
AmplifyとGPT APIの設定
pubspec.yamlに以下の依存パッケージを追加します。
dependencies:
amplify_flutter: ^0.3.0
amplify_auth_cognito: ^0.3.0
http: ^0.13.3 # APIリクエスト用
OpenAIの公式サイトからGPT APIキーを取得し、適切にFlutterアプリケーションで使用できるように設定します。
この際、認証トークンを用いてAPIにアクセスできるようにし、APIキーはサーバー側で管理することをおすすめします。
実装詳細
ログインが成功すると、Amplify.Auth.fetchAuthSession()メソッドを使って、CognitoからのIDトークンを取得します。
このトークンを使うことで、他のAPI(例えばGPT API)にも認証済みとしてアクセスが可能です。
String token = (await Amplify.Auth.fetchAuthSession()).userPoolTokens.idToken;
取得した認証トークンを使って、GPT APIにリクエストを送信します。
Flutterのhttpパッケージを使用して、POSTリクエストを送信します。
final response = await post(
Uri.parse('https://api.openai.com/v1/chat/completions'),
headers: {
'Authorization': 'Bearer $token', // Cognitoトークンを使用
'Content-Type': 'application/json',
},
body: jsonEncode({
'model': 'gpt-3.5-turbo',
'messages': [
{'role': 'user', 'content': 'Hello, GPT!'}
],
}),
);
セキュリティとトークン管理の注意点
APIキーやトークンはセキュリティのため、クライアント側で長期的に保存しないことが推奨されます。
セッションが切れた場合や、一定時間が経過した際には、再認証を行う仕組みを取り入れてください。
また、トークンを使ったAPIアクセスを安全に行うために、常にHTTPで通信を行い、認証情報が不正に利用されないように対策を講じる必要があります。
まとめ
今回の例では、FlutterアプリケーションでAmazon Cognitoを使った認証機能を実装し、その後に取得した認証トークンを使ってGPT APIにアクセスする方法を解説しました。
このように、Cognitoで認証されたユーザーに対してセキュアなAPIアクセスを提供することで、より安全なアプリケーションを構築することが可能です。
コメント