node.js - 使用 passport-jwt 授权 jwt token 时获得 401 未授权状态

标签 node.js passport.js

成功登录后,我得到了 jwt token ,现在要访问受限的 api,我正在发送授权 header ,但我总是得到

401 Unauthorized

我已经提到了这个Authenticating node API with passport-jwt问题在这里问但没有帮助我,

这是我调用的用于从受限 api 访问数据的函数

check() {
    console.log(this.token);
    var headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append("Authorization", "Bearer" +  this.token);
    let url = this.authenticationEndPoint + 'random';
    this.checkauth(url, headers).subscribe(
        data => {
            console.log(data);
        },
        error => {
            console.log("error");
        }
    );
}

checkauth(url:string, header:any): Observable<any> {

    return this.http.get(url, header)
            .map(this.extractData)
            .catch(this.handleError);
}
private extractData(res: Response) {
    let body = res;
    return body || {};
}

在我的 nodeJs 服务器上,这里是发送 jwt token 的登录代码:

app.post('/login_mobile', function(req, res) {
    if(!(req.body.email && req.body.passpord)) {
        user.findOne({'local.email' : req.body.email}, function(err, user) {
            if (err) { return done(err);}

            if (!user) {
                return res.json(200, "email is wrong");
            }
            if(!user.validPassword(req.body.password)) {
                return res.json(200, "wrong password");
            }
            var token = jwt.encode(user, configAuth.secret);
            return res.json(200, { user: user, jwtToken: token });
        });
    }
    else {
        res.send("no credentials provided");
    }
});

响应受限api请求的代码

app.get('/random', passport.authenticate('jwt', { session: false }),
    function(req, res) {
        res.send("success");
    });

这是我用来验证用户身份的 Passport 策略,但奇怪的是它甚至没有打印这里,它仍然发送 401 状态。

var opts = {};
opts.secretOrKey = configAuth.secret;
opts.jwtFromRequest = ExtractJwt.fromAuthHeader();
passport.use(new JwtStrategy(opts, function(jwt_payload, done){
    console.log("here");
    console.log(jwt_payload);
    User.findOne({_id: jwt_payload._id}, function(err, found_user) {
        if (err) {
            return done(err, false);
        }
        if(found_user !== null) {
            res.send("finally");
        }
        else {
            res.send("authentication failed");
        }
        return found_user ? done(null, found_user) : done(null, false);
    })
}));

如果有人可以指出我的错误。

最佳答案

我解决了一个类似的问题替换:

jwtFromRequest: ExtractJwt.fromAuthHeader(),

与:

jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer'),

关于node.js - 使用 passport-jwt 授权 jwt token 时获得 401 未授权状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091021/

相关文章:

node.js - 使用 TypeScript 的 Azure Functions 的 Hello World 应用程序无法通过 VSCode 启动

javascript - 使用postman上传图片到nodejs后端服务

node.js - 由于 "AuthorizationError",未捕获来自 Passport-facebook 的服务器错误

javascript - *.ejs 文件中的变量错误

node.js - PassportJS身份验证和mongodb数据库收集最佳实践?

node.js - 无法在 docker 容器中列出 pm2

javascript - Gulp revRewrite mod 不适用于重写元素中的 css 和 js

mysql - 如何在 Node.js 中发送多个响应

node.js - 强制 share.js 使用相同的快速 session 数据

node.js - 在 Node js 应用程序中使用 Passport 进行身份验证