Передача состояния в действиях с электронной почтой

Вы можете передавать состояние через URL продолжения при отправке электронных писем с действиями для сброса пароля или подтверждения адреса электронной почты пользователя. Это позволяет пользователю вернуться в приложение после завершения действия. Кроме того, вы можете указать, нужно ли обрабатывать ссылку для действия с электронной почтой непосредственно из мобильного приложения, если оно установлено, вместо веб-страницы.

Это может быть очень полезно в следующих распространенных ситуациях:

  • Пользователь, который не вошел в аккаунт, пытается получить доступ к контенту, для просмотра которого требуется войти в аккаунт. Однако пользователь мог забыть пароль и поэтому запустить процесс его сброса. В конце процесса пользователь ожидает вернуться к разделу приложения, к которому он пытался получить доступ.

  • Приложение может предоставлять доступ только к подтвержденным аккаунтам. Например, в приложении для рассылки новостей пользователь должен подтвердить адрес электронной почты, прежде чем оформить подписку. Пользователь проходит процедуру подтверждения адреса электронной почты и ожидает, что после этого он вернется в приложение, чтобы завершить оформление подписки.

  • Как правило, если пользователь начинает процесс сброса пароля или подтверждения адреса электронной почты в приложении Apple, он ожидает, что сможет завершить его в этом же приложении. Возможность передавать состояние с помощью URL продолжения позволяет это сделать.

Возможность передавать состояние через URL продолжения – это мощная функция, предоставляемая Firebase Auth, которая может значительно повысить удобство для пользователей.

Передача состояния URL продолжения в действиях с электронной почтой

Чтобы безопасно передать URL продолжения, добавьте домен для URL в качестве авторизованного домена:

  1. В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.

  2. В разделе Авторизованные домены нажмите Добавить домен и добавьте URL.

При отправке письма для сброса пароля или письма с подтверждением необходимо указать экземпляр FIRActionCodeSettings. Этот интерфейс принимает следующие параметры:

Swift

Параметр Тип Описание
URL Строка

Устанавливает ссылку (URL состояния/URL продолжения), которая имеет разное значение в разных контекстах:

  • Когда ссылка обрабатывается в виджетах веб-действий, она становится ссылкой на контент в параметре запроса continueUrl.
  • Если ссылка обрабатывается непосредственно в приложении, это параметр запроса continueUrl в ссылке на контент из ссылки Hosting.
iOSBundleID Строка Устанавливает идентификатор пакета iOS, чтобы Firebase Authentication мог определить, нужно ли создавать ссылку только для сайта или мобильную ссылку, которая открывается на устройстве Apple.
androidPackageName Строка Устанавливает название пакета Android, чтобы Firebase Authentication мог определить, нужно ли создавать ссылку только для сайта или мобильную ссылку, которая открывается на устройстве Android.
handleCodeInApp Логическое значение Будет ли ссылка для действия в электронном письме сначала открываться в мобильном приложении или в интернете. По умолчанию присваивается значение false. Если задано значение true, ссылка на код действия будет отправлена как универсальная ссылка или ссылка на приложение Android и будет открыта приложением, если оно установлено. Если значение параметра false, код сначала будет отправлен в веб-виджет, а затем, если приложение установлено, при нажатии кнопки "Продолжить" произойдет перенаправление в приложение.
linkDomain Строка Если для проекта определены специальные домены ссылок на хостинг, укажите, какой из них следует использовать, когда ссылка открывается в определенном мобильном приложении. В противном случае автоматически выбирается домен по умолчанию (например, PROJECT_ID.firebaseapp.com).
dynamicLinkDomain Строка Поддержка прекращена. Не указывайте этот параметр.

Objective-C

Параметр Тип Описание
URL NSString

Устанавливает ссылку (URL состояния/URL продолжения), которая имеет разное значение в разных контекстах:

  • Когда ссылка обрабатывается в виджетах веб-действий, она становится ссылкой на контент в параметре запроса continueUrl.
  • Если ссылка обрабатывается непосредственно в приложении, это параметр запроса continueUrl в ссылке на контент из ссылки Hosting.
iOSBundleID NSString Устанавливает идентификатор пакета iOS, чтобы Firebase Authentication мог определить, нужно ли создавать ссылку только для сайта или мобильную ссылку, которая открывается на устройстве Android или Apple.
androidPackageName NSString Устанавливает название пакета Android, чтобы Firebase Authentication мог определить, нужно ли создать ссылку только для сайта или мобильную ссылку, которая открывается на устройстве Android или Apple.
handleCodeInApp BOOL Будет ли ссылка для действия в электронном письме сначала открываться в мобильном приложении или в интернете. По умолчанию присваивается значение false. Если задано значение true, ссылка на код действия будет отправлена как универсальная ссылка или ссылка на приложение Android и будет открыта приложением, если оно установлено. Если значение параметра false, код сначала будет отправлен в веб-виджет, а затем, если приложение установлено, при нажатии кнопки "Продолжить" произойдет перенаправление в приложение.
linkDomain NSString Если для проекта определены специальные домены ссылок Hosting, укажите, какой из них нужно использовать, когда ссылка открывается в определенном мобильном приложении. В противном случае автоматически выбирается домен по умолчанию (например, PROJECT_ID.firebaseapp.com).
dynamicLinkDomain NSString Поддержка прекращена. Не указывайте этот параметр.

В приведенном ниже примере показано, как отправить ссылку для подтверждения адреса электронной почты, которая сначала откроется в мобильном приложении, используя пользовательский домен ссылки Hosting custom-domain.com. Ссылка на контент будет содержать полезную нагрузку URL продолжения https://www.example.com/?email=user@example.com.

