質問はそれをすべて言います。 Firebaseでは、ユーザーがアカウントを作成したときにメールを確認する方法、またはメールでパスワードをリセットする方法を教えてください。
もっと広く尋ねることができます:Firebaseからメールを送信する方法はありますか?例えば。これは、通常クライアント側で行うようなことではありません。
これは、Firebaseの外部で行う必要があります。ユーザーを/ users /に保存し、それらのステータス(PENDING、ACTIVE、DELETED)を保持します。 PENDINGステータスのユーザーを監視し、確認メールを送信する小さなサービスがあります。ユーザーステータスをACTIVEに更新するために作成したWebサービスへのリンクがあります。
更新
これは、電子メール検証を処理するための非常に安全な方法ではなかったことに注意してください。Firebaseは現在電子メール検証をサポートしているため、代わりに使用する必要があります。
元の回答
パスワードリセット機能を使用してメールの確認を解決しました。
アカウントの作成時に、ユーザーに一時的な(ランダムに生成された)パスワードを与えます。次に、パスワードのリセットをトリガーし、リンクが記載されたユーザーにメールを送信します。このリンクにより、ユーザーは新しいパスワードを設定できます。
ランダムパスワードを生成するには、次のようなコードを使用できます。
function () {
var possibleChars = ['abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?_-'];
var password = '';
for(var i = 0; i < 16; i += 1) {
password += possibleChars[Math.floor(Math.random() * possibleChars.length)];
}
return password;
}
これはクライアントで発生しているため、悪意のあるユーザーがロジックを改ざんする可能性があることに注意してください。
[Firebaseのエンジニア-更新2014-01-27]
Firebase Simple Loginは、電子メール/パスワード認証のパスワードリセットをサポートするようになりました。
Simple Loginクライアントライブラリのそれぞれには、指定されたメールアドレスのパスワードリセットメールを生成するための新しいメソッドが提供されています-WebおよびAndroidではsendPasswordResetEmail()
、iOSではsendPasswordResetForEmail()
。
この電子メールには、ユーザーがアカウントにログインして資格情報を更新するために使用できる一時トークンが含まれます。このトークンは、24時間後、またはユーザーがパスワードを変更したときのいずれか早い方で期限切れになります。
また、Firebase Simple Loginを使用すると、メールテンプレートと送信アドレス(有料アカウントのドメインからのホワイトラベルメールを含む)を完全に構成できることに注意してください。
この機能にアクセスするには、クライアントライブラリをv1.2.0
以上のバージョンに更新する必要があります。最新バージョンを入手するには、 https://www.firebase.com/docs/downloads.html をご覧ください。
また、最新のFirebase Simple Login-Web Clientのドキュメントについて https://www.firebase.com/docs/security/simple-login-email-password.html も確認してください。
2016年7月の時点では、リセットリンクなどを使用する必要がない場合があります。 sendEmailVerification()
およびapplyActionCode
関数を使用するだけです。
要するに、AngularJSでの基本的なアプローチは次のとおりです。
// thecontroller.js
$scope.sendVerifyEmail = function() {
console.log('Email sent, whaaaaam!');
currentAuth.sendEmailVerification();
}
// where currentAuth came from something like this:
// routerconfig
....
templateUrl: 'bla.html',
resolve: {
currentAuth:['Auth', function(Auth) {
return Auth.$requireSignIn() // this throws an AUTH_REQUIRED broadcast
}]
}
...
// intercept the broadcast like so if you want:
....
$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
if (error === "AUTH_REQUIRED") {
$state.go('login', { toWhere: toState });
}
});
....
// So user receives the email. How do you process the `oobCode` that returns?
// You may do something like this:
// catch the url with its mode and oobCode
.state('emailVerify', {
url: '/verify-email?mode&oobCode',
templateUrl: 'auth/verify-email.html',
controller: 'emailVerifyController',
resolve: {
currentAuth:['Auth', function(Auth) {
return Auth.$requireSignIn()
}]
}
})
// Then digest like so where each term is what they sound like:
.controller('emailVerifyController', ['$scope', '$stateParams', 'currentAuth', 'DatabaseRef',
function($scope, $stateParams, currentAuth, DatabaseRef) {
console.log(currentAuth);
$scope.doVerify = function() {
firebase.auth()
.applyActionCode($stateParams.oobCode)
.then(function(data) {
// change emailVerified for logged in User
console.log('Verification happened');
})
.catch(function(error) {
$scope.error = error.message;
console.log(error.message, error.reason)
})
};
}
])
また、上記のアプローチでは、ユーザーデータ領域にユーザーのメールの検証を保持する必要はないと思います。 applyActionCode
は、emailVerified
をtrue
からfalse
に変更します。
ユーザーがローカルアカウントでサインインする場合、電子メールの確認は重要です。ただし、多くのソーシャル認証では、着信emailVerified
はすでにtrue
になります。
詳細については、記事で説明します Firebase 3.0 SDKでのメール検証
この問題を回避するために行ったのは、firebaseのAPIが組み込まれているZapierを使用することでした。追加された子要素の場所を確認します。次に、新しいノードのデータからメールアドレスと検証URLを取得し、それらを転送します。 URLはmy angular appを指し、ユーザーのメールを確認済みに設定します。
Firebaseでアプリファイルをホストするので、バックグラウンドでポーリングを行うサーバーやプロセスの世話をする必要はありません。
遅延はありますが、メールを確認する前にユーザーをブロックしないので問題ありません。 Zapierには無料利用枠があります。トラフィックがあまりないので、当面は適切な回避策です。
新しいFirebase SDK v3は、メールアドレスの確認をサポートしているようです。 here (リンクに独自のプロジェクトIDを入力)を参照してください。ただし、まだ文書化されていないようです。
SO here について質問しました
そこにある@SamQuayleの回答を参照してください この公式ドキュメントへのリンク 。
新しいアカウントを作成した後、次のコードを使用してメールの確認を確認しました。
let firAuth = FIRAuth.auth()
firAuth?.addAuthStateDidChangeListener { auth, user in
if let loggedUser = user {
if loggedUser.emailVerified == false {
loggedUser.sendEmailVerificationWithCompletion({ (error) in
print("error:\(error)")
})
}
else {
print(loggedUser.email)
}
} else {
// No user is signed in.
print("No user is signed in.")
}
}