React、Graphql 和 Passport.js

Posted

技术标签:

【中文标题】React、Graphql 和 Passport.js【英文标题】:React, Graphql & Passport.js 【发布时间】:2019-08-16 09:32:55 【问题描述】:

我正在尝试使用 passport.js 设置 graphql,在服务器端似乎一切正常,但是在客户端,当我检查当前登录的用户(req.user)时,我得到了未定义,而在服务器端,我确实得到了当前用户

我在 localhost:4000 上运行我的服务器,在 localhost:3000 上运行客户端。

我的一些配置如下:

我已尝试更改客户端的凭据以及服务器端的 cors

服务器配置

app.use(
    session(
        resave: false,
        saveUninitialized: false,
        secret,
        store: new MongoStore(
            url: MONGO_URI,
            autoReconnect: true
        ),
        cookie: 
            maxAge: 1000 * 60 * 60 * 2
        
    )
);

const server = new ApolloServer(
    typeDefs,
    resolvers,
    // required for passport req.user access
    playground:  settings:  'request.credentials': 'include'  ,
    // so we have access to app req,res through graphql
    context: ( req, res ) => (
        req,
        res
    )
);

server.applyMiddleware( app );

客户端配置

const cache = new InMemoryCache();
const link = new HttpLink(
    uri: 'http://localhost:4000/graphql',
    credentials: 'same-origin',
);

const client = new ApolloClient(
    cache,
    link,
);

我希望能够在客户端访问获取当前登录的用户(反应)

【问题讨论】:

【参考方案1】:

以防万一有人遇到同样的问题,我们需要解决一些问题才能使其正常工作:

在客户端:

const link = createHttpLink(
    uri: 'http://localhost:4000/graphql',
    credentials: 'include',
);

在服务器中:

// pass types and resolvers
const server = new ApolloServer(
    typeDefs,
    resolvers,
    // required for passport req.user access
    playground:  settings:  'request.credentials': 'include'  ,
    // so we have access to app req,res through graphql
    context: ( req, res ) => (
        req,
        res
    )
);

server.applyMiddleware(
    app,
    cors:  origin: 'http://localhost:3000', credentials: true 
);

它对我有用:)

【讨论】:

感谢您澄清这一点。我在这方面工作了一段时间,但在服务器端工作但在客户端却没有同样的错误。现在一切都好!

以上是关于React、Graphql 和 Passport.js的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Passport 对 GraphQL 端点进行身份验证?

使用 express js、passport s 保护 GraphQL 查询

NestJS:使用 graphql 的 Passport LinkedIn 策略

连续登录后未定义 Passport context.req.user (express/graphql)

Passport (oAuth2) 如何与 GraphQL (TypeGraphQL) 一起使用?

带有 Passport JWT 的 Apollo 服务器