我的Angular应用程序中有一个实时数据库,正在使用Firebase。我正在尝试在请求中获取带有参数作为参数附加的令牌的数据,如Firebase docs for RestAPI所示。
但是,当我将令牌附加到数据时,我会收到401 error
"could not parse auth token"
的回信。
我在代码内部和外部尝试了此请求,只是得到了相同的结果。
身份验证令牌直接来自AngularFireAuth
,该令牌是在注册时在我的AuthService
中创建的:
activeUser = new BehaviorSubject<User>(null);
...
signup(email: string, password: string, name: string) {
return this.firebaseAuth.auth
.createUserWithEmailAndPassword(email, password)
.then(res => {
res.user.updateProfile({
displayName: name
});
this.handleAuthentication(
res.user.email,
res.user.uid,
res.user.displayName,
res.user.refreshToken
);
return res;
});
}
handleAuthentication(
email: string,
uid: string,
displayName: string,
token: string
) {
const user = new User(email, uid, displayName, token);
this.activeUser.next(user);
}
...
因此,我要使用AngularFireAuth创建用户,然后在.next
的{{1}}上使用BehaviorSubject
,以便向用户添加电子邮件,uid,令牌和显示名称。然后在activeUser
函数中使用此令牌从数据库中获取数据。
我当前的代码是:
fetchWorkouts()
我也尝试过:
fetchWorkouts() {
return this.authService.activeUser.pipe(
take(1),
exhaustMap(activeUser => {
return this.http.get<Workout[]>(
"https://velo-coach-app.firebaseio.com/workouts.json?auth=" + activeUser.token
);
}),
...
}
我还尝试过将整个令牌放入浏览器:
fetchWorkouts() {
return this.authService.activeUser.pipe(
take(1),
exhaustMap(activeUser => {
return this.http.get<Workout[]>(
"https://velo-coach-app.firebaseio.com/workouts.json",
{
params: new HttpParams().set('auth', activeUser.token)
}
);
);
}),
...
}
。所有这些都会导致相同的问题:https://myapp.firebase.io/workouts.json?auth=MYTOKEN
当我发送Firebase请求以使用诸如{ "error" : "Could not parse auth token." }
之类的请求来恢复某些锻炼时,无论我如何发送请求,它似乎总是会返回相同的错误。
我的实时数据库规则如下:
https://myapp.firebase.io/workouts.json?auth=MYTOKEN
如果我将这些规则更改为:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
并完全删除我的http请求中的令牌,然后就可以了。这只是打开这些规则的时间,我将令牌附加到API请求。
我这里缺少什么吗?所有问类似问题的StackOverflow问题都无法回答,部分回答但无法正常工作,或者使用了已弃用的数据库密钥。
答案 0 :(得分:0)
您传递了错误的值。 res.user.refreshToken
不是ID令牌。刷新令牌是用于定期获取新ID令牌的另一件事。
您将必须调用getIdToken()来异步获取该字符串值。