我发现一个奇怪的错误,而我开发系统使用Firebase与服务URL包含用户数据。
用户数据如下。
{
"uid": "kt9Hcp2FbYbBvvIeSHHa1RbvHcv2",
"displayName": "Anonymous 901",
"photoURL": null,
"email": null,
"emailVerified": false,
"identifierNumber": null,
"isAnonymous": true,
"providerData": [
],
"apiKey": "MyApiKeyString",
"appName": "MyAppName",
"authDomain": "my.auth.domain",
"stsTokenManager": {
"apiKey": "MyApiKeyString",
"refreshToken": "refreshTokenString",
"accessToken": "accessTokenString",
"expirationTime": 1532451863076
},
"redirectEventId": null
}
我对上面的匿名用户数据进行了编码,并将其包含在服务URL中。
在系统内部,firebase接收到该url后,会使用该url中包含的用户数据创建一个用户对象。
此url的目的是在任何浏览器中使用特定用户的信息。
但是,当我调用该服务url时,有时系统会很好地创建用户对象,有时会得到错误- 400 Bad request error with https://www.googleapis.com/identitytoolkit/v3/relyingparty/setAccountInfo?key=MyApiKeyString
错误数据如下,
{
"error": {
"code": 400,
"message": "TOKEN_EXPIRED",
"errors": [
{
"message": "TOKEN_EXPIRED",
"domain": "global",
"reason": "invalid"
}
]
}
}
几个小时后,它运行良好,我没有改变什么虽然。
我找不到确切的错误点,但我怀疑错误发生在观察身份验证状态时或此步骤之前。
以下是代码片段
@bind
private makeUserLoadingPromise(): Promise<void> {
let unSubscribe: () => void;
return new Promise<void>((resolve, _reject) => {
const onInitialized = this.makeOnInitializedAuthStateChanged(resolve);
unSubscribe = this.auth.onAuthStateChanged(onInitialized);
}).then(() => {
unSubscribe();
this.auth.onAuthStateChanged(this.onAuthStateChanged);
});
}
@bind
private makeOnInitializedAuthStateChanged(resolve: () => void) {
return (user: firebase.User | null) => {
this.user = user;
resolve();
};
}
@bind
private onAuthStateChanged(user: firebase.User | null) {
this.user = user;
}
或者它可能与expirationTime有关?
我找不到任何关于这种情况的线索。
任何建议都将不胜感激。
1条答案
按热度按时间omhiaaxx1#
不清楚您正在执行的操作,但似乎您使用API的方式不正确且不安全。普通用户对象包含一个不确定的刷新标记。通过URL传递它确实是个坏主意。
首先,不要依赖于内部实现,因为它会随时变化。要在后端获取用户信息,正确的方法是使用官方支持的API获取用户的ID令牌,例如
user.getIdToken()
,然后将其传递到服务器。在服务器上,通过Firebase Admin SDK进行验证:
admin.auth().verifyIdToken(idToken)
。那么您就知道这是一个真正的经过身份验证的用户。如果您需要完整的用户信息,您可以使用令牌中的解码用户ID进行查找:admin.auth().getUser(decodedIdToken.sub)
.