首页 文章

在服务器端渲染Express / React应用程序时使用passport-jwt

提问于
浏览
2

我有一个使用react-router的通用NodeJS,Express,React / Redux应用程序 . 它在应用程序的初始请求和客户端上从服务器端呈现来自react-router的后续请求 .

我的routes.js文件:

<Route path="/" component={App}>
    <Route path="/main" component={Main}/>
    <Route path="/login" component={Login}/>
</Route>

我有一个通配符快速路由,匹配此react-routes并将组件标记发送回模板:

import routes from '../routes';

app.get('*', (req, res) => {
    match(
        { routes, location: req.url },
        (err, redirectLocation, renderProps) => {
            let markup;
            if (renderProps) {
                markup = renderToString(
                    <Provider store={store}>
                        <RouterContext {...renderProps}/>
                    </Provider>
                );
            } else {
                markup = renderToString(<NotFoundPage/>);
                res.status(404);
            }

            return res.render('index', { markup });
        }
    );
});

现在我想使用passport-jwt来保护通配符路由拦截的一些路由,例如:

app.get("*", passport.authenticate('jwt', { session: false }), 
(req, res) => {
    match(
        { routes, location: req.url },
            (err, redirectLocation, renderProps) => {
                res.json("Success! You can not see this without a token");
            }
    )
});

如何在通配符路由上仅保护来自routes.js的给定路由?

1 回答

  • 1

    您可以通过 app.use 添加一些中间件来执行此操作 . (https://expressjs.com/en/4x/api.html#app.use

    只需确保在通配符处理程序之前调用它

    app.use("/main", passport.authenticate('jwt', { session: false }), 
    function(req, res){
        res.json("Success! You can not see this without a token");
    });
    

相关问题