我在 Angular 8 中使用 Firebase 在前端和后端对用户进行身份验证。为了在后端对用户进行身份验证,我需要发送用户 ID 令牌。
我正在使用 firebase getIdToken 来获取令牌,它可以部分工作。刷新页面时出现错误“TypeError: Cannot read property 'getIdToken' of null”。
我尝试将令牌硬编码到 getToken() 方法中,即使在刷新时它也能工作,但这是不可行的,所以我使 getToken 方法返回 Observable。
该可观察量在 Http 拦截器 TokenInterceptorService 中获取,以将令牌添加到所有请求中。
export class AuthService {
constructor(
public afs: AngularFirestore, // Inject Firestore service
public afAuth: AngularFireAuth, // Inject Firebase auth service
public router: Router,
public ngZone: NgZone // NgZone service to remove outside scope warning
) {}
// Other authentication methods for sign up etc.
// removed here for readability
getToken(): Observable<string> {
// getIdToken() returns promise so using 'from' to
// convert it to an Observable
const result = from(this.afAuth.auth.currentUser.getIdToken()
.then( token => {
console.log(token);
return token;
})
);
return result;
}
}
export class TokenInterceptorService implements HttpInterceptor {
constructor(private authService: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.authService.getToken()
.pipe(
switchMap(token => {
const newRequest = request.clone({
setHeaders: {Authorization: `JWT ${token}`}
});
return next.handle(newRequest);
})
);
}
}
我见过类似的问题我正在使用该解决方案并进行一些修改。
我什至尝试从 getToken() 方法返回承诺,但这也不起作用。