Стратегия паспорта JWT не срабатывает

У меня есть следующий код, но моя стратегия passport-jwt не запускается:

Authenticator.js

import passport from "passport";
import passportJWT from "passport-jwt";

const ExtractJwt = passportJWT.ExtractJwt;
const JwtStrategy = passportJWT.Strategy;

export const set = app => {
    const opts = {
        secretOrKey: secret,
        jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
    };

    let strategy = new JwtStrategy(opts, (payload, done) => {
        console.log("Strategy called");
        console.log(payload);

        // Check user and company
        let user = getUserById(payload);

        if (!user) return done(new Error("User not found"), false);

        let context = {
            id: user.id,
            username: user.username,
            name: user.name
        };

        return done(null, context);
    });

    passport.use(strategy);

    console.log("Initializing passport");
    app.use(passport.initialize());
};

Server.js

import express from "express";
import bodyParser from "body-parser";
import mongoose from "mongoose";

import * as routes from "./routes";
import * as authenticator from "./authenticator";

mongoose.Promise = global.Promise;

const app = express();
app.set("port", process.env.API_PORT || 3001);

app.disable("x-powered-by");

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

const mongoUri = process.env.MONGO_URI || "mongodb://localhost/db";
mongoose.connect(mongoUri);

authenticator.set(app);

routes.set(app);

app.listen(app.get('port'), () => {
  console.log(`Find the server at: http://localhost:${app.get('port')}/`);     });

Routes.js:

import express from "express";
import passport from "passport";
import path from "path";

import appGraphQL from "graphql/src/graphql";

import * as authenticator from "./authenticator";

const router = express(router);

export const set = app => {
    app.use(
        "/graphql",
        passport.authenticate("jwt", { session: false }),
        appGraphQL()
    );
};

Получение от клиента:

function fetchQuery(operation, variables, cacheConfig, uploadables) {
  const token = sessionStorage.getItem('jwtToken');

  return fetch(SERVER, {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + token,
      Accept: 'application/json',
      'Content-type': 'application/json'
    },
    body: JSON.stringify({
      query: operation.text, 
      variables
    })
  })
    .then(response => {
      if (response.status === 401)
          throw new Error('Error401:Unauthorized'); 
      else return response.json();
    })
    .catch(error => {
      throw new Error(
        '(environment): Error while fetching server data. ' + error
      );
    });
}

Как я могу узнать, почему паспорт не вызывает стратегию обратного вызова аутентификатора?

0 ответов

Я знаю, что этот вопрос касается javascript, хотя я пришел сюда в поисках ответа для Typescript в среде TSeD.io, где аналогичным образом не применялась стратегия passport-jwt.

Ответом для меня было то, что (request, response) должен быть передан в Passport.Authenticate() вызов, то, что не нужно делать, когда оно используется в качестве промежуточного программного обеспечения в конечной точке Express. Как это в соответствии с login а также signup на https://tsed.io/tutorials/passport.html.

Я понимаю, что это необходимо всякий раз, когда .authenticate() вызов выполняется вне экспресс-конечной точки. Например, также в https://medium.com/front-end-hacking/learn-using-jwt-with-passport-authentication-9761539c4314. Причина в том, что Middleware, вызываемое в экспресс-конечной точке, будет автоматически передано (request, respone),

@Controller("/passport")
export class PassportCtrl {

  @Post("/login")
  async login(@Required() @BodyParams("email") email: string,
              @Required() @BodyParams("password") password: string,
              @Req() request: Express.Request,
              @Res() response: Express.Response) {


      return new Promise<IUser>((resolve, reject) => {
          Passport
              .authenticate("login", (err, user: IUser) => {
                  if (err) {
                      reject(err);
                  }

                  request.logIn(user, (err) => {

                      if (err) {
                          reject(err);
                      } else {
                          resolve(user);
                      }
                  });

              })(request, response, () => {

              });
      });
  }
}
Другие вопросы по тегам