У firebaseUI нет опции «держать меня в системе»? - PullRequest
0 голосов
/ 17 марта 2020

Реализация firebaseUI в Angular, мне не хватает поддержки опции «держать меня в системе».

Я понимаю, что firebaseUI возобновляет поток «регистрации» и «входа в систему», объединяя эти два шага в один (https://github.com/firebase/firebaseui-web/issues/665#issuecomment -596197657 ). Однако я не могу найти оправдания для того, чтобы не предлагать пользователю вариант безопасности выбора правильной аутентификации (https://firebase.google.com/docs/auth/web/auth-state-persistence). firebaseUI- angular частично документирует firebaseui.disableAutoSignIn (), но это не переключатель, а только односторонняя опция (https://github.com/RaphaelJenni/FirebaseUI-Angular#disable -autosign ).

Итак, что мне здесь не хватает? Как пользователь должен защищать свои данные, если он посещает свою учетную запись на устройстве publi c, когда постоянная аутентификация неявно установлена ​​на LOCAL?

UPDATE

Через пару раундов я получил в опцию «держать меня в системе» - но только при использовании входа в Google, а не при использовании входа через электронную почту / ссылку.

Основная проблема электронной почты / ссылки заключается в том, что ссылка / URL-адрес отправлены по электронной почте. аутентифицируется в новой вкладке браузера, и во время этого он сильно затрудняет сохранение подлинности. Отправленная по электронной почте ссылка / URL-адрес переходит на firebaseapp.com, который аутентифицирует и перенаправляет приложение Angular. Итак, как передать выбор персистентности пользователя в этом потоке?

Песочница firebaseUI-web + Angular очень быстро настраивается:

  1. Blank Angular project
  2. npm i firebase @ angular / fire firebaseui --save
  3. firebaseConfig установлен в environment.ts
  4. ниже кода

app.module .ts:

import {AngularFireModule} from '@angular/fire';
import {AngularFireAuthModule} from '@angular/fire/auth';
import {environment} from 'src/environments/environment';
...
@NgModule({ ...
    imports: [ ...
        AngularFireModule.initializeApp(environment.firebaseConfig),
        AngularFireAuthModule,
    ...

app.component.ts:

import { Component, OnInit } from '@angular/core';
import { AngularFireAuth } from '@angular/fire/auth';
import * as firebase from 'firebase/app';
import * as firebaseui from 'firebaseui';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

    ui: firebaseui.auth.AuthUI; // firebaseUI reference
    uiLinkUrl = false;
    keepSignin = false;

    constructor(public afAuth: AngularFireAuth) {}

    ngOnInit() {
        this.ui = new firebaseui.auth.AuthUI(firebase.auth());

        if (this.ui.isPendingRedirect()) {
            this.uiLinkUrl = true;
        }

        this.afAuth.authState.subscribe((response) => {
            if (response) {
                // update html element if not routing.
                this.showFirebaseUI(); 
            } else {
                // only update persistence if signed out, and not reroute.
                if (!this.uiLinkUrl) {
                    this.afAuth.auth.setPersistence(this.keepSignin ? 
                        firebase.auth.Auth.Persistence.LOCAL : 
                        firebase.auth.Auth.Persistence.SESSION);
                }
                this.uiLinkUrl = false;
                this.showFirebaseUI();
            }
        });
    }

    toggleKeepSignin() {
        this.keepSignin = !this.keepSignin;
        this.afAuth.auth.setPersistence(this.keepSignin ? 
            firebase.auth.Auth.Persistence.LOCAL : 
            firebase.auth.Auth.Persistence.SESSION);
    }

    showFirebaseUI() {
        // The start method will wait until the DOM is loaded.
        this.ui.start('#firebaseui-auth-container', {
            callbacks: {
                uiShown: function () {
                    document.getElementById('loader').style.display = 'none';
                },
                signInSuccessWithAuthResult: function (authResult, redirectUrl) {
                    return false;
                },
            },
            credentialHelper: firebaseui.auth.CredentialHelper.NONE,
            signInFlow: 'popup',
            signInOptions: [
                { provider: firebase.auth.GoogleAuthProvider.PROVIDER_ID, 
                    customParameters: {prompt: 'select_account'} },
                { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, 
                    signInMethod: firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD },
            ],
        });
    }
}

app.component. html:

<div *ngIf="afAuth.auth.currentUser">
    <h1 style="color:#0a0;">Signed IN</h1>
    <button (click)="afAuth.auth.signOut()">Sign Out</button>
</div>

<div *ngIf="!afAuth.auth.currentUser">
    <h1 style="color:#a00;">Signed OUT</h1>
</div>

<div style="background:#222;" id="firebaseui-auth-container"></div>
<div id="loader">Loading...</div>

<div style="text-align:center;" (click)="toggleKeepSignin()">
    <input type="checkbox" [checked]="keepSignin">Keep me signed in
</div>

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Просто продолжение FirebaseUI, о чем еще нужно подумать, прежде чем переключаться.

В итоге я пробыл 2 недели, пытаясь переключиться на firebaseUI-web. FirebaseUI просто не для всех. Я надеялся перейти от своего существующего собственного кода и сэкономить на обслуживании, но firebaseUI слишком странен и слишком ограничен, когда речь идет о предложении традиционных функций аутентификации. , что не позволяет вам использовать как электронную почту, так и учетную запись Google для входа в систему, если они не используют один и тот же адрес электронной почты. Если электронная почта, с которой вы пытаетесь войти, уже связана с федеративным провайдером, firebaseUI фактически не связывает учетные записи, но вынуждает пользователя использовать федеративную регистрацию. https://github.com/firebase/firebaseui-web/issues/102

FirebasUI-web не имеет отдельной регистрации и входа для электронной почты, что может быть разумно при переходе на электронную почту / ссылку вместо электронной почты / пароля. Однако такой подход многих смущает. https://github.com/firebase/firebaseui-web/issues/665 - https://github.com/firebase/firebaseui-web/issues/499

FirebasUI-web не предлагает requireDisplayName для электронной почты / ссылки, только для электронной почты / пароля, так что вы получите без отображаемое имя.

FirebaseUI-веб-адрес электронной почты / ссылка по своей природе отправляет ссылку аутентификации в почтовый ящик пользователя, и это открывает веб-приложение на новой второй вкладке браузера, что может привести к путанице. FirebaseUI-web-адрес электронной почты / пароль на самом деле не вариант, так как вам нужно обработать подтверждение электронной почты и т. Д. c. вне FirebaseUI. { ссылка }

FirebasUI-web не предлагает способ передачи учетной записи пользователя firebase другому лицу (например, сотрудник покидает фирму). Это потребует от вас кодирования функций связывания и переименования электронной почты самостоятельно. Это стало для меня окончательным условием сделки.

0 голосов
/ 23 марта 2020

Я выяснил, как реализовать firebaseUI с управляемым пользователем постоянством (опция «держать меня в системе»). Решение включает в себя (1) осторожное размещение вызовов auth.setPersistence () и (2) передачу выбора персистентности пользователя в URL-адресе электронной почты / ссылки. Надеюсь, что приведенное ниже описание и пример могут помочь другим с такой же потребностью в оптимальной безопасности аутентификации.

Мне все еще интересно, почему это не является частью firebaseUI, так как управление сценарием ios немного сложнее. На мой взгляд, запоминание аутентификации по умолчанию ставит под угрозу безопасность данных, а аргумент минимизации «трения опыта пользователя» недопустим для этого значения по умолчанию (https://firebase.google.com/docs/auth/web/auth-state-persistence, второй абзац). Постоянная аутентификация firebaseUI ставит под угрозу безопасность данных при входе в систему на устройствах publi c, поскольку требует, чтобы пользователи явно не забывали выходить из системы.

Я настроил приложение Stackblitz, чтобы проиллюстрировать аутентификацию FirebaseUI с постоянством в качестве пользователя -option. https://stackblitz.com/edit/angular-ehm3en.

  1. Чтобы контролировать постоянство для федеративного входа, такого как Google, постоянство обновляется, если authState первоначально вышел из системы. В противном случае постоянство не изменится, чтобы сохранить значение по умолчанию.
  2. Чтобы контролировать постоянство при входе по электронной почте / по ссылке, пользовательский выбор постоянства передается через электронное письмо для входа в качестве параметра URL. (Для правильной проверки необходимо открыть приложение на новой вкладке браузера; для этого с помощью Stackblitz снова откройте ссылку Stackblitz).

PS Относительно дополнительной альтернативы firebaseUI- angular (для angular только для клиентов), я не вижу никакой причины для использования этого потенциально усложняющего дополнительного слоя, так как firebaseUI-web требует того же минимального кода для реализации firebaseUI. Фактически, для firebaseUI- angular может потребоваться переменная настройка firebaseUI. См. App.component.ts для дальнейшей документации и инструкций песочницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...