Passport local strategy through custom fetch not displaying flash 消息

Passport local strategy through custom fetch not displaying flash messages

我正在使用护照本地策略来启用用户登录。 早些时候,我的后端代码是 -

passport.authenticate('local', {
      successRedirect : '/dashboard',
      failureRedirect : '/users/login',
      failureFlash : true
    })(req, res, next)

后来,我实现了一个google recaptcha(需要使用jquery/JS的自定义回调函数)。如下-

document.getElementById("login-form").addEventListener('submit', submitForm)
  function submitForm(e){
    e.preventDefault()
    const email = $("#email").val()
    const password = $("#password").val()
    const captcha = $("#g-recaptcha-response").val()

    fetch('/users/login', {
      method:'POST',
      headers:{
        'Accept': 'application/json, text/plain, */*',
        'Content-type': 'application/json'
      },
      body: JSON.stringify({email:email,password:password, captcha:captcha})
    })
    .then(response=>{
      console.log(response)
      if (response.redirected) {
            window.location.href = response.url;
        }
        else{
          
        }
    })
    .catch(function(err) {
        console.info(err + " url: " + url);
    });

现在,在实施自定义回调之前,passport 自动显示 缺少凭据 闪现消息 incase 字段为空,但是,现在我正在使用自定义回调,记录了以下数据.我不确定如何显示 即时消息 。请忽略代码不一致的地方,因为它包含js和jquery以及function()和()=>{}等

Response {type: "basic", url: "http://localhost:3000/users/login", redirected: false, status: 200, ok: true, …}
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "basic"
url: "http://localhost:3000/users/login"
__proto__: Response

我还没有找到一个可靠的解决方案,但我已经在前端实现了这个 -

基本上,如果验证码已填写,本地策略会将用户重定向到 /login 或 /dashboard(取决于详细信息是否有效) 如果验证码 未被 填充,服务器将发送一个 json 对象作为响应。

现在,我的前端检查它是 重定向对象 还是其他 json 对象。

如果是 json,则表示验证码丢失,因此会显示一条错误提示。

如果是重定向URL,则如果是/dashboard 则重定向,否则如果是/login 则添加错误提示。

<script>

   var onloadCallback = function() {
        widgetId2 = grecaptcha.render(document.getElementById('captcha-preview'), {
         'sitekey' : 'insert_key_here'
       });
    };

  document.getElementById("login-form").addEventListener('submit', submitForm)
  
  function submitForm(e){
    e.preventDefault()
    const email = $("#email").val()
    const password = $("#password").val()
    const captcha = $("#g-recaptcha-response").val()

    fetch('/users/login', {
      method:'POST',
      headers:{
        'Accept': 'application/json, text/plain, */*',
        'Content-type': 'application/json'
      },
      body: JSON.stringify({email:email,password:password, captcha:captcha})
    })
    .then(response=>{

      // Incase captcha is verified, the response redirects the user
      if (response.redirected) {

        // If the redirect is to the users/login, captcha is reloaded
            if(response.url.includes(window.location.pathname)){
              grecaptcha.reset(widgetId2)
              $("#display-error").html('<div class="alert alert-danger alert-dismissible fade show" role="alert">Invalid Login Credentials<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>')
            }else{

              // If the redirect is /dashboard, the redirect is made
              window.location.href = response.url;
            }
        }
        else if(!response.redirected){
          $("#display-error").html('<div class="alert alert-danger alert-dismissible fade show" role="alert">Missing captcha<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button></div>')
        }
    })

  }
</script>