首页 > 解决方案 > 向 Node Web 服务器的每个请求发送有效的 JWT 令牌时出现禁止 403 http 错误

问题描述

该应用程序有一个 inlog 组件,登录时我得到一个 JWT 令牌。此令牌很好地保存在 LocalStorage 中。我可以在浏览器中看到:

我使用 angular-jwt ("@auth0/angular-jwt": "^3.0.0") 并在 mij app.module.ts 中配置:

JwtModule.forRoot({
  config: {
    tokenGetter: () => {
      return localStorage.getItem("schoolsysteem");
    },
    headerName: 'Authorization',
    authScheme: 'Bearer ',
    whitelistedDomains: ["localhost:3000/*"],
    blacklistedRoutes: [""]
  }
})

headerName 和 authScheme 与默认值相同。实际上,此配置会为每个请求添加带有令牌的 Authorization 标头。

客户端请求的示例是:

const subjectJsonArr = '{"name":"'+vakParam.name+'"}';//,"tabs":"'+vakParam.tabs+'"}';

this.http.post<any>(`http://localhost:3000/addSubject`, JSON.parse(subjectJsonArr)).subscribe((val) => { //more code }

/routes/addSubject.js 中 NodeJs 上的服务器端代码

    module.exports = app => {
  app.post('/addSubject', function(req, res, next) {
      passport.authenticate('jwt', { session: false }, (err, user, info) => { 
      if (err) {
        console.error(err);
      }
      console.log(req.valueOf());
      if (info !== undefined) {
        console.error(info.message);
        res.status(403).send(info.message);
      } else {
        req.logIn(user, error => {
          const data = {
            name: req.body.name
          };
          console.log('data: '+data);
          User.findOne({
            where: {
              name: data.name,
            },
          }).then(user => {
            console.log(user);
            user
              .update({
                name: data.name
              })
              .then(() => {
                console.log('subject created in db');
                res.status(200).send({ message: 'subject created' });
              });
          });
        });
      }
    })(req, res, next);
  });
};

这是浏览器控制台(Chrome v75)中的错误信息:

这里是身份验证的代码。部分节点:

passport.use(
  'addSubject',
  new LocalStrategy(
    {
      usernameField: 'username',
      passwordField: 'password',
      passReqToCallback: true,
      session: false,
    },
    (req, username, password, done) => {
      console.log('name: '+req.body.name);
      try {
        User.findOne({
          where: {
            [Op.or]: [
              {
                username,
              },
              { email: req.body.email },
            ],
          },
        }).then(user => {
          if (user != null) {
            console.log('username or email already taken');
            return done(null, false, {
              message: 'username or email already taken',
            });
          }
          bcrypt.hash(password, BCRYPT_SALT_ROUNDS).then(hashedPassword => {
            User.create({
              username,
              password: hashedPassword,
              email: req.body.email,
              role: req.body.role,
              firstName: req.body.firstName,
              lastName: req.body.lastName
            }).then(user => {
              console.log('user created');
              return done(null, user);
            });
          });
        });
      } catch (err) {
        return done(err);
      }
    },
  ),
);

const opts = {
  jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('schoolsysteem'),
  secretOrKey: jwtSecret.secret,
};

passport.use(
  'jwt',
  new JWTstrategy(opts, (jwt_payload, done) => {
    try {
      User.findOne({
        where: {
          id: jwt_payload.id,
        },
      }).then(user => {
        if (user) {
          console.log('user found in db in passport');
          done(null, user);
        } else {
          console.log('user not found in db');
          done(null, false);
        }
      });
    } catch (err) {
      done(err);
    }
  }),
);

有人可以看到 403 错误的原因是什么吗?谢谢!

标签: node.jsangularauthenticationjwthttp-status-code-403

解决方案


推荐阅读