node.js - Cum să combini Passport cu routing-controller?


În prezent încerc să implementez passport-ldap și passport-jwt în API-ul meu REST. Pentru rutare folosesc pleerock/routing-controllers, care are o modalitate de autorizare, dar funcționează cu valori booleene, iar passport funcționează cu, sincer, nu știu. Nu sunt nici măcar sigur dacă este posibil să combin cele două.

În prezent, AuthorizationChecker returnează fals pentru că nu știu cum să transform passport.authenticate într-un boolean.

useExpressServer(app, {
controllers: [UserController, IssueController, LoginController],
authorizationChecker: async (action: Action) => {
     return false;
}
@Authorized()
@Get("/test")
test(@Res() response: Response){
    response.send("Test done.")
}

Cum să folosești passport.authenticate() cu autorizarea controalelor de rutare?

Răspuns #1

Da, este posibil să combini passport cu routing-controller.

Cea mai simplă metodă este să folosiți passport ca middleware cu decoratorul @UseBefore înaintea claselor de controlere sau a metodelor de rută:

@JsonController()
@UseBefore(passport.authenticate('jwt'))
export class MyController { ... }

Totuși, s-ar putea să doriți să folosiți decoratorul @Authorized(). Este puțin mai complicat, dar se poate face cu configurarea authorizationChecker:

import express from 'express';
import { Action, useExpressServer } from 'routing-controllers';

const app = express();

useExpressServer(app, {
  authorizationChecker: (action: Action) => new Promise<boolean>((resolve, reject) => {
    passport.authenticate('jwt', (err, user) => {
      if (err) {
        return reject(err);
      }
      if (!user) {
        return resolve(false);
      }
      action.request.user = user;
      return resolve(true);
    })(action.request, action.response, action.next);
  }),
  currentUserChecker: (action: Action) => action.request.user,
});

Atunci vei putea folosi atât decoratorii @Authorized(), cât și @CurrentUser.

Verificați caracteristicile de autentificare passport și routing-controllers pentru mai multe detalii.

Răspunsul #2

Pentru a folosi authenticate() trebuie să îl folosești ca Middleware. Iată linkul despre routing-controllers despre cum să folosești Middleware. Pentru authenticationChecker

import * as jwt from 'jwt-simple'; 

currentUserChecker: async (action: Action) => {
        const token = action.request.headers["authorization"];
        console.log(token)
        let key= jwt.decode(token, "Banana");
        console.log(key)
        let user = await mongoose.model("users").findOne({'key': key.key});
        if (user != null && token != null) return user;
    }

Aceasta este o configurare pentru autentificarea JWT cu passport-jwt