Невозможно запретить пользователям читать / записывать в firebase до момента проверки электронной почты [дубликат]

используете ли вы конфигурацию 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"; }

19
задан Frank van Puffelen 30 April 2016 в 03:37
поделиться

4 ответа

Если вы используете новую Firebase, теперь это возможно, так как email доступен в правилах безопасности.

В правилах безопасности вы можете получить доступ как к адресу электронной почты, так и к проверено, что делает возможными некоторые возможные варианты использования. С этими правилами, например, только аутентифицированный, проверенный пользователь Gmail может написать свой профиль:

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && 
                   auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

Вы можете ввести эти правила в консоли Firebase Database вашего проекта.

36
ответ дан Frank van Puffelen 22 August 2018 в 10:13
поделиться
  • 1
    Большое спасибо за обновление! – Seth Ladd 8 July 2016 в 22:44
  • 2
    firebase.google.com/docs/reference/security/database/#authtoken содержит документацию, доступную в auth.token. – Tim Roes 14 August 2016 в 08:23
  • 3
    Было бы здорово увидеть пример этого, который вытащил @gmail.com из корня в базе данных, например, my_database/acceptable_domains/ в случае, например, они только хотели открыть свое приложение до нескольких поставщиков электронной почты. Такие, как уполномоченные школы и предприятия. – Hobbyist 24 August 2016 в 06:11
  • 4
    Есть ли альтернатива, которая не требует жесткого кодирования для каждого домена - например, «gmailUsers» ?? – skunkwerk 20 June 2017 в 20:01
  • 5
    как ограничить домен gmail, который может зарегистрировать только конкретный пользователь домена. Как моя компания abc использует почтовые службы gmail, поэтому любой пользователь good@abc.com может зарегистрироваться, я использую gmail OAuth firestore для Android. – Asif Mushtaq 23 April 2018 в 17:23

Вот код, отлично работающий с моей базой данных, я установил правило, что только электронные письма моей компании могут читать и записывать данные моей базы данных firebase.

{
  "rules": {
    ".read": "auth.token.email.matches(/.*@yourcompany.com$/)",


        ".write": "auth.token.email.matches(/.*@yourcompany.com$/)"
      }
    }
1
ответ дан Rishi 22 August 2018 в 10:13
поделиться

ВНИМАНИЕ: не доверяйте этому ответу.

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).

2
ответ дан Seth Ladd 22 August 2018 в 10:13
поделиться
  • 1
    Как вы действительно обнаружили: .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.
        })
    }
}
0
ответ дан Shirish 22 August 2018 в 10:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: