Angular Firebase auth, как проверить, вошел ли пользователь в систему, чтобы скрыть ссылку входа в систему от навигации? - PullRequest
0 голосов
/ 07 декабря 2018

Я реализовал регистрацию и вход в систему электронной почты и пароля в угловой пожарной базе, но теперь я хочу проверить в своем шаблоне навигации состояние пользователя, если пользователь вошел в систему, затем скрыть кнопку входа, а также скрыть регистр.кнопка.Я попробовал поискать учебники по этому вопросу и обнаружил, что должен использовать AuthService и AuthInfo, как вы можете видеть здесь:

https://github.com/angular-university/angular-firebase-app/blob/master/src/app/shared/security/auth.service.ts

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

Вот мой код сейчас:

навигация -

<ul class="nav navbar-nav">
    <li><a routerLink="" routerLinkActive="active">Home</a></li>
    <li><a routerLink="login" routerLinkActive="active" *ngIf="!authInfo?.isLoggedIn()">Login</a></li>
    <li><a routerLink="register" routerLinkActive="active" *ngIf="!authInfo?.isLoggedIn()">Register</a></li>
    <li><a routerLink="quiz" routerLinkActive="active">Quiz</a></li>
</ul>

Мой Служба аутентификации файл со всеми пользователями, создающими и входящими в логику firebase -

@Injectable({
    providedIn: 'root'
})
export class AuthService {
    private user: Observable<firebase.User>;
    constructor(private _firebaseAuth: AngularFireAuth, private router: Router) {
        this.user = _firebaseAuth.authState;

        this.user.subscribe(
            (user) => {
                if (user) {
                    this.userDetails = user;

                    console.log(this.userDetails);
                } else {
                    this.userDetails = null;
                }
            }
        );
    }

    logUserIn(email, pass) {
        firebase.auth().signInWithEmailAndPassword(email, pass).catch(function (error) {
            // Handle Errors here.
            var errorCode = error.code;
            var errorMessage = error.message;
            console.log("error" + error);
        })

        if (this.userDetails) {
            email = this.userDetails.email;
            console.log("hello im user" + " " + email);

        } else {
            console.log("not working");
        }

        this.router.navigate(['']);
    }

    regUser(email, pass) {
        firebase.auth().createUserWithEmailAndPassword(email, pass)
            .catch(function (error) {
                // Handle Errors here.
                var errorCode = error.code;
                var errorMessage = error.message;

            });
    }
}

Компонент входа -

@Component({
    selector: 'login',
    templateUrl: 'login.component.html'
})
export class LoginComponent {

    form: FormGroup;

    constructor(fb: FormBuilder, private _loginService: LoginService, private auth: AuthService) {

        this.form = fb.group({
            email: ['', Validators.required],
            password: ['', Validators.compose([Validators.required,
            PasswordValidator.cannotContainSpace])]
        })

    }

    login() {
        this.auth.logUserIn(this.form.value.email, this.form.value.password);
    };
}

auth-info.ts файл по ссылке выше на github -

export class AuthInfo {

    constructor(public $uid: string) { }

    isLoggedIn() {
        return !!this.$uid;
    }
}

РЕДАКТИРОВАТЬ:

Так что благодаря Тушару Вальзаде мне удалось показать и скрыть эти кнопки, но я получаю действительно странное поведение.При выходе из системы проблем нет, но когда я вхожу, ничего не происходит, я получаю сообщение not working на консоль Chrome, которое приходит из моего метода logUserIn в сервисе аутентификации.Но когда я обновляю страницу один раз, то это показывает, что она работает, я получаю информацию о пользователе в консоли, а кнопки скрываются.Я не знаю, почему это происходит, но я думаю, что это может быть что-то с sessionStorage, о котором я ничего не знаю.

Вот код:

Authсервис

export class AuthService {
  private user: Observable<firebase.User>;
  private userDetails: firebase.User = null;
  public loggedIn = false;



  constructor(private _firebaseAuth: AngularFireAuth, private router: Router) {
    this.user = _firebaseAuth.authState;
    this.loggedIn = !!sessionStorage.getItem('user');

    this.user.subscribe(
        (user) => {
          if (user) {
            this.userDetails = user;

            console.log(this.userDetails);
          } else {
            this.userDetails = null;
          }
        }
      );
  }

