#dart #google-api #flutter #gmail
#dart #google-api #flutter #gmail
Вопрос:
Я столкнулся с проблемой при использовании пакета googleapis для Flutter / Dart. Это код, который у меня есть…
import 'package:googleapis/gmail/v1.dart' as gMail;
import "package:googleapis_auth/auth_io.dart";
import 'package:flutter/services.dart' show rootBundle;
class Example {
ServiceAccountCredentials credentials;
Future<gMail.GmailApi> getGMailApi() async {
return gMail.GmailApi(await getGoogleClient());
}
Future<AuthClient> getGoogleClient() async {
return await clientViaServiceAccount(await getCredentials(), [
'https://www.googleapis.com/auth/drive',
'https://mail.google.com/',
]);
}
Future<ServiceAccountCredentials> getCredentials() async {
if (credentials == null) {
credentials = ServiceAccountCredentials.fromJson(
json.decode(await rootBundle.loadString('GSuiteServiceAccountInfo.json')));
}
return credentials;
}
String getBase64Email({String source}) {
List<int> bytes = utf8.encode(source);
String base64String = base64UrlEncode(bytes);
return base64StringFormatted;
}
sendEmail({
String from: 'me',
String to: 'someemail@gmail.com',
String subject: 'Some subject',
String contentType: 'text/html',
String charset: 'utf-8',
String contentTransferEncoding: 'base64',
String emailContent: '<table></table>',
}) async {
(await getGMailApi()).users.messages.send(
gMail.Message.fromJson({
'raw': getBase64Email(
source: 'From: $fromrn'
'To: $torn'
'Subject: $subjectrn'
'Content-Type: $contentType; charset=$charsetrn'
'Content-Transfer-Encoding: $contentTransferEncodingrnrn'
'$emailContent'), // emailContent is HTML table.
}),
from);
}
}
Когда я вызываю sendEmail
функцию, я получаю DetailedApiRequestError(status: 400, message: Bad Request)
. Но когда я пытаюсь отправить строку base64UrlEncoded через playground, это работает, электронное письмо отправляется.
Вот мой flutter doctor -v
:
[√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 10.0.17763.316], locale en-US)
• Flutter version 1.2.1 at C:srcflutter-0.7.3flutter
• Framework revision 8661d8aecd (3 weeks ago), 2019-02-14 19:19:53 -0800
• Engine revision 3757390fa4
• Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)
[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
• Android SDK at C:UsersbbozhidarovAppDataLocalAndroidSdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-28, build-tools 28.0.3
• ANDROID_HOME = C:UsersbbozhidarovAppDataLocalAndroidSdk
• Java binary at: C:Program FilesAndroidAndroid Studiojrebinjava
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
• All Android licenses accepted.
[√] Android Studio (version 3.3)
• Android Studio at C:Program FilesAndroidAndroid Studio
• Flutter plugin version 33.3.1
• Dart plugin version 182.5215
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
[!] IntelliJ IDEA Community Edition (version 2018.1)
• IntelliJ at C:Program FilesJetBrainsIntelliJ IDEA Community Edition 2018.1.6
X Flutter plugin not installed; this adds Flutter specific functionality.
X Dart plugin not installed; this adds Dart specific functionality.
• For information about installing plugins, see
https://flutter.io/intellij-setup/#installing-the-plugins
[!] VS Code, 64-bit edition (version 1.30.2)
• VS Code at C:Program FilesMicrosoft VS Code
X Flutter extension not installed; install from
https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
[√] Connected device (1 available)
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.1.0 (API 27) (emulator)
! Doctor found issues in 2 categories.
И это мой pubspec.yaml
:
name: App Mobile
description: App Mobile
version: 1.0.0 1
environment:
sdk: ">=2.0.0-dev.68.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
intl: 0.15.7
cupertino_icons: 0.1.2
http: 0.11.3 17
shared_preferences: ^0.4.2
google_api_availability: 1.0.4
geolocator: 2.1.0
file_picker: 0.1.6
url_launcher: 4.0.3
flutter_calendar_carousel: 1.3.10
date_util: 0.1.4
permission_handler: 2.1.0
simple_permissions: 0.1.9
logging: 0.11.3 2
googleapis: 0.52.0 1
uuid: 2.0.0
googleapis_auth: 0.2.7
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
assets:
- assets/email_templates/dynamic_form_email_template.html
- assets/email_templates/dynamic_form_email_data_row_template.html
- GSuiteServiceAccountInfo.json
Я исключаю возможность проблемы с учетными данными. Те же учетные данные / учетная запись / клиент хорошо работают с DriveApi. Любая помощь будет высоко оценена. Спасибо.
Комментарии:
1. Вы устранили эту ошибку?
2. есть какие-либо обновления по этому поводу?
Ответ №1:
Старый, но все еще актуальный!
Для учетных записей служб (SA) требуется реальная учетная запись gsuite для отправки электронных писем, через которую SA может выдавать себя.
Решение…Сначала убедитесь, что ваш SA имеет делегирование по всему домену и разрешенную область для отправки почты (https://www.googleapis.com/auth/gmail.send) в разделе Управление доступом к API в консоли администратора. Затем добавьте переменную олицетворенного пользователя, указав существующий адрес электронной почты gsuite в учетных данных, как показано ниже:
ServiceAccountCredentials.fromJson(myJsonCredentials, impersonatedUser: "existing_gsuite_email@yourdomain")
Комментарии:
1. Поскольку речь идет о приложении flutter, и, возможно, я что-то упускаю — но действительно ли это хорошая идея использовать учетные данные учетной записи службы с таким разрешением в клиентском приложении, которое вы распространяете среди пользователей?
2. Учетные записи службы @herbert полезны для доступа к службам, но вы правы, существуют неотъемлемые риски, которыми необходимо управлять. Это совершенно другая тема, и на SO есть много дискуссий о реализации безопасности. По сути, предположим, что при наличии достаточного времени ничто не является безопасным, и внедрите процесс для устранения нарушений по мере их возникновения. В приведенном выше коде учетные данные API хранятся как ресурс. Хотя это может быть просто примером, это определенно не тот способ начать.