使用PassportJS进行令牌认证/授权

时间:2016-09-22 23:15:25

标签: javascript node.js mongodb express passport.js

我目前正在为将在多个平台上分发的应用程序开发基于Node / Express的API。因此,我需要根据令牌而不是会话/ cookie来验证/授权用户。

经过一些研究,我发现PassportJS是一个很棒的插件,可以完成这样的事情。不幸的是,在阅读了几个小时的文档之后,对基于令牌的原始身份验证似乎没有任何好的解释。

我不想使用任何插件,例如JWT - 只是Passport,Express和MongoDB。

如何使用Passport实现基于令牌的用户授权系统。我需要有关令牌生成,令牌传递和其余过程的解释。

请以清晰简洁的方式回答这个问题,就像您向五年级学生解释一样。

谢谢:)

1 个答案:

答案 0 :(得分:0)

我将尝试将您的问题分解为几个部分:

  • 配置Passport
  • 使用Passport的地方
  • 杂项最后评论

首先,有点误解。 Passport没有与令牌生成系统捆绑在一起。 Passport旨在配置必须包含为依赖项的策略。这样做是为了使Passport本身可以轻巧且模块化。当您需要本地(用户名和密码)身份验证策略时,我可能需要通过Twitter进行身份验证。因此,Passport既不包括。我安装了我需要的东西并保持包装尺寸。

TL; DR:没有办法不为Passport安装插件。您需要包含某种策略

我假设你想要使用本地策略。因此,您需要本地护照。别担心,它是由Passport的作者Jared Hanson撰写的。

我使用的大部分内容都来自Passport文档,特别是here

让我们来看看配置:

  • 安装Passport和本地护照模块。
  • 确保Express,MongoDB,Node,npm等是最新的。

本地护照的基本配置文件如下所示:

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({ username: username ), function(err, user) {
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            if (!user.validPassword(password)) {
                return done(null, false, { message: 'Incorrect password.' });
            }
            return done(null, user);
        });
    }
));

现在您需要在网页上放置一个表单。这是一个非常基本的例子:

<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username" />
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password" />
    </div>
    <div>
         <input type="submit" value="Log In" />
    </div>
</form>

接下来,您需要在Express应用中使用路线。有关其工作原理的详细信息,请参阅Express Routing Documentation

app.post('/login',
    passport.authenticate('local', { successRedirect: '/',
                                     failureRedirect: '/login' })
);

参数说明:默认情况下, LocalStrategy 要求凭据位于名为用户名密码的参数中。除此之外,还有一些配置选项可以命名,例如使用电子邮件而不是用户名登录。