Express 在Next.js、graphQL、Apollo客户端中实现身份验证
我正在尝试在前端使用NextJS和apollo客户端构建SSR应用程序,在后端使用graphql和express(graphql瑜伽)构建graphql应用程序 我来自客户端渲染背景,在身份验证方面比SSR更简单,在常规客户端渲染中,我对用户进行身份验证的方法如下: 1-一旦用户在服务器验证后登录,使用当前用户数据签署JWT,然后将其发送到客户端,并将其保存在localstorage或Cookie等中 2-实现一个Express 在Next.js、graphQL、Apollo客户端中实现身份验证,express,cookies,graphql,next.js,apollo-client,Express,Cookies,Graphql,Next.js,Apollo Client,我正在尝试在前端使用NextJS和apollo客户端构建SSR应用程序,在后端使用graphql和express(graphql瑜伽)构建graphql应用程序 我来自客户端渲染背景,在身份验证方面比SSR更简单,在常规客户端渲染中,我对用户进行身份验证的方法如下: 1-一旦用户在服务器验证后登录,使用当前用户数据签署JWT,然后将其发送到客户端,并将其保存在localstorage或Cookie等中 2-实现一个loadUser()函数,并在(根)应用程序组件的useffect钩子中调用它,以
loadUser()
函数,并在(根)应用程序组件的useffect
钩子中调用它,以便在每个组件(页面)中加载用户(如果本地存储中的JWT有效)
3-如果JWT不存在或无效,只需将用户返回为null并重定向到登录页面
因此,在Next.js中,我知道我们无法访问localstorage,因为它在服务器端工作,所以我们只需将令牌保存在cookie中,我实施的方法很痛苦,我想知道是否有一种更简单的方法,我的方法如下:
1-一旦用户登录,他调用登录变异,在req头中设置cookie,并返回用户和我想要的任何数据。
2-在每个需要身份验证的页面中,我需要从cookie中获取令牌以将其发送回标头中,我在getInitialProps()
或getServerSideProps()
中这样做,因为两者都在服务器端运行,并且可以访问标头中的请求cookie,如下所示:
export const getServerSideProps = async ctx => {
const apolloClient = initializeApollo();
// get the cookies from the headers in the request object
const token = ctx.req.headers.cookie ? ctx.req.headers.cookie : null;
return {
props: {
initialApolloState: apolloClient.cache.extract(),
token: token
}
};
};
现在我可以访问页面道具中的令牌,并可以使用apollo客户端将令牌与req头一起发送回去,如下所示:
let getUserQuery = await apolloClient.query({
query: GET_USER_QUERY,
variables: { id: ctx.params.id },
context: { headers: { token: token } }
});
现在我可以访问服务器端请求中的令牌,如req.headers.token
我想要达到的目标:
1-是否有一种更简单的方法来实现loadUser()
,即用我可以在next.js custom\u应用程序中实现的每个页面呈现加载用户,我发现,但它不会像他在回答中提到的那样在所有组件中返回auth object或user
2-我读到,如果我设置cookies httpOnly和凭据:“include”
我可以在每个请求中访问cookie,但它似乎不适用于apollo客户端,如果有其他方法,那就太棒了
3-阿波罗团队提供了apollo链接上下文
,我可以使用setContext()
发送每个请求头中的令牌或任何值,如下所示:
const authLink = setContext((_, { headers }) => {
// get the authentication token from local storage if it exists
const token = localStorage.getItem('token');
// return the headers to the context so httpLink can read them
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : "",
}
}
});
但由于我不能访问本地存储,所以无法实现它,因为下一个运行的是服务器端,所以如果任何人都有一个实现,请考虑共享。
另外,我在搜索和阅读了大约一周后发了这条帖子,这是我最后一次向你们提问,并提前表示感谢。通过商店获得代币
store.getState()…path.to.your.token
问题是当盲板改变时,令牌没有完全更新,我正在寻找解决方案。按存储获取令牌
store.getState()…path.to.your.token
问题是,当盲板改变时,令牌没有完全更新,我正在寻找解决方案。hi,你有没有找到任何解决方案将apollo客户端与Next.js集成的最佳方法?@ShubhamKumar hi Shubham,我所做的是:1-一旦用户登录,我将JWT保存在cookie中,因为您无法访问nextJs中的localstorage。2-在您的自定义应用程序中您可以通过
ctx.req.headers.cookie
访问cookie-使用GQL和apollo,我进行了一个查询,如果有登录用户,则获取当前登录用户,并将其称为me
我在_应用程序中发送了从该查询中获取的数据,您可以像let me=props.meQuery
并将其发送给所有公司
检查这里嗨,你有没有找到将apollo客户端与Next.js集成的最佳解决方案?@ShubhamKumar hi Shubham,我所做的是:1-一旦用户登录,我将JWT保存在cookie中,因为你无法访问nextJs中的本地存储。2-在您的自定义应用程序中您可以通过ctx.req.headers.cookie
访问cookie-使用GQL和apollo,我进行了一个查询,如果有登录用户,则获取当前登录用户,并将其称为me
我在_应用程序中发送了从该查询中获取的数据,您可以像let me=props.meQuery代码>并将其发送给所有公司
在此处检查