我如何一起使用passportjs和reactjs?

Jos*_*rio 14 node.js reactjs passport.js

我有3个视图,(home,注册,登录)在reactJs中制作,我想在我的项目中使用护照,但我不知道该怎么做,我有护照配置,它的网址正在工作.

我可以做些什么来管理会话和用户数据,就像我们在ejs或jade中那样做?

ohk*_*s11 5

  • 使用 componentDidMount/useEffect 获取认证状态。将状态设置为反应状态。
  • 如果未通过身份验证,请显示登录/注册页面的链接或重定向。
  • 如果通过身份验证,您可以返回额外的受保护数据或显示受保护页面的链接。(显示私人数据时,使用 componentDidMount/useEffect 检查每个页面的身份验证状态)

客户端示例

import React, { useEffect, useState } from 'react';
import { Link } from "react-router-dom";
import axios from 'axios';

function Home() {

  const [loggedIn, setLoggedIn] = useState(false);

  useEffect(() => {
    axios.get('/checkAuthentication')
      .then(res => {
        setLoggedIn(res.data.authenticated);
      })
      .catch((error) => {
        setLoggedIn(false)
    });
  }, []);

  return (
    <div>
      {loggedIn ? (
        <p>Login success</p>
      ) : (
        <div>
          <Link to="/signup">
           Signup
          </Link>
          <Link to="/login">
            Login
          </Link>
        </div>
      )}
    </div>
  );
}

export default Home;
Run Code Online (Sandbox Code Playgroud)

服务器端示例(如果设置了passport,则必须填充req.user)

app.get("/checkAuthentication", (req, res) => {
  const authenticated: boolean = typeof req.user !== 'undefined'

  res.status(200).json({
    authenticated,
  });
});
Run Code Online (Sandbox Code Playgroud)


小智 4

您需要创建一个中间件函数来放置代码

function ensureAuthenticated(req, res, next){
  if(req.isAuthenticated()) { 
    return next() 
  } else {
    res.redirect('/')
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在路由器中使用

app.get('/account', ensureAuthenticated, function(req, res){
  // here return some data
})
Run Code Online (Sandbox Code Playgroud)

从 React 中你可能必须执行一个 fetch 请求

fetch('https://your_url/account', {
  credentials: 'include'  
})
Run Code Online (Sandbox Code Playgroud)

像这样的事情,你必须向服务器发出ajax请求或使用socket.io或websockets