Стратегия паспорта 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, () => {
});
});
}
}