【问题标题】:Express-React-JWT: How to send Bearer token with static file requestsExpress-React-JWT:如何使用静态文件请求发送 Bearer 令牌
【发布时间】:2023-04-01 22:37:01
【问题描述】:

我正在创建一个可以设置全局密码的快速服务器/React 应用程序。如果设置了全局密码,我不希望未经身份验证的用户能够访问服务器上的任何内容,包括静态文件。我正在使用 JWT 进行身份验证。

为了保护 React 中的路由,我使用了一个名为 AuthService 的类来获取和发布,它允许我在所有请求中发送一个 Bearer 令牌。但是,我无法使用我的任何静态文件发送 Bearer 令牌,因为它们是通过组件的 src 标记加载的。我不确定如何或是否可以与他们一起发送不记名令牌。因此,即使用户通过身份验证,他们仍然无法访问任何静态文件。

如何允许经过身份验证的用户访问静态文件?

快速后端:

// index.js
import express from 'express';
import globalMiddleware from 'global.middleware.js';

const app = express();

app.all('*', globalMiddleware);

app.use('/api/auth', ...);
app.use('/api/users', ...);
...
app.use('/static', express.static(process.env.STATIC_FOLDER));



// global.middleware.js
import jwt from 'jsonwebtoken';

export default async (req, res, next) => {
    if (req.path == '/api/auth/global/' || process.env.GLOBAL_PASSWORD === '') return next();

    const authHeader = req.headers['authorization'];
    const token = !!authHeader && authHeader.split(' ')[1];

    if (!token) return res.sendStatus(401);

    let decoded;
    try {
        decoded = await jwt.verify(token, process.env.JWT_TOKEN_SECRET);
    } catch (err) {
        return res.sendStatus(401);
    }
    if (!decoded.hasOwnProperty('globalPassword')
        || decoded.globalPassword !== process.env.GLOBAL_PASSWORD
    ) return res.sendStatus(401);

    next();
}

反应前端:

// auth.service.js
class AuthService {
    get(page) {
        return axios.get(API_URL + page, this.getTokenHeader());
    }

    getTokenHeader() {
        const token = localStorage.getItem('token');
        if (token) {
            return {
                headers: {
                    Authorization: 'Bearer ' + token
                }
            }
        } else {
            return {}
        }
    }
}

【问题讨论】:

    标签: reactjs express jwt


    【解决方案1】:

    一种可能的替代方法是在 cookie 中返回 jwt 令牌,理想情况下是 HttpOnly(无法从 js 读取,因此防止对其进行 XSS 攻击)、安全(仅通过 https 请求发送)和 SameSite=Strict 属性(以防止 CSRF) .

    登录后,来自同一站点的所有后续 https 请求(包括静态文件)都将嵌入该 cookie。您需要更新中间件以检查 cookie 而不是标头。而且您将不再需要 AuthService。

    【讨论】:

    • 这似乎是正确的方法,但我遇到了一个问题。由于我的 React 应用程序无法以任何方式访问 HttpOnly cookie,因此我无法判断 cookie 是否存在,或者用户是否根据存在的令牌 cookie 登录。你建议我如何处理这个问题?
    • 对此有多种方法。您可以在一个单独的捆绑包中拥有一个始终可以访问的专用登录页面。然后在服务器端,如果没有 cookie,则在该登录页面上重定向用户。如果您可以公开主要反应包的静态文件,您可以对应用程序负载进行“身份验证检查”调用,然后服务器将检查 cookie 是否存在,具体取决于此调用的结果,前端将要求用户登录或显示预期的页面。
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2017-10-21
    • 2019-01-29
    • 2017-10-19
    • 2015-09-27
    • 2019-04-05
    • 2016-06-07
    • 2019-07-07
    相关资源
    最近更新 更多