Cómo convertir o asignar fácilmente un observable a un sujeto de comportamiento, para que otro componente pueda compartirlo

Soy nuevo en la programación de estilo Observable. Tengo una pregunta: quiero compartir información de usuario en la aplicación entre componentes, y uso BehaviorSubject para compartir esta información. Esto se inspira al compartir BehaviorSubject como AuthInfo. Si puedo compartir AuthInfo que contiene un uid en el componente de mi aplicación, ¿por qué puedo usarlo para compartir mis datos de objeto de usuario?

El problema es que, el objeto de usuario, lo obtengo de Firebase. Por lo tanto, es un observable, y no tengo idea de cómo puedo asignar esto a un sujeto de comportamiento. Así que aquí está el código que intenté:

  @Injectable()
  export class AuthService {

  static UNKNOWN_USER = new AuthInfo(null);

  static EMPTY_USER = new User(null, null, null, null);

  authInfo$: BehaviorSubject<AuthInfo> = new BehaviorSubject<AuthInfo>(AuthService.UNKNOWN_USER);

  userInfo$: BehaviorSubject<User> = new BehaviorSubject<User>(AuthService.EMPTY_USER);

  constructor(private auth: FirebaseAuth, private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {

//firebase way to see if user is login or not
this.auth.subscribe(user => {
  if (user) {
    const authInfo = new AuthInfo(user.uid);
    this.authInfo$.next(authInfo);
    //This is the part I do not know how to do
    [OPTION 1]: this.userInfo$.next(findUserByuid(user.uid)) ?? - error
    [OPTION 2]: this.userInfo$ = findUserByuid(user.uid) ?? - userInfo$ turn into an observerable, which when I logout to call this.userInfo$.next(AuthService.EMPTY_USER) it will  throw error as .next() is not a function.
    [OPTION 3]:
    this.findUserByuid(user.uid).subscribe(user => {
      this.userInfo$.next(user);
    });
    ---- Can I put a subscribe inside of another subscribe to chain it like promise? I am not sure this is following the best practices. But this is the only option that there is no error. But just not sure I am doing it right. I do get the user object no problem

  }
  else {
    this.authInfo$.next(AuthService.UNKNOWN_USER);
  }
});


}

findUserByuid(uid:string):any {
   //return a firebase object observerable
   return this.db.object('userProfile/' + uid).map(user => User.fromJson(user));

}

logout() {

this.userInfo$.next(AuthService.EMPTY_USER);
this.authInfo$.next(AuthService.UNKNOWN_USER);
this.auth.logout();
}

Y la pregunta más importante, ¿debería compartir datos entre aplicaciones usando el tema de comportamiento? ¿O debería usar observable como usuario $ = findUserByuid (uid) y hacer que el usuario $ sea la variable miembro AuthService. ¿Y luego otros componentes se suscriben al usuario $?

Estoy muy confundido sobre las mejores formas de compartir datos a través de Angular2 SIN usar un servicio ficticio como en el antiguo Angular 1. Vi a ppl usando Behavior Subject para compartir el estado de autenticación, por eso tengo todas estas preguntas e implementación. ¡Cualquier ayuda será apreciada! No hay muchos recursos por ahí con respecto al tema de comportamiento.

[ACTUALIZACIÓN]: la razón por la que elijo el tema de comportamiento en lugar de simplemente observable para pasar datos entre diferentes partes de mi aplicación:Comportamiento Sujeto VS Observable regular

Respuestas a la pregunta(2)

Su respuesta a la pregunta