Open AdditionAddict opened 2 years ago
This issue does not seem to follow the issue template. Make sure you provide all the required information.
Hey! Can you provide a repo or stackblitz that showcases this?
Confirming this is still an issue with v9.4. Since the error is swallowed, this had me spinning wheels for half a day before discovering this thread. Thank you @AdditionAddict
In my case, I have my pipe defined as a static class function rather than as a const:
export class AppAuthGuard extends AngularFireAuthGuard {
static hasPermissionPipe(role?: string): AuthPipe {
return pipe(
switchMap((user: firebase.User | null) => (user ? user.getIdTokenResult() : of(null))),
map(result =>
result
? // If signed in, check the user's role claim
!role || result.claims['role'] === role || ['forbidden']
: // Otherwise navigate to the sign-in page
['sign-in'],
),
);
}
static hasPermissionGenerator(role?: string): AuthPipeGenerator {
return () => AppAuthGuard.hasPermissionPipe(role);
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> {
return this.canActivate(route, state);
}
}
With the routes below, navigating to /administration
and child paths works fine, whereas /crud
does not. Stepping past a breakpoint in auth-guard.ts, I see the same TypeError: Unable to lift unknown Observable type
.
const routes: Routes = [
{
path: 'administration',
data: { authGuardPipe: AppAuthGuard.hasPermissionGenerator('admin') },
canActivate: [AppAuthGuard],
canActivateChild: [AppAuthGuard],
loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
},
{
path: 'crud',
data: { authGuardPipe: AppAuthGuard.hasPermissionPipe('admin') },
canActivate: [AppAuthGuard],
canActivateChild: [AppAuthGuard],
loadChildren: () => import('./crud/crud.module').then(m => m.CrudModule),
},
{
path: '',
loadChildren: () => import('./main/main.module').then(m => m.MainModule),
},
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
})
export class AppRoutingModule {}
did you find a solution for this?
@rubenheymans opening post has "correct" answer, issue details unexpected usage
// changing this
const adminGuard = pipe(
customClaims,
map((claims) => claims.role === 'admin' || ['login'])
);
// to this, fixes the issue for me
const adminGuard = () =>
pipe(
customClaims,
map((claims) => claims.role === 'admin' || ['login'])
);
Version info
Angular: 14
Firebase: 9
AngularFire: ^7.4.1
Other (e.g. Ionic/Cordova, Node, browser, operating system): Node, Firefox/Chrome, Windows
How to reproduce these conditions
I've created stackoverflow Q&A of the issue https://stackoverflow.com/questions/73799781/how-to-create-auth-guard-in-angular-fire-v9-with-new-api-not-compat I believe this is a bug and not a documentation issue given the naming of
authGuardPipe
When using guard below and navigating to a guarded feature as a user with email not verified (used emulators) this throws the error
TypeError: Unable to lift unknown Observable type
triggered by https://github.com/angular/angularfire/blame/master/src/auth-guard/auth-guard.ts#L21Replacing
redirectUnauthorizedAndUnverifiedToAuth
indata : { authGuardPipe: redirectUnauthorizedAndUnverifiedToAuth }
withauthPipeGenerator
fixesFailing test unit, Stackblitz demonstrating the problem
Can't produce stackblitz due to error https://github.com/stackblitz/core/issues/2039
Steps to set up and reproduce
Created basic auth & my-feature modules, v9 new API angular imports
app-routing.module.ts
Expected behavior
if you provide pipe this should work esp. given the name
authGuardPipe
Actual behavior
Error
TypeError: Unable to lift unknown Observable type