【问题标题】:Firebase automatically logging out users after an hour [closed]Firebase在一小时后自动注销用户[关闭]
【发布时间】:2021-02-03 02:26:04
【问题描述】:

因此,我对此进行了一些研究,并且我了解到 firebase 每隔一小时就会更新一次刷新令牌,因为 firebase id 令牌会在一小时后过期。我读到一个小时后的firebase刷新令牌是自动的,用户不需要做任何事情。

但我的用户在一个小时后自动退出。只要用户不自愿退出,我希望用户会话持续存在。我也不知道如何调试。

这是我的 package.json -

{
    "name": "with-firebase-authentication",
    "version": "1.0.0",
    "scripts": {
        "dev": "next dev",
        "build": "next build",
        "start": "next start",
        "export": "next export"
    },
    "dependencies": {
        "firebase": "^8.2.1",
        "firebase-admin": "^9.4.2",
        "firebase-functions": "^3.13.1",
        "handlebars": "^4.7.6",
        "js-cookie": "2.2.1",
        "luxon": "^1.25.0",
        "next": "latest",
        "nookies": "^2.5.0",
        "react": "^16.13.1",
        "react-dom": "^16.13.1",
        "react-firebaseui": "^4.1.0",
        "swr": "0.2.3",
        "uuid": "^8.3.2"
    },
    "license": "MIT"
}

我将此示例用作我的应用程序的基础 - https://github.com/vercel/next.js/tree/canary/examples/with-firebase-authentication

编辑 - 这是一些额外的代码;

userCookies.js

import cookies from 'js-cookie';

export const getUserFromCookie = () => {
    const cookie = cookies.get('auth');
    if (!cookie) {
        return;
    }
    return JSON.parse(cookie);
};

export const setUserCookie = user => {
    cookies.set('auth', user, {
        // firebase id tokens expire in one hour
        // set cookie expiry to match
        // expires: 1 / 24,
        expires: 1 / 24,
    });
};

export const removeUserCookie = () => cookies.remove('auth');

使用User.js

import { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
import firebase from 'firebase/app';
import 'firebase/auth';
import initFirebase from '../auth/initFirebase';
import { removeUserCookie, setUserCookie, getUserFromCookie } from './userCookies';
import { mapUserData } from './mapUserData';

initFirebase();

const useUser = () => {
    const [user, setUser] = useState();
    const router = useRouter();

    useEffect(() => {
        // Firebase updates the id token every hour, this
        // makes sure the react state and the cookie are
        // both kept up to date
        const cancelAuthListener = firebase.auth().onIdTokenChanged(async user => {
            if (user) {
                const userData = await mapUserData(user);
                setUserCookie(userData);
                setUser(userData);
            } else {
                removeUserCookie();
                setUser();
            }
        });

        const userFromCookie = getUserFromCookie();
        if (!userFromCookie) {
            router.push('/');
            return;
        }
        setUser(userFromCookie);

        return () => {
            cancelAuthListener();
        };
    }, []);

    return { user, logout };
};

export { useUser };

mapUserData.js

export const mapUserData = (user) => {
  let token
  const { uid, email } = user
  user.getIdToken(true).then(id => token = id)
  return {
    id: uid,
    email,
    token,
  }
}

我认为 cookie 存在一些问题,而不是 firebase 身份验证。

【问题讨论】:

  • 在 Stack Overflow 上,您应该将所有相关代码添加到问题本身中 - 不要链接到外部资源,因为它们将来可能会变得陈旧并使这个问题对其他人无用。从您在此处添加的代码中应该清楚问题是什么以及您如何观察它。
  • 是的,我不明白你的意思,但我不知道究竟是什么导致了问题。如果我必须添加相关代码,那么我将不得不添加很多代码。我什至不知道这里是否允许。但我会按照你所说的添加更多代码来明确我的问题。谢谢。

标签: javascript firebase authentication firebase-authentication next.js


【解决方案1】:

设置 firebase.auth.Auth.Persistence.SESSION 或 NONE。

阅读更多:https://firebase.google.com/docs/auth/web/auth-state-persistence#modifying_the_auth_state_persistence

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2012-04-24
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多