如何将护照与路由控制器结合起来?

时间:2017-08-16 11:01:59

标签: node.js typescript express jwt passport.js

我目前正在尝试将passport-ldap和passport-jwt实施到我的其余API。对于路由我使用pleerock/routing-controllers,它有一种授权方式,但它适用于布尔和护照工作我真的不知道。我甚至不确定它是否可能将两者结合起来。

目前AuthorizationChecker返回false,因为我不知道如何将passport.authenticate变成布尔值。

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

如何将passport.authenticate()与路由控制授权一起使用?

2 个答案:

答案 0 :(得分:0)

要使用authenticate(),您必须将其用作中间件。以下是路由控制器link如何使用中间件。对于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;
    }

这是使用passport-jwt

进行jwt身份验证的设置

答案 1 :(得分:0)

是的,可以将通行证与路由控制器结合使用。

最简单的方法是在控制器类或路由方法之前将护照作为带有@UseBefore装饰器的中间件:

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

但是,您可能要使用@Authorized()装饰器。稍微复杂一点,但是可以通过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,
});

然后,您将可以使用@Authorized()和@CurrentUser装饰器。

检查passport authenticaterouting-controllers auth features以获得更多详细信息。