使用获取getIdTokenResult()的用户数据设置状态

时间:2019-04-17 03:42:09

标签: typescript rxjs firebase-authentication reactive-programming ngrx

我在将对象放入应用程序状态时遇到麻烦。

我需要使用从firebase.useruser.getIdTokenResult(true)返回的数据装入对象。

示例:

userLogged = {
  uid: user.uid, 
  displayName: user.displayName
  admin: false,
};

const token = await user.getIdTokenResult (true);
userLogged.admin = token.claims.admin;

逻辑与上面的逻辑相似,但是我只需要使用Rxjs运算符来执行此操作,这样我就可以在应用程序状态下隔离该对象。

@效果

@Effect()
getUser$: Observable<Action> = this.actions$.pipe(
    ofType(auth.AuthActionTypes.GET_USER),
    switchMap(() => this.authService.getUser().pipe(
        map(user => {

            const userLogged = {
                uid: user.uid,
                displayName: user.displayName,
                admin: false,
            }

            // **** i need call user.getIdTokenResult() ******
            // and get claims.admin and assign to userLogged object admin.

            // authState = {
            //    uid: user.uid,
            //    displayName: user.displayName,
            //    admin: true, // true or false
            // }

            return new auth.Authenticated(userLogged);
        }),
        catchError((err => of(new auth.AuthError(err))))
    )

我仍在使用Rxjs进行反应式编程来适应自己,因此我很难合并封装的Observables数据。

1 个答案:

答案 0 :(得分:0)

您可以使用.map()在您的user结果中“保留” authService.getUser()对象的值。尽管很脏,但它仍然有效。

@Effect()
getUser$: Observable<Action> = this.actions$
    .pipe(
        ofType(auth.AuthActionTypes.GET_USER),
        switchMap(() => this.authService.getUser()),
        switchMap(user => user.getIdTokenResult().pipe(map(claims => ({claims, user}))), //map the user to "retain"
            switchMap(({claims, user}) => {
                const userLogged = {
                    uid: user.uid,
                    displayName: user.displayName,
                    admin: claims.admin,
                };
                return new auth.Authenticated(userLogged);
            }),
            catchError(err => of(new auth.AuthError(err)))))

如果您想重新训练更多的值,建议您考虑一下Subjects,以使其更清洁(以及正确的执行方式)。