我正在寻找关于如何接近使用阿波罗和GraphQL访问PostgreSQL数据库的GraphQL前端的建议。我觉得把前端和后端分开是有意义的,但我意识到这是有权衡的。Next.js和NextAuth.js在使用Next.js API功能时似乎设计得很好。
以下几项要求:
考虑到这一点,如果希望后端知道用户的访问权限,NextAuth.js就会变得更加复杂。
但是,如果我的阿波罗/graphql后端是独立的,那么肯定有如下好处:
我目前面临的挑战是,我让NextAuth.js在Next.js应用程序中工作,但我还没有弄清楚如何控制数据访问。到目前为止,我得到的最好的想法是将NextAuth.js和后端混合在一起的某种令牌管理。不过,NextAuth.js的设计方式似乎并不是这样,所以我正在重新思考整个体系结构,并寻求建议。
谢谢!
我在这里发现了一个关于类似问题的非常简短的讨论,但我很想听听其他人会如何处理这个问题。如何在Next.js + Graphql解耦体系结构中转发用户会话?
发布于 2021-10-17 01:06:17
我将尽我最大的努力给出一个相当通用的答案,使用JWT进行授权,但我需要做一些假设,因为我对谷歌OAuth和相关的谷歌系统并不十分熟悉。
首先,也是最重要的一点是,必须澄清身份验证、“您是谁”和“授权”或“您可以做什么”之间的区别。
到目前为止,我得到的最好的想法是将NextAuth.js和后端混合在一起的某种令牌管理。不过,NextAuth.js的设计方式似乎并不是这样,所以我正在重新思考整个体系结构,并寻求建议。
NextAuth是一个身份验证库,是NextAuth创建的JWT的不支持外部验证,所以您不想将NextAuth与后端混为一谈是正确的。当有人登录NextAuth时,创建一个特定于NextAuth的JWT (一个ID令牌),该标记将在客户机和下一个服务器之间传递。它告诉您用户是谁,并证明他们已经登录。除非您使用的是数据库会话,我还没有使用过,所以无法与其对话。
实现授权需要额外的工作,这样您就有了一个JWT,该JWT还描述了用户拥有什么样的访问权限,并且可以传递给后端。
理想情况下,您将能够利用Google OAuth来实现这一点,假设是这样的话,我将这样做:
为建筑设计
Authorization的形式将调用作为Bearer <token>头传递给JWT。我在阿波罗的医生里发现了这是相关信息。
作为象征
在NextAuth提供程序配置中,可以在jwt回调中向NextAuth JWT添加信息。
理想情况下,您的Google还为您提供了一个JWT (访问令牌)。这应该是应该是相对容易在后端进行验证的东西,这就是您想要用于授权的东西。
当用户第一次登录时,您可以将这个Google (访问令牌)存储在OAuth JWT (id令牌)中,然后在调用NextAuth后端之前在Next.js服务器上检索它。看起来是这样的:
// [...nextauth].js
const options = {
// ... other configuration
callbacks: {
jwt: async (token, user, account, profile, isNewUser) => {
const isSignIn = !!user
if (isSignIn) {
token.b2c = {
accessToken: account.accessToken,
refreshToken: account.refreshToken,
iat: profile.iat,
exp: profile.exp,
}
}
return Promise.resolve(token)
}
}
}这是我使用的配置中的一个简化示例。我的配置是为Azure B2C,但它是相同的一般流程,您正在寻找。你可以在这里看到我的全部配置,它显示了一些额外的代码,用于根据需要处理刷新访问令牌。
如果您没有从Google OAuth流中获得可用的东西,这会变得更加复杂,您将不得不构建一些自定义的东西。
https://stackoverflow.com/questions/69591913
复制相似问题