  // Set current user in your session after a successful login
    setCurrentUser(email: string): void {
        sessionStorage.setItem('user', email);
        this.loggedIn = true;
    }

    // Get currently logged in user from session
    getCurrentUser(): string | any {
        return sessionStorage.getItem('user') || undefined;
    }

    isLoggedIn() {
    return this.loggedIn;
    }

  logUserIn(email, pass) {
    firebase.auth().signInWithEmailAndPassword(email, pass).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
console.log("error" + error);
})
//var user = firebase.auth().currentUser;
//var email;
if (this.userDetails) {
email = this.userDetails.email;
console.log("hello im user" + " " + email);
//email = user.email;
this.setCurrentUser(email);
 this.loggedIn = true;
} else {
console.log("not working");
}

this.router.navigate(['']);
}

  regUser(email, pass) {
    firebase.auth().createUserWithEmailAndPassword(email, pass)
 .catch(function(error) {
   // Handle Errors here.
   var errorCode = error.code;
   var errorMessage = error.message;
   // ...
 });
//console.log(this.form.controls['email'].value);
    }

    logOut() {
      this.loggedIn = false;
      firebase.auth().signOut().then(function() {
        // Sign-out successful.
        console.log("signout successful");
    }).catch(function(error) {
        // An error happened.
        console.log("error happened");
      });
    }

  }

Компонент входа

класс экспорта LoginComponent {

form: FormGroup;

constructor(fb: FormBuilder, private _loginService: LoginService, private auth: AuthService){

    this.form = fb.group({
        email:['',Validators.required ],
  password:['',Validators.compose([Validators.required,

PasswordValidator.cannotContainSpace])]})

}

login(){
      this.auth.logUserIn(this.form.value.email, this.form.value.password);

};

}

app.component.ts , потому что у меня есть розетка маршрутизатора и ссылкив app.component.html

export class AppComponent {

  title = 'angular-draganddrop';
  constructor(private auth: AuthService) { }
  LoggedIn() {
      return this.auth.isLoggedIn();
  }
  logout() {
    return this.auth.logOut();
  }
}

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ:

Итак, япроверил хранилище сессии приложения в Chrome, и когда я выхожу из системы, я действительно вижу свою электронную почту пользователя, которая все еще там.Я должен удалить это вручную.Затем при попытке входа в систему в первый раз это не работает, и в хранилище сеанса также нет электронной почты пользователя.Во второй раз это добавляется.Система входа в систему работала нормально до добавления функциональности sessionStorage в код, так что она определенно связана с этим.Я не знаю, как работает sessionStorage, поэтому я ищу помощь, чтобы решить эту проблему.

1 Ответ

0 голосов
/ 07 декабря 2018

Вам нужно будет использовать сеанс, чтобы вы могли проверить его с учетом обновления страницы.

Просто установите и используйте свойство для loggedIn следующим образом в вашем сервисе AuthService -

public loggedIn = false;

constructor(private _firebaseAuth: AngularFireAuth, private router: Router) {
    this.loggedIn = !!sessionStorage.getItem('user');
}

// Set current user in your session after a successful login
setCurrentUser(email: String): void {
    sessionStorage.setItem('user', email);
    this.loggedIn = true;
}

// Get currently logged in user from session
getCurrentUser(): string | any {
    return sessionStorage.getItem('user') || undefined;
}

// Clear the session for current user & log the user out
logout() {
    sessionStorage.removeItem('user');
    this.loggedIn = false;
    // ... other code for logout
}

// The method to check whether user is logged in or not
isLoggedIn() {
    return this.loggedIn;
}

Итак, ваш обновленный logUserIn метод будет -

logUserIn(email, pass) {
    firebase.auth().signInWithEmailAndPassword(email, pass).catch(function (error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        console.log("error" + error);
    })

    if (this.userDetails) {
        email = this.userDetails.email;
        console.log("hello im user" + " " + email);
        // setting user in session here --->
        this.setCurrentUser(email);
    } else {
        console.log("not working");
    }

    this.router.navigate(['']);
}

И при выходе из системы просто наберите logout(), как показано выше.

Затем просто добавьте его к своему HTML as -

<li><a routerLink="login" routerLinkActive="active" *ngIf="!auth.isLoggedIn()">Login</a></li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...