【发布时间】:2020-07-14 21:30:45
【问题描述】:
我的 Angular 应用中有一个实时数据库,并且正在使用 Firebase。我正在尝试在请求中使用作为参数附加的令牌来获取数据,如 RestAPI 的Firebase docs 所示。
但是,当我将令牌附加到数据时,我会收到 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 创建一个用户,然后在 activeUser 的 BehaviorSubject 上使用 .next,以便使用电子邮件、uid、令牌和显示名称添加用户。然后在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。所有这些都会导致相同的问题:{ "error" : "Could not parse auth token." }
当我发送 Firebase 请求以恢复一些锻炼时,请求如下:https://myapp.firebase.io/workouts.json?auth=MYTOKEN,无论我如何发送请求,它似乎总是返回相同的错误。
我的实时数据库规则如下:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
如果我将这些规则更改为:
{
"rules": {
".read": true,
".write": true
}
}
并完全删除我的 http 请求中的令牌,这样就可以了。这只是何时打开这些规则并且我将令牌附加到 API 请求的问题。
我在这里缺少什么吗?提出类似问题的所有 StackOverflow 问题要么未得到解答、部分得到解答但不起作用,要么使用了已弃用的 Database Secrets。
【问题讨论】:
-
错误消息表明您实际上并未传递 Firebase 身份验证用户 ID 令牌。请编辑问题以准确显示您如何获得此值。
-
添加了此代码。即使我手动将令牌添加到请求并在浏览器中提交,问题仍然存在
-
您必须更具体。你传递的价值到底是什么?这是你所期望的吗?请阅读:stackoverflow.com/help/minimal-reproducible-example
-
我在你的评论出现时添加了这个。应该有所有的代码。我最初没有包含代码,因为我认为我直接将令牌附加到 url 并且它仍然无法正常工作,将我的代码与手头的问题分离并且它可能是一个 firebase 问题
-
看起来问题在于我正在使用刷新令牌...
标签: angular firebase firebase-realtime-database firebase-authentication