如何在ReactJS中实现记住我的身份验证功能,当我只从后端API接收jwt令牌时

umuewwlo  于 2023-05-17  发布在  React
关注(0)|答案(5)|浏览(164)

我目前必须实现记住功能,记住我的登录信息在我的前端网站。如何在ReactJS中实现记住我的身份验证功能,当我只从后端API接收jwt令牌时。

vktxenjb

vktxenjb1#

一旦你收到一个jwt token,你可以为你的jwt token设置一个“过期时间”。例如,如果我收到一个令牌,其id为:“abc_token_123”,我将在sessionstoragelocalstorage甚至cookies中创建一个对象,其中包含一个名为expireTime的密钥(例如)。我将在主文件(App.js)上使用useEffect钩子来观察时间,如果时间超过到期时间,则将用户注销,否则,如果到期密钥存在于您的存储中,则保持用户登录。

7cjasjjr

7cjasjjr2#

如果用户选择“记住我”选项,则将JWT存储在浏览器本地存储中。假设您可以更改后端JWT过期时间,在用户选择记住我的地方,使JWT过期时间更长(可以接受的登录间隔天数)。

zqdjd7g9

zqdjd7g93#

在网上搜索后,我找到了这个答案in this website。该网站还扩展了如何加载它。

function setWithExpiry(key, value, expiration) {
    const now = new Date()

    // `item` is an object which contains the original value
    // as well as the time when it's supposed to expire
    const item = {
        value: value,
        expiry: now.getTime() + expiration,
    }
    localStorage.setItem(key, JSON.stringify(item))
}

这样做是为了设置一种方法,将'RememberMe'保存到本地存储,并保留一定的过期时间。

ldioqlga

ldioqlga4#

您可以通过创建“记住我”复选框并为其创建引用来实现此功能:

const rememberCheck = useRef(null)

在这个特定的例子中,我使用useState来声明凭证,因为我认为在输入字段上设置defaultValue更容易,只需将它们设置为localStorage上的值:

const [email, setEmail] = useState(localStorage.getItem("email") || "");
  const [password, setPassword] = useState(localStorage.getItem("password") || "");

然后创建一个函数来检查是否应该记住它:

function remember(){
        if(rememberCheck.current.checked){
          localStorage.setItem("email", email); localStorage.setItem("password", password)
        }
        else{
          localStorage.setItem("email", ""); localStorage.setItem("password", "")
        }
      }

然后使用此函数递增submit()函数,检查API调用的响应,如果它是200(从后端接收的JWT令牌),则调用remember()函数将登录名和密码存储在localStorage

zf9nrax1

zf9nrax15#

我更喜欢@Hopey One的想法。
如果用户选择记住我选项,则将JWT存储在浏览器本地存储中。
在我的例子中,我需要一个令牌来不时地与API通信(但现在我在localStorage中没有令牌,因为用户没有选择记住我选项)。所以我用一个州来保存它。一切都很完美,但问题是当我刷新页面时,我的令牌为空。因此,我使用sessionStorage在用户没有选择rememberme选项时存储令牌。这是我的useAuth自定义钩子文件中的代码示例。

const [token, setToken] = useState(
  sessionStorage.getItem('token') || localStorage.getItem('token'),
);

const login = (token: string, rememberMe = false) => {
  if (rememberMe) {
    localStorage.setItem('token', token);
  } else {
    sessionStorage.setItem('token', token);
  }
  setToken(token);
};

const logout = () => {
  localStorage.removeItem('token');
  sessionStorage.removeItem('token');
  setToken(null);
};

相关问题