在单独的文件中定义通行证策略并在整个应用程序中使用它

Define passport strategy in a separate file and use it across the app

我已经尝试了很长时间,但我似乎无法理解它是如何工作的。

我有一个 passport.ts 文件,大致定义为:

passport.serializeUser<any, any>((user, done) => {
    done(undefined, 1);
});

passport.deserializeUser((id, done) => {
    done(null, 1);
});

// Strategy config
const GoogleStrategy = passportGoogle.Strategy
passport.use(new GoogleStrategy({
    clientID: config.get('googleAuth.clientID'),
    clientSecret: config.get('googleAuth.clientSecret'),
    callbackURL: config.get('googleAuth.callbackURL'),
    passReqToCallback: true
}, async (accessToken, refreshToken, profile, done)=> {
    return done
}))

在项目的根目录中,我有一个 index.ts 用于执行标准护照初始化:

app.use(passport.initialize());
app.use(passport.session());

我在不同的文件中通过 express 的 Router 函数定义控制器,其中之一是 authenticate.ts,大致是这样的:

import {Router} from 'express';
import passport from 'passport';
import config from 'config';
import * as passportConfig from '../utils/passport' //this is passport.ts which was pasted above
const router = Router();

router.get('/google', passport.authenticate('google', {scope: config.get('googleAuth.scope')}));

我知道我缺少回调路由,但我在执行这项工作时遇到了问题,因为我不确定 passport.ts 中使用该策略定义的护照对象如何在不同的文件中使用。

任何帮助都会很棒!

据我了解,您想在单独的文件中定义护照策略并使用它们。为此你可以做这样的事情

创建一个文件来定义您的策略google-strategy.ts

const googleStrategy = new GoogleStrategy({
    clientID: config.get('googleAuth.clientID'),
    clientSecret: config.get('googleAuth.clientSecret'),
    callbackURL: config.get('googleAuth.callbackURL'),
    passReqToCallback: true
}, async (accessToken, refreshToken, profile, done)=> {
    return done
})
module.exports = googleStrategy;

并在您的 passport.ts 文件中

const googleStrategy = require('./google-strategy');
// giving a name to a strategy so we can refer it in routes
passport.use('MyGoogleStrategy', googleStrategy);

并在您的 authenticate.ts 文件中

router.get('/google', passport.authenticate('MyGoogleStrategy', {scope: config.get('googleAuth.scope')}));

希望对您有所帮助!