javascript - Nodejs Restful api 验证方法

标签 javascript ajax node.js rest

如何在nodejs Restful API中正确进行身份验证?我已经创建了基本的 API,例如 example.com/books/ 将为您提供我数据库中的书籍列表。我可以通过检查 session 是否存在来允许登录用户使用 API。真有这么简单吗?为什么需要基于 token 的身份验证?

最佳答案

这取决于您想要实现哪种安全性。每个您都可以利用 HTTP 基本身份验证。这相当于拥有一个 Authorization header ,其中包含使用 Base64 编码的用户名/密码:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

有关信息QWxhZGRpbjpvcGVuIHNlc2FtZQ==等于encodeBase64('username:password)(伪代码)。

在服务器端和 Express 应用程序中,您可以使用 basic-auth 模块来实现以下安全中间件。它将从请求中提取用户名/密码并检查是否匹配。为了简单起见,它在这里被硬编码,但它应该检查数据库。

var basicAuth = require('basic-auth');

function unauthorized(res) {
  res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
  return res.status(401).end();
}

// Hardcoded username / password
var username = 'foo';
var password = 'bar';

var basicAuthMiddleware = function() {
  return function(req, res, next) {
    var user = basicAuth(req);

    if (!user || !user.name || !user.pass) {
      return unauthorized(res);
    }

    if (user.name === username && user.pass === password) {
      return next();
    } else {
      return unauthorized(res);
    }
  };
};

expressApplication.use(basicAuthMiddleware);

如果您想要更通用的东西,即能够轻松更改身份验证策略,我建议您查看 Passport图书馆。

在这种情况下,前面的内容将按如下所述进行修改:

var passport = require('passport');

passport.use(new BasicStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) {
        return done(err);
      }

      if (!user) {
        return done(null, false);
      }

      if (!user.validPassword(password)) {
        return done(null, false);
      }

      return done(null, user);
    });
  }
));

expressApplication.use(passport.initialize());

您还可以使用更高级的安全机制,例如基于 token 的身份验证或 OAuth2。 Passport 为他们提供了一些支持。

否则我建议您阅读以下博客文章:

一句话。当您实现 RESTful 服务时,服务器端不应该有某些状态。我的意思是没有登录和注销。如果您想利用 token ,您应该需要一个授权资源,该资源为您提供临时凭证 token ,并且能够在过期时刷新它。

希望对你有帮助 蒂埃里

关于javascript - Nodejs Restful api 验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33908740/

相关文章:

node.js - 获取错误 : read ECONNRESET when trying to use nodemailer with Hover. com 电子邮件

javascript - 无法使用 console.table 打印数据

javascript - window.print() 用 Electron 生成PDF

javascript - 使用 javascript 发送请求时中止链接和表单提交

javascript - React + Express + Nodemailer : Can't render components and Nodemailer together

javascript - 为什么我的 Firebase 请求返回 500(内部服务器错误)?

javascript - 向下滚动到内容而不更改页面 URL

javascript - 在没有 GUI/X session 的情况下使用 GreaseMonkey 脚本运行 Firefox 的任何方法

javascript - 如何在成功的AJAX上更改图像src

c# - 如何从azure blob存储下载文件