72

我正在编写一个 nodejs 应用程序,我想将它用作 Web 应用程序以及 API 提供程序。一旦用户通过身份验证,我想为该用户分配一个令牌以用于后续请求。这适用于 Web 应用程序的护照,因为我只是在会话中使用令牌序列化和反序列化用户。但是,在响应 API 请求时,没有设置 cookie 来存储会话信息。理想情况下,护照会在会话和请求正文中查找令牌。有没有办法配置护照来完成这个?

4

3 回答 3

130

只需在每个请求上使用访问令牌。不需要使用会话。以下是工作流程:

POST /signin
  1. 用户名和密码发布在客户端请求中。
  2. 服务器使用护照的本地策略对用户进行身份验证。请参阅本地护照
  3. 如果凭证代表有效用户,则服务器返回某个生成器生成的访问令牌。node-jwt-simple是一个不错的选择。
  4. 如果凭据无效,请重定向到/signin.

当客户端从授权服务器接收到访问令牌时,它可以向服务器上的受保护资源发出请求。例如:

GET /api/v1/somefunction?token='abcedf'

  1. 客户端使用 token 参数调用一些服务器 api。
  2. 服务器使用护照的承载策略对令牌进行身份验证。见护照-http-bearer

参考

使用 passport.js 和 express.js (node.js) 制作安全的 oauth API

于 2013-08-15T03:05:48.587 回答
7

正如 bnuhero 提到的,您不需要会话(尽管这种方法也有其优点)。这是我为此开始的一个样板项目: https ://github.com/roblevintennis/passport-api-tokens

这是另一种易于理解的方法(但它确实使用会话)。可能是一个很好的交叉参考: http ://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

还有一个相关的参考:http: //mherman.org/blog/2013/11/11/user-authentication-with-passport-dot-js/

于 2013-12-14T17:46:31.877 回答
0

您可以在 nodejs 的护照中使用 isAuthenticated() 方法。在每条路线上,您都可以检查 if(req.isAuthenticated()) 如果它已经过身份验证,它将允许您访问该路线,或者您可以重定向或在 else 块中执行任何其他任何其他执行。在 Passport 中,您可以返回 done(null, user) 成功登录,它会将数据存储在 cookie 中,直到会话结束。在用户中,您可以提供有关用户的信息,例如电子邮件、密码。

app.get('/home', (req, res) =>{
    if(req.isAuthenticated()){
        //render home page
    } else {
        // go back to the login page or throw soome error
    }
}) 
于 2018-10-31T06:25:38.713 回答