Graphql 在Apollo服务器上下文中获取nextuth.js用户会话

Graphql 在Apollo服务器上下文中获取nextuth.js用户会话,graphql,next.js,apollo-server,next-auth,Graphql,Next.js,Apollo Server,Next Auth,我的web应用正在使用: 下一代 nextuth.js 阿波罗服务器 我在我的应用程序中设置了Nextuth,我可以很好地登录 问题来自于试图在Apollo上下文中访问用户的会话。我希望将用户的会话传递到每个解析器。以下是我当前的代码: import { ApolloServer, AuthenticationError } from "apollo-server-micro"; import schema from "./schema"; impor

我的web应用正在使用:

  • 下一代
  • nextuth.js
  • 阿波罗服务器
我在我的应用程序中设置了Nextuth,我可以很好地登录

问题来自于试图在Apollo上下文中访问用户的会话。我希望将用户的会话传递到每个解析器。以下是我当前的代码:

import { ApolloServer, AuthenticationError } from "apollo-server-micro";
import schema from "./schema";
import mongoose from "mongoose";
import dataloaders from "./dataloaders";
import { getSession } from "next-auth/client";

let db;

const apolloServer = new ApolloServer({
  schema,
  context: async ({ req }) => {
    /*
    ...

    database connection setup
    
    ...
    */

    // get user's session
    const userSession = await getSession({ req });
    console.log("USER SESSION", userSession); // <-- userSession is ALWAYS null


    if (!userSession) {
      throw new AuthenticationError("User is not logged in.");
    }

    return { db, dataloaders, userSession };
  },
});

export const config = {
  api: {
    bodyParser: false,
  },
};

export default apolloServer.createHandler({ path: "/api/graphql" });
从“apollo server micro”导入{apollo server,AuthenticationError};
从“/schema”导入架构;
从“猫鼬”进口猫鼬;
从“/dataloaders”导入数据加载器;
从“下一个身份验证/客户端”导入{getSession};
让db;
const阿波罗服务器=新阿波罗服务器({
模式,
上下文:异步({req})=>{
/*
...
数据库连接设置
...
*/
//获取用户的会话
const userSession=wait getSession({req});

log(“用户会话”,userSession)/我遇到了类似的情况。我不是100%确定,因为很难知道确切的细节,因为上面的示例代码没有显示在会话为null之前,您是如何从客户端与apollo进行交互的。但是,我相信您可能是从
getStaticProps
w内部进行API调用的这会导致静态代码生成,并在构建时运行-即当不可能存在这样的用户上下文/会话时

Next.js中的getStaticProps方法仅用于生成构建时页面(例如,用于从无头CMS生成静态页面),不能用于特定于用户的数据,如会话或CSRF令牌。


另外,fwiw我不知道你为什么会被否决——这似乎是一个合法的问题,即使答案大多是标准的rtm:)。我以前也在这里遇到过这种情况——你赢了一些,你输了一些:)干杯

我确实遇到了这个问题,我发现这是因为阿波罗GraphQL游乐场

没有
“request.credentials:”include“
,游乐场不会发送凭据

我的NextAuth/GraphQL API如下所示:

从“apollo server micro”导入{apollo server};
从“下一个身份验证/客户端”导入{getSession};
导入{typeDefs,解析器}“/在别处定义”
const阿波罗服务器=新阿波罗服务器({
typeDefs,
解析器,
上下文:异步({req})=>{
const session=wait getSession({req});
返回{session};
},
游乐场:{
设置:{
“编辑.主题”:“光”,
“请求.凭据”:“包括”,
},
},
});

希望这对你有用!

嘿,谢谢!我没想到会得到答案:)我会考虑到这一点再进一步调查,然后再报告。不用担心-我希望这会有帮助:)如果有人使用Auth0+graphql:import{getSession}from'@Auth0/nextjs-Auth0'上下文:async args=>{const session=await getSession(args.req)return{user:session.user}}那么也许您没有尝试将
req
作为对象直接传递?
const userSession=await getSession(req)
您介意分享您的完整代码吗?我仍然无法获取req。您在
.createHandler
时设置了任何选项吗?