如何解决在 Apollo Server 上下文中获取 NextAuth.js 用户会话
我的网络应用正在使用:
- 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 期望的)。我已经做了很多搜索,但找不到任何遇到同样问题的人。非常感谢任何帮助!
解决方法
我遇到了这个问题,我发现这是因为 Apollo GraphQL playground。
如果没有 "request.credentials": "include"
,playground 不会发送凭据。
我的 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",},});
希望这对你有用!
,我刚刚遇到了类似的情况。我不是 100% 确定,因为很难知道确切的细节,因为上面的示例代码没有显示您如何在会话以空值之前 与客户端的 apollo 进行交互。但是,我相信您可能正在从 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 :),这似乎也是一个向 imo 提出的合法问题。我以前也遇到过 - 你赢了一些你输了一些:)干杯
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。