2017-05-15 61 views
2

我有一個使用react-router的通用NodeJS,Express,React/Redux應用程序。它在應用程序的初始請求和客戶端上對來自react-router的後續請求從服務器端渲染。在服務器端使用passport-jwt呈現Express/React應用程序

我routes.js文件:

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

我有匹配該反應的路由和發送組件標記回模板通配符快遞路線:

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

您可以通過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"); 
}); 
+0

其實我要讓我的通配符的路線,而服務器端呈現選擇性保護。你知道我怎麼能在這個案例中使用中間件? –

+0

讓我們假設(只是一個例子),你想用你的令牌認證中間件保護'/ admin'背後的任何東西。爲此,在聲明通配符處理函數之前,您應該使用'app.use('admin',passport.authenticate('jwt',{session:false})'。中間件函數按順序執行,因此中間件包含的順序是重要的。 –

+0

這裏是一個更深入的例子 - https://github.com/scotch-io/easy-node-authentication/blob/local/server.js –

相關問題