📩
FlutterでFirebaseのメールリンク認証を使う
修正リクは ➡️ |
---|
Flutterでfirebase_authとfirebase_ui_authを使って簡単にログイン画面を構成しつつ、Firebaseのメールリンク認証を使ってログインする方法を紹介します。
目を皿にしてしっかり設定したにも関わらずくっっっそハマりました。
その理由と解決方法までわかりましたのでその辺りも書いていきます。
リファレンス
- Firebase ドキュメント
- Firebase UI ドキュメント
I. 🔥Firebaseプロジェクトの設定
-
Authentication
→ログイン方法
からメール/パスワード
を選択し、メールリンク
を有効にします。
- (カスタムドメインを設定する場合)
Hosting
→カスタムドメインを追加
から指示に従ってください。- 設定し終わってもしばらく時間がかかります。(30分くらい?)
設定が必要です
→証明書を作成しています
→接続されました
と変化していきます。
- 設定し終わってもしばらく時間がかかります。(30分くらい?)
-
Dynamic Links
を追加します。URL接頭辞の追加
では、ドメイン欄に何か文字を入れるとxxx.page.link
のようなURLが提案されるのでそれを選択します。(もしくは先ほど設定したカスタムドメインを設定します) -
Dynamic Links
に設定したドメインをホワイトリストに追加します。
Authentication
→設定
→承認済みドメイン
→ドメインの追加
から先ほど作成したドメインを追加してください。
- Appleアプリを構成している場合は
Dynamic Links
を機能させるためにApple Store ID
とチームID
を設定します。
プロジェクトの設定
→全般
→マイアプリ
→Apple アプリ
から設定します。
II. 🎯Flutterプロジェクトの設定
a. 依存関係のインストール
b. iOSの設定
- Xcode → TARGETS下の
Runner
→Signing & Capabilities
→+ Capability
からAssociated Domains
を追加し、Domains
に以下を追加します。applinks:xxx.page.link
- 引き続きその画面で
Info
タブを開き、URL Types
を追加します。
URL Scheme
を$(PRODUCT_BUNDLE_IDENTIFIER)
を設定します。(Identifier
は自由です)
- カスタムドメインを設定している場合は
Info.plist
に以下を追加します。<key>FirebaseDynamicLinksCustomDomains</key> <array> <string>https://your.custom.domain</string> </array>
c. Androidの設定
android/app/src/main/AndroidManifest.xmlを設定します
<manifest ...>
<application ...>
<activity ...>
<meta-data ...>
<intent-filter>
...
</intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data
+ android:host="xxx.page.link"
+ android:scheme="https"/>
+ </intent-filter>
</activity>
</application>
...
</manifest>
III. 🎯Flutterの実装
SignInScreen(
providers: [
EmailLinkAuthProvider(
actionCodeSettings: ActionCodeSettings(
url: 'https://xxx.page.link',
dynamicLinkDomain: 'xxx.page.link',
handleCodeInApp: true,
iOSBundleId: 'com.example.ios',
androidPackageName: 'com.example.android',
androidMinimumVersion: '0',
androidInstallApp: true,
),
),
],
);
ActionCodeSettings
の引数について詳しくはこちら
IV. 終わり🎉
お疲れ様でした!
メールの送信アドレスをカスタマイズしたい場合はこちらを参考にしてください。
メールリンクのテンプレートはなぜか提供されていないので、メール内容や送信者名を変更することはできませんが、どのテンプレートでもいいので送信元を1つ変えると全部それになります。
FlutterWebでのメールリンク認証についても書きました↓
トラブルシュート
Exceeded daily quota for email sign-in.
上限に達するほどやってない気がしたんですが、仕方ないのでBlazeプランに変更して回避しました。
リンクがアプリで開かない(iOS)
- iOSでユニバーサルリンクが機能するには以下の条件が整っている必要があります
-
https://<your-domain>/apple-app-site-association
に正しい内容がある -
apple-app-site-association
ファイルの設定と一致するアプリがインストールされている - この辺をやってくれるのがDynamic Linksです。
-
- そしてiOSはその
apple-app-site-association
ファイルを、あなたのドメインからではなくAppleのCDNから取得します。つまりCDNに反映されるまで、ユニバーサルリンクは機能しません。 (最大24時間程度かかるらしいです) - デベロッパーのために回避する方法があります。
- デバッグに使っているiOS端末のデベロッパーモードを有効にします。
-
ユニバーサルリンク
カテゴリの関連ドメインの開発
が有効になっていることを確認します。
- Xcodeで
Associated Domains
で設定したものに?mode=developer
を追加します。applinks:xxx.page.link?mode=developer
- これで出来るはず
CDNに反映されたあとはmode戻した方が良いんですかね?
救世主な元記事様
リンクがアプリで開かない(Android)
私はまだ直面していませんが、見かけたので貼っておきます。
Discussion