护照-js:如何创建自定义策略。

25

我想创建自己的策略。

我有client_idclient_secret和相关元数据。我也知道执行流程。所以我想创建自己的策略并添加我自定义的身份验证逻辑。

我看过passport-strategy,但我不知道如何实现我的自定义策略。有人能解释一下吗?

2个回答

29

你有两个选择:

如果你有自定义身份验证逻辑,那么你不需要创建自己的策略...你可以使用passport-custom策略来构建这个逻辑。根据文档:

自定义身份验证策略通过您选择的自定义逻辑对用户进行身份验证

除非你想要实际构建一个你想要分发的策略(例如:OpenID的实现或类似的东西),否则我认为没有必要实现自己的策略。

然而,实现自己的策略就是实现passport-strategy抽象类。我建议查看Github页面而不是npm页面,因为它有关于如何启动和运行的更多信息。基本上,拥有自己的策略需要遵循以下步骤:

  1. 子类化策略
  2. 通过在原型上定义authenticate()方法来实现身份验证(这里将有你的自定义逻辑)。
  3. 调用其中一个增强方法(.success、.fail、.pass、.redirect或.error)

最后,你需要将它打包成一个npm模块,一旦你把所有东西都准备好了,你就可以在你的Node.js项目中要求你自己的策略。

正如我所说,我认为你需要有一个很好的理由去选择自己的策略。我建议尝试一下passport-custom


3

我发现使用passport-custom在typescript项目中非常令人沮丧。实际上,创建新策略非常容易,你只需要实现或扩展基本的passport策略即可,因为唯一必需的函数是authenticate,它是策略检查期间的入口点,其余部分取决于你的想象力。

import { Request } from 'express';
import passport from 'passport';

export class CustomStrategy extends passport.Strategy {
  name?: string;

  authenticate(
    this: passport.StrategyCreated<this, this & passport.StrategyCreatedStatic>,
    _req: Request,
    _options?: any,
  ) {
    // this.success({user: Express.User}, info?: object): void;
    this.success({ id: 1 }, { info: 'userdata' });

    //// *** Other available inherited methods
    //// * fail(challenge?: {message?: string, [key: string]: any } | string | number, status?: number): void;
    // this.fail('not your day body'); // default statusCode 401
    // this.fail('not your day body', 403); // change for statusCode 403

    //// * redirect(url: string, status?: number): void;
    // this.redirect('https://url');

    //// * pass() // ignores check
    // this.pass();

    //// * error(err: any)
    // this.error('error of some kind');
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接