如何在客户端 Express 应用程序中处理 jwt 令牌和 refreshtoken?

Posted

技术标签:

【中文标题】如何在客户端 Express 应用程序中处理 jwt 令牌和 refreshtoken?【英文标题】:How to handle jwt token and refreshtoken in a client side express application? 【发布时间】:2021-05-19 08:20:23 【问题描述】:

大家好,我有两个快速申请, 一个是后端,我为数据库的所有 crud 操作提供了一个 rest api。

如果我只做 GET 请求,客户端也是在一个单独的快速应用程序中构建的,我在那里使用模板来使用来自其余 api 的数据。

登录方式是在 html 模板文件中的获取请求,包含在该文件下方的脚本标记中,因为我必须为登录提交按钮设置一个 EventListener 并且必须提取用户名和密码,如果登录成功,我将令牌存储到本地存储中,并将刷新令牌存储到 cookie 中。

问题是现在我还需要 nodejs/express 端的令牌来调用 api 并将其他一些数据呈现到视图中,但是从 nodejs/express 我无法访问浏览器的本地存储。

我能在这里做什么,处理这种情况的正确方法是什么? 感谢您的帮助!

示例: 访问令牌模板中的 API 调用,位于 views 文件夹中


<body>
<div class="login-dark">
    <form method="post" action="http://localhost:3007/auth/">
        <h2 class="sr-only">Login Form</h2>
        <div class="illustration"><i class="icon ion-ios-locked-outline" style="color: var(--success);"></i></div>
        <div class="form-group"><input class="form-control" type="email" id="email" name="email" placeholder="Email">
        </div>
        <div class="form-group"><input class="form-control" type="password" id="password" name="password"
                                       placeholder="Password"></div>
        <div class="form-group">
            <button class="btn btn-primary btn-block" id="submit" type="submit" style="background: var(--green);">Log
                In
            </button>
        </div>
        <a id="forgotPassword" class="forgot" href="#">Forgot your email or password?</a>
    </form>
    <img class="img-fluid" src="assetsLogin/img/thunderstorm-3430471_1920.jpg">
</div>
<script src="assetsLogin/js/jquery.min.js"></script>
<script src="assetsLogin/bootstrap/js/bootstrap.min.js"></script>
<script>
    submit.addEventListener("click", async (event) => 
        event.preventDefault()

        let data = 
            email: email.value,
            password: password.value
        

        await fetch('http://localhost:3007/auth', 
            method: 'POST',
            headers: 
                'Content-Type': 'application/json',
            ,
            body: JSON.stringify(data),
        ).then(response => response.json())
                .then(data => 
                            console.log(data)
                            if (data.token) 
                                document.cookie = "refreshToken=" + data.refreshtoken + "; expires=Thu, 11 Dec 2021 12:00:00 UTC";
                                localStorage.setItem("token", data.token)
                                window.location.href = 'http://localhost:3010/create';
                            
                            else 
                                window.reload()
                            
                        
                );
    );
</script>
</body>

在特快路线中,我会这样做:


const express = require('express');
const router = express.Router();

router.get('/', (req, res) =>

   // here i want to fetch first the data from api
  // but i need here the access token that is stored on browsers localstorage
  // then i want to populate this data into the view below
    res.render('view', data from fetch);
);



【问题讨论】:

【参考方案1】:

在这种情况下,您可以使用 accessToken(成功登录后)对服务器再进行一次 API 调用,从该调用获取用户数据并将其存储在浏览器的本地存储中。

我希望这对你有帮助。

【讨论】:

嘿,谢谢,但我需要访问令牌调用的用户名和密码,如何在模板之外提取它? 您能否详细说明一下您的API,以便我可以很好地指导您。 我用一个例子更新了我的问题

以上是关于如何在客户端 Express 应用程序中处理 jwt 令牌和 refreshtoken?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Express 2012 获取数据更改通知?

如何使用 express 中间件处理所有路由?

如何在 Express.js 服务器上执行 JWT API 请求? (edX API)

三Express 路由

如何在 Express 请求处理程序中编写非阻塞异步函数 [重复]

如何在 Express 请求处理程序中编写非阻塞异步函数 [重复]