首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Next.js/Next.js/阿波罗/GraphQL安装程序

Next.js/Next.js/阿波罗/GraphQL安装程序
EN

Stack Overflow用户
提问于 2021-10-16 00:56:28
回答 1查看 784关注 0票数 1

我正在寻找关于如何接近使用阿波罗和GraphQL访问PostgreSQL数据库的GraphQL前端的建议。我觉得把前端和后端分开是有意义的,但我意识到这是有权衡的。Next.js和NextAuth.js在使用Next.js API功能时似乎设计得很好。

以下几项要求:

  1. 数据需要根据用户(公共、内部、管理)进行限制。
  2. 使用Google OAuth登录

考虑到这一点,如果希望后端知道用户的访问权限,NextAuth.js就会变得更加复杂。

但是,如果我的阿波罗/graphql后端是独立的,那么肯定有如下好处:

  1. 如果需要的话,我可以换掉前端,这样就有了一些灵活性
  2. 代码和依赖项可能比组合的前端/后端更简单。

我目前面临的挑战是,我让NextAuth.js在Next.js应用程序中工作,但我还没有弄清楚如何控制数据访问。到目前为止,我得到的最好的想法是将NextAuth.js和后端混合在一起的某种令牌管理。不过,NextAuth.js的设计方式似乎并不是这样,所以我正在重新思考整个体系结构,并寻求建议。

谢谢!

我在这里发现了一个关于类似问题的非常简短的讨论,但我很想听听其他人会如何处理这个问题。如何在Next.js + Graphql解耦体系结构中转发用户会话?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-17 01:06:17

我将尽我最大的努力给出一个相当通用的答案,使用JWT进行授权,但我需要做一些假设,因为我对谷歌OAuth和相关的谷歌系统并不十分熟悉。

首先,也是最重要的一点是,必须澄清身份验证、“您是谁”和“授权”或“您可以做什么”之间的区别。

到目前为止,我得到的最好的想法是将NextAuth.js和后端混合在一起的某种令牌管理。不过,NextAuth.js的设计方式似乎并不是这样,所以我正在重新思考整个体系结构,并寻求建议。

NextAuth是一个身份验证库,是NextAuth创建的JWT的不支持外部验证,所以您不想将NextAuth与后端混为一谈是正确的。当有人登录NextAuth时,创建一个特定于NextAuth的JWT (一个ID令牌),该标记将在客户机和下一个服务器之间传递。它告诉您用户是谁,并证明他们已经登录。除非您使用的是数据库会话,我还没有使用过,所以无法与其对话。

实现授权需要额外的工作,这样您就有了一个JWT,该JWT还描述了用户拥有什么样的访问权限,并且可以传递给后端。

理想情况下,您将能够利用Google OAuth来实现这一点,假设是这样的话,我将这样做:

为建筑设计

  • 我对GraphQL/阿波罗不是很熟悉,但是分离似乎很好。不过,需要注意的是,不分离也可能是好的。任何方法都会有权衡,所以您必须评估哪种方法最适合您的情况。
  • 每当您对后端进行调用时,都会以Authorization的形式将调用作为Bearer <token>头传递给JWT。
  • 然后,在后端,使用每个传入呼叫验证令牌,并允许调用进行(或不进行)。

我在阿波罗的医生里发现了这是相关信息

作为象征

在NextAuth提供程序配置中,可以在jwt回调中向NextAuth JWT添加信息。

理想情况下,您的Google还为您提供了一个JWT (访问令牌)。这应该是应该是相对容易在后端进行验证的东西,这就是您想要用于授权的东西。

当用户第一次登录时,您可以将这个Google (访问令牌)存储在OAuth JWT (id令牌)中,然后在调用NextAuth后端之前在Next.js服务器上检索它。看起来是这样的:

代码语言:javascript
复制
// [...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流中获得可用的东西,这会变得更加复杂,您将不得不构建一些自定义的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69591913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档