【问题标题】:Passport local strategy working with postman, but not with axios, "missing credentials" error护照本地策略与邮递员一起使用,但不适用于 axios,“缺少凭据”错误
【发布时间】:2022-01-25 13:51:41
【问题描述】:

我正在尝试使用护照和本地策略构建登录系统。但是,每当我尝试通过 axios 运行请求时,它都不起作用,而与邮递员一样,请求也起作用。

我收到“缺少凭据”作为 axios 错误。

这是我的 axios 请求:

//api.js

localAuth: (username, password) => {
        console.log("running query")
        axios({method: "POST", url: "http://localhost:8080/login", data: {username: username, password: password}, withCredentials: true
        })
        .then(res => {
            console.log("Res = ", res);
        })
        .catch(err => {
            if (!err.response) {
                // network err
                console.log('err: Network err');
            } else {
                console.log(err.response.data.message);
            }
            console.log(err);
        })
    }

这是我的本地策略:

//passport.js


var options = {
    passReqToCallback: false,
    usernameField: 'username',
    passwordField: 'Password'
};

passport.use(new localStrategy(options, (username, password, done) => {
            this.userHelper.isAuthenticated(username, password)
            .then(async (response) => {
                var user = {username: response.username, id: response.id};
                var res = {user: user, token: this.getToken(user), type: type};
                var token = await this.tokenHelper.saveToken(res)
                return done(null, token)
            })
            .catch((err) => {
                console.log("an error occured : ")
                if (err === false) {
                    return done(null, false, {message: 'Invalid Username or password'})
                }
                else {
                    console.log("stratgy error:", err)
                    return done(err, false);
                }
            })
        }))

这是我的服务器端请求:

//app.js

app.post('/login', (req, res, done) => {
    strategy.authenticate('local',{session:true}, (err, user, info) => {
        console.log("err = ", err, " user = ", user, " info = ", info)
        if (err) {
            console.log("error occuring in local authentification strategy")
            res.send({sucess: false, message: err})
        }
        else if (!user) {
            console.log("error occuring in local user")
            res.send({sucess: false, message: "Unknown user or wrong Password"})
        }
        else {
            console.log("sucess on authorization")
            res.send({sucess: true, message: "Authorization suceeded"})
        }
    })(res, res);
})

strategy.authenticate的回调变量日志:err = null user = false info = { message: 'Missing credentials' }

最后是邮递员的结果:{"sucess":false,"message":"Unknown user or wrong Password"}

我已经设置了 usernameField 和 passwordField,因为我使用的是 express 6.x.x,所以我不需要初始化 bodyParser,因为它是通过 express 自动完成的。

你们知道我错过了什么吗?

【问题讨论】:

  • 如果错误源是 axios,你能显示完整的错误和 HTTP 代码或堆栈跟踪吗?
  • 不是真的,这不是一个错误,但问题是,当我做 passport.use(new localStrategy ...) 有一个 done 回调。这个回调让我得到关于它是否成功的信息以及一个可选的消息。问题是当我尝试进行身份验证时,我在我没有设置的信息值(检查 app.js)中得到“缺少凭据”,所以它是一个护照,我不明白为什么它被触发而不是那些我真的写了。

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


【解决方案1】:

默认axios以JSON格式发送数据,所以你应该使用official documentation中描述的官方方式之一
例如:

const params = new URLSearchParams();
params.append('username', username);
params.append('password', password);

axios({method: "POST", url: "http://localhost:8080/login", params, withCredentials: true
})

【讨论】:

  • 好的,谢谢,我正在尝试
  • 我尝试了这种方法,并且许多其他方法形成了文档,但似乎没有一个有效,一旦我使用 URLSearch 参数之一,req.body 是空的服务器端,我已经尝试通过复制您的代码,文档的代码,但它仍然是空的
  • 您能否比较两种情况下的整个请求及其正文?
  • 这里是auth的代码:imgur.com/bx7t7FJ后面是请求的结果,第一个请求是axios空body发出的,第二个是postman发出的:imgur.com/PKE01mF 似乎即使使用邮递员,凭据仍然丢失
  • 你能在两种情况下(poatman 和 axios)都显示请求头和正文吗?
猜你喜欢
  • 2020-05-12
  • 2016-08-12
  • 2018-06-02
  • 2023-03-30
  • 2015-08-22
  • 2018-03-19
  • 2017-07-12
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多