Swift

var actionCodeSettings =  ActionCodeSettings.init()
actionCodeSettings.canHandleInApp = true
let user = Auth.auth().currentUser()
actionCodeSettings.URL =
    String(format: "https://www.example.com/?email=%@", user.email)
actionCodeSettings.iOSbundleID = Bundle.main.bundleIdentifier!
actionCodeSettings.setAndroidPakageName("com.example.android")
// Specify a custom Hosting link domain to use. The domain must be
// configured in Firebase Hosting and owned by the project.
actionCodeSettings.linkDomain = "custom-domain.com"
user.sendEmailVerification(withActionCodeSettings:actionCodeSettings { error in
  if error {
    // Error occurred. Inspect error.code and handle error.
    return
  }
  // Email verification sent.
})

Objective-C

 FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
 actionCodeSettings.handleCodeInApp = YES;
 FIRUser *user = [FIRAuth auth].currentUser;
 NSString *urlString =
     [NSString stringWithFormat:@"https://www.example.com/?email=%@", user.email];
 actionCodeSettings.URL = [NSURL URLWithString:urlString];
 actionCodeSettings.iOSBundleID = [NSBundle mainBundle].bundleIdentifier;
// Specify a custom Hosting link domain to use. The domain must be
// configured in Firebase Hosting and owned by the project.
 actionCodeSettings.linkDomain = @"custom-domain.com";
 [actionCodeSettings setAndroidPackageName:@"com.example.android"];
 [user sendEmailVerificationWithActionCodeSettings:actionCodeSettings
                                        completion:^(NSError *_Nullable error) {
   if (error) {
     // Error occurred. Inspect error.code and handle error.
     return;
   }
   // Email verification sent.
 }];

Firebase Authentication использует Firebase Hosting при отправке ссылки, которая должна открываться в мобильном приложении. Чтобы использовать эту функцию, необходимо настроить ссылки Hosting в консоли Firebase.

  1. Настройка приложений Apple:

    1. Если вы планируете обрабатывать эти ссылки в приложении, вам нужно будет настроить домен ссылки Hosting как связанный домен в возможностях приложения.
    2. Подробнее о том, как получать ссылки на размещенный контент для iOS…
  2. Настройка приложений для Android:

    1. Если вы планируете обрабатывать эти ссылки в приложении для Android, название пакета приложения необходимо указать в настройках проекта консоли Firebase. Кроме того, необходимо указать SHA-1 и SHA-256 сертификата приложения.
    2. Вам также потребуется настроить фильтр интентов для ссылки на контент в файле AndroidManifest.xml.
    3. Подробнее о том, как получать ссылки на хостинговые приложения для Android…

Как обрабатывать действия с электронной почтой в веб-приложении

Вы можете указать, хотите ли вы сначала обработать ссылку с кодом действия из веб-приложения, а затем перенаправить пользователя на другую веб-страницу или в мобильное приложение (если оно доступно). Для этого задайте атрибуту handleCodeInApp значение false в объекте FIRActionCodeSettings (Obj-C) или ActionCodeSettings (Swift). Идентификатор пакета или название пакета Android не являются обязательными, но если вы их укажете, пользователь сможет вернуться в приложение после того, как введет код действия из письма.

Здесь используется URL, настроенный в разделе шаблонов действий с электронной почтой. Для всех проектов по умолчанию предоставляется одна квота. Подробнее о том, как настроить обработчик действий с электронной почтой, рассказывается в статье Как настроить обработчики электронной почты.

В этом случае ссылка в параметре запроса continueURL будет ссылкой Hosting, полезная нагрузка которой – это URL, указанный в объекте ActionCodeSettings.

При обработке действий с электронной почтой, например подтверждения адреса электронной почты, код действия из параметра запроса oobCode необходимо извлечь из ссылки на контент и применить с помощью applyActionCode, чтобы изменение вступило в силу (например, чтобы адрес электронной почты был подтвержден).

Как обрабатывать действия с электронной почтой в мобильном приложении

Вы можете указать, нужно ли сначала обрабатывать ссылку с кодом действия в мобильном приложении, если оно установлено. Если на ссылку нажимают на устройстве, которое не поддерживает мобильное приложение, она открывается на веб-странице. Для этого задайте атрибуту handleCodeInApp значение true в объекте FIRActionCodeSettings (Obj-C) или ActionCodeSettings (Swift). Вам также нужно будет указать название пакета Android или идентификатор пакета iOS для мобильного приложения. Если мобильное приложение недоступно, используется резервный URL сайта, настроенный в разделе шаблонов действий с электронной почтой. По умолчанию для всех проектов предоставляется одна. Подробнее о том, как настроить обработчик действий с электронной почтой, рассказывается в статье Как настроить обработчики электронной почты.

В этом случае ссылка на мобильное приложение, отправленная пользователю, будет ссылкой Hosting, полезная нагрузка которой представляет собой URL кода действия, настроенный в консоли, с параметрами запроса oobCode, mode, apiKey и continueUrl. Последний будет исходным значением URL, указанным в объекте FIRActionCodeSettings (Obj-C) или ActionCodeSettings (Swift). Код действия можно применить непосредственно из мобильного приложения, как и в веб-версии, описанной в разделе Настройка обработчиков электронной почты.

При обработке действий с электронной почтой, например подтверждения адреса электронной почты, код действия из параметра запроса oobCode необходимо извлечь из ссылки на контент и применить с помощью applyActionCode, чтобы изменение вступило в силу (например, чтобы адрес электронной почты был подтвержден).