firebase - Firebase.auth 错误,400 错误请求
问题描述
我在使用 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 中。( http://myserviceurl?userdata=encodedUserData )
在系统内部接收该 url,firebase 创建一个用户对象,该用户数据包含在 url 中。
此 url 的目的是在任何浏览器中使用特定用户的信息。
但是,当我调用该服务 url 时,有时系统会很好地创建用户对象,有时会出错 - 400 Bad request errors 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;
}
或者它可能与过期时间有关?
我找不到有关这种情况的任何提示。
任何意见,将不胜感激。
解决方案
目前尚不清楚您在做什么,但您似乎在错误且不安全地使用 API。普通用户对象包含一个不确定的刷新令牌。通过 URL 传递它是一个非常糟糕的主意。
首先不要依赖内部实现,它可能会发生变化。要在您的后端获取用户的信息,正确的方法是使用官方支持的 API 获取用户的 ID 令牌,例如user.getIdToken()
,然后将其传递给您的服务器。
在您的服务器上,您可以通过 Firebase Admin SDK: 对其进行验证admin.auth().verifyIdToken(idToken)
。然后你知道这是一个真正的认证用户。如果您需要完整的用户信息,您可以使用令牌中的解码用户 ID 查找它:admin.auth().getUser(decodedIdToken.sub)
。
推荐阅读
- javascript - javascript 强制 ASP.NET 表单重新加载与 JQuery 自动完成文本框填充冲突?
- r - 在 R 中应用逐行转换,以便每行的总百分比为 100%
- java - 使用 Dagger2 Android 刷新 Oauth2
- laravel - 如何在没有 npm 的情况下安装 laravel/breeze?
- git - 合并没有引入合并的更改
- php - 如何修复 laravel 表单提交?
- python - “消息”对象没有属性“用户”
- python - 有没有办法自动回答弹出的警报框?
- javascript - array.find 返回多个结果
- javascript - 如何在javascript中通过给定的id查找对象的所有数据