javascript - 几个小时后,Expo 上的 Firebase 身份验证到期
问题描述
我有一个 Expo 应用程序,用于AppAuth
向 Google 进行身份验证。用户通过 Google 身份验证后,我使用 Google ID 令牌构建 Firebase 凭据并使用 Firebase 登录。
身份验证和对 Firebase 的读取运行良好,在用户回来几个小时后,用户不再通过 Firebase 进行身份验证。
PS:刷新或关闭应用程序使用户保持身份验证,这似乎是一个及时的事情。
根据文档,默认情况下应该启用持久性,但我也尝试通过使用强制它,但.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
没有成功。
这是我的代码:
onSignIn = googleUser => {
// We need to register an Observer on Firebase Auth to make sure auth is initialized.
var unsubscribe = firebase.auth().onAuthStateChanged(
function(firebaseUser) {
unsubscribe();
firebase
.auth()
.setPersistence(firebase.auth.Auth.Persistence.LOCAL)
.then(() => {
// Check if we are already signed-in Firebase with the correct user.
if (!this.isUserEqual(googleUser, firebaseUser)) {
// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.idToken,
googleUser.accessToken
);
// Sign in with credential from the Google user.
firebase
.auth()
.signInWithCredential(credential)
.then(function(result) {
if (result.additionalUserInfo.isNewUser) {
firebase
.firestore()
.collection("users")
.doc(result.user.email)
.set({
email: result.user.email,
profile_picture:
result.additionalUserInfo.profile.picture,
first_name:
result.additionalUserInfo.profile.given_name,
last_name:
result.additionalUserInfo.profile.family_name,
full_name: result.additionalUserInfo.profile.name,
locale: result.additionalUserInfo.profile.locale,
provider_id: result.additionalUserInfo.providerId,
created_at: Date.now()
})
.then(function(snapshot) {});
} else {
firebase
.firestore()
.collection("users")
.doc(result.user.email)
.update({
last_logged_in: Date.now()
});
}
})
.catch(function(error) {
console.log(error);
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
});
} else {
console.log("User already signed-in Firebase.");
}
});
}.bind(this)
);
};
signInAsync = async () => {
const authState = await AppAuth.authAsync(config);
await this.cacheAuthAsync(authState);
this.onSignIn(authState);
return authState;
};
我希望会话和身份验证能够打开并自动刷新。
解决方案
编辑
据此:When to set Firebase auth state persistence,没关系
原始答案
我想你可能必须setPersistence
以前onAuthStateChanged
onSignIn = googleUser => {
return firebase.auth().setPersistence()
.then(() => {
return new Promise((resolve, reject) => {
const unsubscribe = firebase.auth().onAuthStateChange((result) => {
resolve(result)
})
})
.then( /// etc
}
推荐阅读
- download - Google Drive API 文件下载状态 0
- apache-kafka - 如何逐条消息向Kafka发送消息
- flutter - 使用 Cloudinary 和 Flutter 替换上传的图片
- ios - 从 SwiftUI 中的 TabView 获取选定选项卡索引的方法
- python - 有没有办法在 python 中显示原始图像?
- javascript - appendChild 不是函数,不能将文本添加到多个 div
- javascript - Angular / JS 生成随机的 Uniq Serial ID
- powershell - Chocolatey Install Package Failing
- c# - 如何使selenium打开https页面,手动显示而自动运行时不显示?
- if-statement - How to get a total number of occurrences in an IF statement