我的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期望的)。我已经做了很多搜索,找不到任何人谁有同样的问题。任何帮助是非常感谢!
3条答案
按热度按时间nvbavucw1#
我确实遇到了这个问题,我发现这是因为Apollo GraphQLPlayground。
playground不会发送没有
"request.credentials": "include"
的凭据。我的NextAuth / GraphQL API看起来像这样:
希望这对你有用!
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:)。我以前也在这里发生过--你赢了一些,你输了一些:)干杯
chhqkbe13#
我试图获取
ApolloServer context
中当前登录用户的会话信息,但getSession()
函数的响应为null。因此,我创建了我自己的函数,基本上从我的NextAuth端点从apollo服务器上下文中获取会话数据。src/index.ts
getServerSession.ts
我希望这能帮助那些试图在apollo服务器上下文中获取会话信息,同时使用next-auth进行身份验证的人。