获取NextAuth,Apollo Server上下文中的js用户会话

fiei3ece  于 2023-04-30  发布在  其他
关注(0)|答案(3)|浏览(133)

我的Web App正在使用:

  • NextJS
  • NextAuth.js
  • 阿波罗服务器

我在我的应用程序中设置了NextAuth,我可以很好地登录。
这个问题来自于试图访问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" });

问题是,会话(userSession)总是空的,即使我登录了(并且可以从适当的NextJS API路由中获得一个会话)。我的猜测是,因为NextAuth函数用于获取会话,所以getSession({ req })被传递给req--这是由Apollo Server Micro提供的,而不是由NextJS提供的(NextAuth期望的)。我已经做了很多搜索,找不到任何人谁有同样的问题。任何帮助是非常感谢!

nvbavucw

nvbavucw1#

我确实遇到了这个问题,我发现这是因为Apollo GraphQLPlayground。
playground不会发送没有"request.credentials": "include"的凭据。
我的NextAuth / GraphQL API看起来像这样:

import { ApolloServer } from "apollo-server-micro";
import { getSession } from "next-auth/client";
import { typeDefs, resolvers } "./defined-elsewhere"

const apolloServer = new ApolloServer({
  typeDefs,
  resolvers,
  context: async ({ req }) => {
    const session = await getSession({ req });
    return { session };
  },
  playground: {
    settings: {
      "editor.theme": "light",
      "request.credentials": "include",
    },
  },
});

希望这对你有用!

njthzxwz

njthzxwz2#

我刚刚遇到了类似的事情。我不是100%确定,因为很难知道确切的细节,因为你上面的示例代码没有显示你是如何从客户端与apollo交互的 * 在 * 会话作为null通过之前。然而,我相信你可能是在getStaticProps内部进行API调用,这会导致静态代码生成并在 * 构建时 * 运行-即当不可能存在这样的用户上下文/会话时。
参见https://github.com/nextauthjs/next-auth/issues/383
The getStaticProps method in Next.js is only for build time page generation (e.g. for generating static pages from a headless CMS) and cannot be used for user specific data such as sessions or CSRF Tokens.
另外,我不知道为什么你被否决了--这似乎是一个合法的问题,即使答案主要是一个标准的rtm:)。我以前也在这里发生过--你赢了一些,你输了一些:)干杯

chhqkbe1

chhqkbe13#

我试图获取ApolloServer context中当前登录用户的会话信息,但getSession()函数的响应为null。因此,我创建了我自己的函数,基本上从我的NextAuth端点从apollo服务器上下文中获取会话数据。
src/index.ts

context: async ({ req }): Promise<GraphQLContext> => {
  const session = await getServerSession(req.headers.cookie);
  return { session: session as Session, prisma };
}

getServerSession.ts

import fetch from "node-fetch";

export const getServerSession = async (cookie: string) => {
  const res = await fetch('http://localhost/api/auth/session',{
    headers: { cookie: cookie },
  });
  const session = await res.json();
  return session;
};

我希望这能帮助那些试图在apollo服务器上下文中获取会话信息,同时使用next-auth进行身份验证的人。

相关问题