Стратегия аутентификации Facebook с Passport.js, Express и TypeScript - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь настроить стратегию аутентификации Facebook в своем приложении, используя Passport.js, Express и TypeScript.Я смог понять поток данных процесса благодаря этой статье от Hacker Noon .

Но когда дело доходит до функции обратного вызова проверки, все становится немного хлопотно.Мне нужно проверить, вошел ли пользователь в систему, поэтому необходим доступ к объекту Request.Я проверил в passport-facebook модульной документации, что passReqToCallback: true можно установить в параметрах стратегии, чтобы включить это.

Однако, когда я передаю параметр req в функцию обратного вызова, компилятор выдаетследующая ошибка:

Argument of type '(req: Request, accessToken: string, _refreshToken: string, profile: Profile, done: any) => void' is not assignable to parameter of type 'VerifyFunction'.

Просматривая определения типов модуля Passport.js, я нашел это:

export type VerifyFunction =
    (accessToken: string, refreshToken: string, profile: Profile, done: (error: any, user?: any, info?: any) => void) => void;

export type VerifyFunctionWithRequest =
    (req: express.Request, accessToken: string, refreshToken: string, profile: Profile, done: (error: any, user?: any, info?: any) => void) => void;

export class Strategy implements passport.Strategy {
    constructor(options: StrategyOptionWithRequest, verify: VerifyFunctionWithRequest);
    constructor(options: StrategyOption, verify: VerifyFunction);

    name: string;
    authenticate(req: express.Request, options?: object): void;
}

Итак, теоретически, объявление

new Strategy(fbConfig, (req: Request, accessToken: string, _refreshToken: string, profile: Profile, done: any) => { ... });

должен быть принят без проблем.

Вот полная fbConfig декларация:

const fbConfig = {
  clientID: "",
  clientSecret: "",
  callbackURL: "",
  passReqToCallback: true,
  profileFields: [
    "id",
    "name",
    "birhday",
    "gender",
    "email",
    "location",
    "hometown"
  ]
};

И мой tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "strict": true,
    "noImplicitAny": true,
    "esModuleInterop": true,
    "baseUrl": ".",
    "outDir": "dist",
    "paths": {
      "@models/*": ["./src/models/*"],
      "@configs/*": ["./src/configs/*"],
      "@controllers/*": ["./src/controllers/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Если бы кто-нибудь мог помочь мне с этим, я был бы очень благодарен!

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Я пробовал то, что Шенон Джексон рекомендовал, но это не сработало. Компилятору не удалось распознать перегруженный конструктор для класса Strategy.

Итак, что я сделал:

new Strategy(
  fbConfig as StrategyOptionWithRequest, 
  (
    req: Request,
    accessToken: string,
    _refreshToken: string,
    profile: Profile,
    done
  ) => { ... }
);

Я полагаю, что приведение объекта fbConfig к StrategyOptionWithRequest заставило компилятор использовать конструктор, который ожидал этот интерфейс. Затем я аннотировал типы параметров функции обратного вызова, но оставил done в системе вывода компилятора, чтобы иметь дело с ней. Аннотирование этого к any, казалось, немного мешало с системой IntelliSense VSCode, заставляя это не отображать ожидаемые параметры done.

0 голосов
/ 28 июня 2019

Typescript на самом деле имеет стартовый набор NodeJS с полностью настроенным OAuth Facebook, чтобы люди могли наблюдать, как он реализован здесь:

https://github.com/microsoft/TypeScript-Node-Starter И вы можете найти их паспорт, реализованный с помощью Facebook здесь: https://github.com/microsoft/TypeScript-Node-Starter/blob/master/src/config/passport.ts

Похоже, что они приводят "Request" к any я подозреваю, что это из-за противоречивых определений Request между стандартной библиотекой express / passport / Typescript, но не могу знать наверняка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...