passport.js+;express+;阿波罗服务器,请求用户未定义

passport.js+;express+;阿波罗服务器,请求用户未定义,express,graphql,passport.js,apollo-server,Express,Graphql,Passport.js,Apollo Server,我试图通过sequelize在数据库中记录会话,使其无服务器,但req.user始终未定义,我尝试了在internet上找到的所有手册,我不明白为什么它不起作用 我试过passport.js手册、express手册和github gists 数据库中的记录在成功身份验证时成功创建,但当我尝试点击/graphql端点时,它不会用user填充req.user req.user应基于存储在数据库中的会话哈希恢复 #!/usr/bin/env node import express from 'expr

我试图通过sequelize在数据库中记录会话,使其无服务器,但
req.user
始终未定义,我尝试了在internet上找到的所有手册,我不明白为什么它不起作用

我试过passport.js手册、express手册和github gists

数据库中的记录在成功身份验证时成功创建,但当我尝试点击
/graphql
端点时,它不会用user填充
req.user

req.user
应基于存储在数据库中的会话哈希恢复

#!/usr/bin/env node
import express from 'express';
import session from 'express-session';
import { ApolloServer } from 'apollo-server-express';
import { typeDefs, resolvers } from './graphql';
import orm from './orm';
import compose from './dataloader/status.dataloader';
import passport from 'passport';
import { Strategy as GitHubStrategy } from 'passport-github';
import cors from 'cors';

const app = express();

const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({ req }) => {
        const user = req.user;
        console.log({ user });
        return {
            user,
            orm,
            dataloader: compose(orm),
        };
    },
});

passport.use(
    new GitHubStrategy(
        {
            clientID: process.env.GITHUB_CLIENT_ID,
            clientSecret: process.env.GITHUB_CLIENT_SECRET,
            callbackURL: `/auth/github/callback`,
        },
        async (accessToken, refreshToken, profile, done) => {
            const { provider, id: externalId, profileUrl, username, displayName, photos } = profile;
            const photo = photos && photos[0] && photos[0].value;

            const user = await orm.User.findOne({
                include: [
                    {
                        attributes: [],
                        model: orm.UserProvider,
                        where: {
                            provider,
                            externalId,
                        },
                    },
                ],
                raw: true,
            }).then(async (v) => {
                if (null !== v) {
                    return v;
                }

                v = await orm.User.create({
                    displayName,
                    photo,
                });

                await orm.UserProvider.create({
                    provider,
                    internalId: v.id,
                    externalId,
                    username,
                    profileUrl,
                });

                return v;
            })

            const session = await orm.UserSession.create({
                internalId: user.id,
                hash: accessToken,
            });

            return done(null, session);
        }
    )
);

passport.serializeUser(({ hash }, done) => {
    console.log({ hash });
    done(null, hash);
});
passport.deserializeUser(async (hash, done) => {
    console.log({ hash });
    const user = await orm.User.findOne({
        include: [
            {
                attributes: [],
                model: orm.UserSession,
                where: {
                    hash,
                },
            },
        ],
        raw: true,
    });

    done(null, user);
});

app.use(
    cors({
        origin: "*",
        methods: "GET,POST",
        preflightContinue: false,
        optionsSuccessStatus: 204,
        credentials: true,
    })
);

app.use(session({ secret: 'test' }));
app.use(passport.initialize());
app.use(passport.session());

app.get(
    '/auth/github',
    passport.authenticate('github', { session: true })
);
app.get(
    '/auth/github/callback',
    passport.authenticate('github', { session: true }),
    (req, res) => res.redirect('/')
);
app.use('/graphql', passport.authenticate('session', { session: true }));
// (req, res, next) => {
//     debugger;
//     // passport.
//     console.log({
//         req,
//         session: JSON.stringify(req.session, ',', 4),
//         cookie: JSON.stringify(req.cookie),
//         user: req.user,
//     });

//     return next();
// });

server.applyMiddleware({ app, path: '/graphql' });
app
    .listen(process.env.PORT, () => {
        console.log(`GraphQL ready on: http://localhost:${process.env.PORT}/graphql`);
    });

你是如何到达你的
/graphql
端点的?@Jim,通过浏览器作为GET,我希望cookie被持久化,这样我就可以通过POSTIs
用户
cookie联系到我?在这种情况下,我相信
cookies
在您的
req
对象
app.use(session({secret:'test'))中
app.use(passport.initialize())
app.use(passport.session())根据文档就足够了,我调试了更多似乎passport使用户:
{url:'http://localhost:8081/graphql“,
`user:`{id:2,`displayName:'xxx'.`photo:'xxx},`session:`session{`cookie:`{path:'/'、```u expires:null、`originalMaxAge:null、`httpOnly:true}、`passport:{user:'xxx'}、`cookie:undefined}但是在第二次重新加载后,由于某种原因,它消失了我正在调试这个问题,我想我已经把它锁定到了问题级别: