используете ли вы конфигурацию SMTP для отправки своей электронной почты? попробуйте вместо этого использовать phpmailer. вы можете загрузить библиотеку из https://github.com/PHPMailer/PHPMailer . Я создал электронную почту, отправив этот путь:
function send_mail($email, $recipient_name, $message='')
{
require("phpmailer/class.phpmailer.php");
$mail = new PHPMailer();
$mail->CharSet="utf-8";
$mail->IsSMTP(); // set mailer to use SMTP
$mail->Host = "mail.example.com"; // specify main and backup server
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = "myusername"; // SMTP username
$mail->Password = "p@ssw0rd"; // SMTP password
$mail->From = "me@walalang.com";
$mail->FromName = "System-Ad";
$mail->AddAddress($email, $recipient_name);
$mail->WordWrap = 50; // set word wrap to 50 characters
$mail->IsHTML(true); // set email format to HTML (true) or plain text (false)
$mail->Subject = "This is a Sampleenter code here Email";
$mail->Body = $message;
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";
$mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
$mail->addAttachment('files/file.xlsx');
if(!$mail->Send())
{
echo "Message could not be sent. ";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "Message has been sent";
}
Если вы используете новую Firebase, теперь это возможно, так как email
доступен в правилах безопасности.
В правилах безопасности вы можете получить доступ как к адресу электронной почты, так и к проверено, что делает возможными некоторые возможные варианты использования. С этими правилами, например, только аутентифицированный, проверенный пользователь Gmail может написать свой профиль:
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true &&
auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
Вы можете ввести эти правила в консоли Firebase Database вашего проекта.
Вот код, отлично работающий с моей базой данных, я установил правило, что только электронные письма моей компании могут читать и записывать данные моей базы данных firebase.
{
"rules": {
".read": "auth.token.email.matches(/.*@yourcompany.com$/)",
".write": "auth.token.email.matches(/.*@yourcompany.com$/)"
}
}
tldr: Я не думаю, что это возможно, без запуска вашего собственного сервера.
Вот моя попытка:
{
"rules": {
".read": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')",
".write": "auth.provider === 'google' && root.child('users').child(auth.uid).child('email').val().endsWith('@foobar.com')",
"users": {
"$user_id": {
".write": "auth.provider === 'google' && $user_id === auth.uid && newData.child('email').val().endsWith('@foobar.com')"
}
}
}
}
Я считаю, что вышеизложенное говорит, что «разрешить людям создавать нового пользователя, если они аутентифицированы Google, пытаются записать в узел базы данных для них ($user_id === auth.uid
), а их адрес электронной почты заканчивается на foobar.com».
Однако была отмечена проблема: любой веб-клиент может легко изменить свою электронную почту (используя консоль dev) до отправки сообщения в Firebase. Таким образом, мы не можем доверять данным пользовательской записи при их хранении в Firebase.
Я думаю, что единственное, на что мы можем действительно доверять, - это объект auth
в правилах. Этот объект auth
заполняется бэкэндом Firebase. И, к сожалению, объект auth
не включает адрес электронной почты.
Для записи я вставляю своего пользователя таким образом:
function authDataCallback(authData) {
if (authData) {
console.log("User " + authData.uid + " is logged in with " + authData.provider + " and has displayName " + authData.google.displayName);
// save the user's profile into the database so we can list users,
// use them in Security and Firebase Rules, and show profiles
ref.child("users").child(authData.uid).set({
provider: authData.provider,
name: getName(authData),
email: authData.google.email
});
Как вы могли бы для представления, определенный пользователь мог бы перезаписать здесь значение email
(например, с помощью DevTools).
.write
правила могут контролировать, кто может писать в местоположение, а правила .validate
могут подтвердить, что то, что они пишут, является допустимым адресом электронной почты. Но в правилах безопасности нет возможности проверить, что на самом деле это адрес электронной почты пользователя. Для этого вам нужно будет запустить доверенный код (обычно на сервере), который будет записывать этот подтвержденный адрес электронной почты в (в противном случае доступ только для чтения) в базе данных.
– Frank van Puffelen
30 April 2016 в 03:35
Код, который работает для меня.
export class AuthenticationService {
user: Observable<firebase.User>;
constructor(public afAuth: AngularFireAuth) {
this.user = afAuth.authState;
}
login(){
var provider = new firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({'hd': '<your domain>'});
this.afAuth.auth.signInWithPopup(provider)
.then(response => {
let token = response.credential.accessToken;
//Your code. Token is now available.
})
}
}
auth.token
. – Tim Roes 14 August 2016 в 08:23@gmail.com
из корня в базе данных, например,my_database/acceptable_domains/
в случае, например, они только хотели открыть свое приложение до нескольких поставщиков электронной почты. Такие, как уполномоченные школы и предприятия. – Hobbyist 24 August 2016 в 06:11abc
использует почтовые службы gmail, поэтому любой пользовательgood@abc.com
может зарегистрироваться, я использую gmail OAuth firestore для Android. – Asif Mushtaq 23 April 2018 в 17:23