typescript - 如何在 typescript 中初始化 Passport 配置文件?

标签 typescript passport.js

我有这个带有本地策略的 Passport 配置文件:

const LocalStrategy = passportLocal.Strategy;
const User = UserModel;

passport.serializeUser((user: any, cb) => {
  cb(undefined, user.id);
});

passport.deserializeUser((id: string, cb) => {
  User.findOne({_id: id}, (err: Error, user: IUser) => { //might need to change it to findById instead of findOne
    const userInfo = {
      username: user.username,
      role: user.role
    };
    cb(err, userInfo);
  });
});

passport.use(new LocalStrategy((username, password, done) => {
  User.findOne({username: username}, (err: Error, user: IUser) => { //note here that the IUser might be bad, instead place any (to all IUser too)
    if (err) throw err;
    if (!user) return done(null, false);
    bcrypt.compare(password, user.password, (err, result) => {
      if (err) throw err;
      if (result === true) {
        return done(null, user);
      }else{
        return done(null, false);
      }
    })
  })
}));

这是我的 App.ts 文件,我想应该在其中初始化我的通行证和我的配置:

import passport from "passport";


class App {
  public express: Application;
  public port: number;

  constructor(controllers: Controller[], port: number) {
    this.express = express();
    this.port = port;

    this.initialiseDatabaseConnection();
    this.initialiseMiddleware();
    this.initialiaseControllers(controllers);
    this.initializeErrorHandling();
  }

  private initialiseMiddleware(): void {
    this.express.use(helmet());
    this.express.use(cors());
    this.express.use(morgan("dev"));
    this.express.use(express.json());
    this.express.use(express.urlencoded({ extended: false }));
    this.express.use(compression());
    this.express.use(bodyParser.json());
    this.express.use(bodyParser.urlencoded({extended: true}));
    this.express.use(expressSession({
      secret: String(process.env.SECRET_KEY),
      resave: true,
      saveUninitialized:true
    }));
    this.express.use(cookieParser(process.env.SECRET_KEY));
    this.express.use(passport.initialize());
    this.express.use(passport.session());
  }

  private initialiaseControllers(controllers: Controller[]): void {
    controllers.forEach((controller: Controller) => {
      this.express.use("/api", controller.router);
    });
  }

  private initializeErrorHandling(): void {
    this.express.use(ErrorMiddleware);
  }

  private initialiseDatabaseConnection(): void {
    const { MONGO_USER, MONGO_PASSWORD, MONGO_PATH } = process.env;

    mongoose.connect(
      `mongodb+srv://${MONGO_USER}:${MONGO_PASSWORD}${MONGO_PATH}`
    );
  }

  public listen(): void {
    this.express.listen(this.port, () => {
      console.log(`App listening on port ${this.port}`)
    });
  }
}

export default App;

如何将我的通行证初始化为中间件以及我的通行证配置以开始在我的 route 使用我的本地策略? 我主要找到配置位于同一个文件中的示例,以及在我的情况下不起作用的路由。此外,我似乎找不到带有 typescript 的官方文档,如果您能将其与您的答案链接起来,我将不胜感激。

编辑: 提供更多细节,我基本上想做的是初始化我的策略,这样我就可以像这样在我的路由中使用 Passport 作为中间件:

this.router.post(
      `${this.path}/login`,
      passport.authenticate("local", (req, res) => {
        res.send("Successfuly authenticated");
      })
    )

请注意,这 3 个代码块分别来自 3 个不同的文件,passportConfig.ts、App.ts、userController.ts。

最后是我如何在不同的文件上初始化我的 Controller :

const app = new App([new PetController(), new UserController()], Number(process.env.PORT));

app.listen();

长话短说:

猜想我需要这样的配置但是在 TS 中:require('./path/to/passport/config/file')(passport);。 如果我的本地策略没有被识别,是否还有其他错误,请指出。

最佳答案

下面是我的一些偏好,基于对象的方法在任何 API 技术中都适用,并且(我认为)会产生干净的可测试代码。感觉其中一些可能与您的用例相关。

配置加载

我经常使用的一个选项是使用构建代码部署的 JSON 文件,对于管道的不同阶段可能会有所不同。这遵循构建二进制文件一次,然后部署多次的持续交付最佳实践。

在您的情况下,创建一个包装 Passport 的 Typescript 类,类似于我的身份验证器类包装使用 JWT 库的方式。不过,应该比我的示例更小心地处理 secret ,例如通过加密它们。

依赖注入(inject)

出于兴趣,Node 中更高级的 DI 也是可能的,其中配置在应用程序启动时注册为单例依赖项,然后注入(inject)到需要它的类中。有关使用 Inversify 的示例,请参阅我的 advanced Node API .这在目前可能有点矫枉过正,但随着代码库变大可能会很有用。

关于typescript - 如何在 typescript 中初始化 Passport 配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70632166/

相关文章:

javascript - 在 Angular 2 中调用异步等待

typescript - 如何在 ngrx effects 中使用之前 http 调用的 payload

typescript - 在 TypeScript 箭头函数中输入参数

node.js - Passport.js 支持 'Client Credentials Flow' 吗?

npm - 无法使用 TSC - 读取文件时出错 "anything.ts": File not found

Angular 2 - 重定向到外部 URL 并在新选项卡中打开

node.js - 使用 PassportJS 在 Session 中修改 user.username

node.js - 为什么 jwt.sign 函数不能将我的用户识别为对象?

javascript - node.js 中的 exports.local 有什么用

node.js - 将 sails 与 Passport js 一起使用