如何使用 passportJS 策略与 ApolloServer 一起使用
import express from 'express'; import { Prisma } from '@peerpush/db'; import { ApolloServer } from '@apollo/server'; import { startStandaloneServer } from '@apollo/server/standalone'; import { typeDefs } from './src/graphql/schema/typeDefs.js'; import { resolvers } from './src/graphql/resolvers/index.js'; import passport from 'passport'; import { Strategy as GitHubStrategy } from 'passport-github2'; import session from 'express-session'; import dotenv from 'dotenv';
(async function () { dotenv.config(); const app = express(); const server = new ApolloServer({ typeDefs, resolvers, }); app.use(session({ secret: 'keyboard cat', resave: false, // don't save session if unmodified saveUninitialized: false, // don't create session until something stored }));
app.use(passport.authenticate('session')); app.get('/auth/GitHub',passport.authenticate('GitHub'));
passport.serializeUser(function(user, done) { done(null, user); });
passport.deserializeUser(function(obj, done) { done(null, obj); });
passport.use(new GitHubStrategy({ clientID: process.env['clientID']!, clientSecret: process.env['clientSecret']!, callbackURL: "/oauth2/redirect/GitHub" }, function(accessToken, refreshToken, profile, done) { console.log({accessToken, refreshToken, profile}); } ));
app.get('/login/federated/GitHub', passport.authenticate('GitHub'));
app.get('/oauth2/redirect/GitHub', passport.authenticate('GitHub', { successReturnToOrRedirect: '/', failureRedirect: '/login' }));
const { url } = await startStandaloneServer(server, {
listen: { port: 4000 },
});
console.log( Server ready at: ${url});
app.listen(4001,() => console.log('server'));
})().then(async () => { await Prisma.$disconnect(); }).catch(async (e) => { console.error(e); await Prisma.$disconnect(); process.exit(1); })
内容来源: jaredhanson/passport