当前位置: 首页 > 知识库问答 >
问题:

带PassportJS的Nuxt身份验证?

鲁单弓
2023-03-14

如何使用JWT(后端express)将nuxt身份验证模块(前端)与passport-local一起使用?

定义用于验证jwt令牌的jwt策略(express)

    var JwtStrategy = require('passport-jwt').Strategy,
        ExtractJwt = require('passport-jwt').ExtractJwt;
    var opts = {}
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
    opts.secretOrKey = 'secret';
    opts.issuer = 'accounts.examplesoft.com';
    opts.audience = 'yoursite.net';
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        User.findOne({id: jwt_payload.sub}, function(err, user) {
            if (err) {
                return done(err, false);
            }
            if (user) {
                return done(null, user);
            } else {
                return done(null, false);
                // or you could create a new account
            }
        });
    }));

定义用于验证用户名nad密码的本地策略(express)

    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); }
          if (!user.verifyPassword(password)) { return done(null, false); }
          return done(null, user);
        });
      }
    ));

验证用户名和密码后颁发令牌的代码(expresss)

    app.post('/login', 
      passport.authenticate('local', { failureRedirect: '/login' }), //need to update from nuxt auth.
      function(req, res) {
        res.redirect('/');
      });

nuxt身份验证本地策略使用用户名和password返回一个JWT令牌(nuxt)

    this.$auth.loginWith('local', {
      data: {
        username: 'your_username',
        password: 'your_password'
      }
    })

它可以独立工作,我如何结合这些?

共有1个答案

宇文俊明
2023-03-14

快递代号

创建passport策略

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;

passport.use(
    new LocalStrategy(
        {
            usernameField: 'username',
            passwordField: 'password'
        },
        function(username, password, done) {
            users.findOne({ email: username }, function(err, user) {
                if (err) {
                    return done(err);
                }
                if (!user) {
                    return done(null, false, { error: 'Invalid username' });
                }
                if (!user.checkPassword(password)) {
                    return done(null, false, { error: 'invalid password' });
                }

                const info = { scope: '*' };
                done(null, user, info);
            });
        }
    )
);


const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = 'JWT_SECRET_OR_KEY';
passport.use(
    new JwtStrategy(opts, function(payload, done) {
        users.findById(payload, function(err, user) {
            if (err) {
                return done(err, false);
            }
            if (user) {
                return done(null, user);
            }
            return done(null, false);
        });
    })
);

使用passport策略

const express = require('express');
const passport = require('passport');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

app.use(passport.initialize()); // Used to initialize passport

// Routes

app.post(
        '/login',
        passport.authenticate('local', { session: false }),
        function(req, res) {
            const token = jwt.sign(req.user.userId, 'JWT_SECRET_OR_KEY');
            return res.json({ token });
        }
    );
app.get(
    '/me',
    passport.authenticate(['jwt', 'bearer'], { session: false }),
    function(req, res, next) {
    const { userId } = req.user;
    users.findOne({ _id: userId }, (err, data) => {
        if (err) {
            res.status(500).send(err);
        } else if (data) {
            const userData = data;
            res.status(200).send(userData);
        } else {
            res.status(500).send('invalid token');
        }
    });
}
);

nuxt的配置

在nuxt.config.js内部

 auth: {
    resetOnError: true,
    redirect: {
      login: '/login', // User will be redirected to this path if login is required.
      home: '/app/dashboard', // User will be redirect to this path after login. (rewriteRedirects will rewrite this path)
      logout: '/login', // User will be redirected to this path if after logout, current route is protected.
      user: '/user/profile',
      callback: '/callback // User will be redirect to this path by the identity provider after login. (Should match configured Allowed Callback URLs (or similar setting) in your app/client with the identity provider)
    },
    strategies: {
      local: {
        endpoints: {
          login: {
            url: '/login',
            method: 'post',
            propertyName: 'token'
          },
          logout: false,
          user: {
            url: '/me',
            method: 'GET',
            propertyName: false
          }
        },
        tokenRequired: true,
        tokenType: 'Bearer'
      }
}

内部登录。vue

    this.$auth
      .loginWith('local', {
        data: {
          username: this.user.email,
          password: this.user.password
        }
      })
      .catch(err => {
        console.error(err );
      });
 类似资料:
  • 我想在Docker上设置一个配置了身份验证的Cassandra容器。目前我使用的是官方的Cassandra Docker图像,但它似乎没有提供启用认证模式的选项(通过ENV thingies)。 一种可能性是设置一个自己的存储库,从Cassandra Docker GitHub克隆并修改此文件,以便它也接受与身份验证相关的选项,但对于我非常简单的任务来说,这似乎有点复杂。有没有人知道一个更简单的解

  • 问题内容: 我正在努力为使用网关的REST API设计SAML2.0身份验证。在我的后端和应用程序之间使用REST。我正在使用Java Servlet过滤器和Spring。 我看到两种可能性: 每次将SAML令牌添加到标头中。 使用SAML进行一次身份验证,然后使用客户端与网关之间的会话或类似(安全对话)进行身份验证。 情况1: 这是一个很好的解决方案,因为我们仍然是RESTful,但是: SAM

  • 最后一行失败了 捕获的JMSException:com.ibm.msg.client.jms.detailedJMSSecurityException:JMSWMQ2013:为连接模式为“Client”、主机名为“Natmib1.hostname.net(1414)”的QueueManager“提供的安全身份验证无效。请检查您正在连接到链接异常:com.ibm.MQ.mqexception:jms

  • 我正在尝试使用Solrj连接到solr。我的solr实例在jetty中运行,并受到基本身份验证的保护。我找到了这些包含相关信息的链接。 有人能给我指个正确的方向吗?谢谢!!

  • 我正在尝试使用connect将passport集成到我的nodejs服务器中,但似乎无法正确完成。所有的指南/示例都使用expressJS,所以我尽了最大努力重新格式化代码以使用我的代码,但我似乎无法让它正常工作。相关部分写在下面。有人对可能出现的问题有什么建议吗?护照authenticate()似乎从未被调用(至少facebook身份验证回调中的console.log消息从未打印)。我目前没有将

  • 我是NFC Android的新手,我已经被困了好几天,试图将NTAG4 Mifare Ultralight的第7页与身份验证一起获取,我已经有了PWD和PACK来做基于NTAG212文档的PWD_AUTH。 我这样做。。。 我总是收到将PWD_AUTH命令发送到 NFC 后出错。有人可以告诉我我做错了什么吗?我的方法正确吗?请帮忙。 注意:我已经多次阅读NTAG212的文档,搜索了google、s

  • 问题内容: 我正在尝试将API查询输入python。命令行 提供一些json输出。myToken是一个十六进制变量,始终保持不变。我想从python进行此调用,以便我可以遍历不同的id并分析输出。有任何想法吗?在需要身份验证之前,我已经使用urllib2进行了此操作。我也查看了请求模块,但无法弄清楚该怎么做。 非常感谢。 问题答案: 该请求包有一个用于HTTP请求的一个非常好的API,加入了自定义