简介
如今,用户认证与授权是任何一个 Web 应用程序的基本要求之一。在 GraphQL 中实现用户认证与授权是一项具有挑战性的任务,因为 GraphQL 本身是一种 Query 语言,它提供了一种声明性的方式来描述数据的形状和类型。还需要考虑安全性和可扩展性。在本文中,我们将探讨如何在 GraphQL 中实现用户认证与授权。
用户认证
在 GraphQL 中,用户认证通常分为两个阶段。首先,用户需要通过身份验证来证明自己的身份。第二,用户需要授权才能够使用特定资源。
身份验证
身份验证是一种通过检查用户的凭据,确定用户是否有权访问资源的过程。在 GraphQL 中,身份验证可以由调用方和服务器之间的加密方式和协议控制。在实现 GraphQL 应用程序时,可以使用以下技术进行身份验证:
- OAuth2:OAuth 2.0 是一种授权机制,它允许应用程序代表用户请求访问另一个应用程序的资源,以及获取访问令牌,用于将来访问授权服务器保护的资源。
- OpenID Connect:OpenID Connect 是一个基于 OAuth 2.0 的身份验证协议,它扩展了令牌功能,从而提供用户身份标识和认证。
在 GraphQL 中,通常需要在请求头中传递访问令牌或者授权码来实现身份验证。
授权
在完成身份验证后,下一步是授权。授权是一种确定用户是否有权访问资源的过程。GraphQL 提供了基于声明和满足角色需求的访问控制。
GraphQL 的请求和响应是声明性的。这就意味着调用方可以声明自己必须访问的数据和需要修改的数据,而服务器可以解释这些声明并确定哪些数据可以返回。在实现访问控制时,可以组合 Web 服务器技术,比如使用 JWT、OAuth 2.0 等。可以使用以下技术实现访问控制:
- JWT:JSON Web Tokens (JWTs) 是一种基于 JSON 的 Token 格式,它可以用于在多个系统之间安全地传递信息,并且包含有关用户的信息。
- OAuth 2.0:OAuth 2.0 不仅提供了身份验证,还提供了授权机制,从而使您能够在应用程序之间共享信息。
我们可以使用这些技术来在 GraphQL 中实现访问控制。
实现
这里我们用 JavaScript 示例代码来演示如何在 GraphQL 中实现用户认证与授权。
1. 使用 passport.js 进行身份验证
首先使用 passport.js 进行身份验证。Passport 是 Node.js 的身份验证中间件,支持多种策略,比如本地认证、OAuth2、OpenID 等。
首先安装 passport-js:
npm install passport passport-local
然后,在 Apollo Server 中添加 passport.js 策略:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------------- - ----------------------------------- ------------------------------- ---------------------------- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ------------ -- - ---------- ------ -- ------------ -- - --------- ------ --- --- ---------------- ------------------------ --------- ----- -- - -------------- --------- -------- -- ----- ----- -- - -- ----- - ------ ---------- - -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - -- ------------------------------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ --- ----
2. 实现 GraphQL 的身份验证
在 GraphQL 中处理身份验证是通过使用上下文来实现的。上下文在执行 Resolver 时传递给 Resolver 函数。
可以在 Apollo Server 的 context 配置中定义 context 函数,并在其中设置身份验证令牌:
-- -------------------- ---- ------- ----- ------------ - --- -------------- --------- ---------- -------- -- ---- --- -- -- - ------ - ---- ---- ------------ -------- -- - ---
在上下文中,我们将 req 和 res 传递给取消身份验证的端点,将 currentUser 设置为当前用户。
然后,我们可以在 GraphQL Resolvers 中使用上下文 currentUser 值来确定当前用户:
-- -------------------- ---- ------- ----- --------- - - ------ - --- --- ----- - ----------- -- -- - -- -------------- - ----- --- ---------- --- --- ---------------- - ------ -------------- ---- -------------- --- -- -- --
3. 实现 GraphQL 的授权
实现访问控制的方法之一是使用自定义 Scalars。在 GraphQL 中,Scalars 是指没有任何子字段的值类型。例如,日期和时间可以映射到 Scalar 值,而不需要嵌套的字段。自定义景点 Scalars 可以用于处理很多事情,比如必须是数字、字符串等。
我们可以自定义一个 Scalars,如下:
-- -------------------- ---- ------- ----- --------------- - ---- -- ------ ----- -------- ----- -- - -- ---------------------- - ----- --- ---------- --- --- ----------------- - ------ ---------- ----- -------- ------ -- ----- ------- - ---- -- ------ ----- -------- ----- -- - -- ------------------------------ - ----- --- ---------- --- --- -------------- - ------ ---------- ----- -------- ------ -- ----- -------- - ---- ------ ---- ---- ----- - --- ----- -------- ----- ----- ------ -------- - ---- -------- - ----------------- -------- -------- --------- ----- - ---- ---- - --- --- ------ ------- -------- ------- ---------- ----- ---------- ----- - ---- ---- - --- --- --------- ------- ------ ------- -------- ------- - --
在 Resolver 中使用它,如下:
-- -------------------- ---- ------- ----- --------- - - ------ - --- ------------------- ----- - ----------- -- -- - ------ -------------- ---- -------------- --- --- ----- ------------------- - -- -- -- - ------ -------------- ---- -- --- --- ------ ------------------- ----- - ----------- -- -- - ------ ----------- ---------- -------------- --- --- -- --------- - ----------- ----------- - ------ ------- -- -- - ----- ---- - --- ------ ------ -------- --- ------ ------------ --- -- --
以上代码将确保只有经过身份验证且是管理员的用户才能够创建 Post 的记录。
结论
在 GraphQL 中实现用户认证与授权可以成为一项具有挑战性的任务,但是我们可以使用一些有效的方式来解决这个问题。 在本文中,我们讨论了身份验证和访问控制的概念,以及如何在 GraphQL 中实现几种不同的认证和授权技术。我们还探讨了如何在 GraphQL Resolvers 中使用自定义 Scalars 来处理访问控制。现在我们已经有了一个可以在 GraphQL 中应用的基础模型,您可以使用它来启动自己的应用程序,并掌握身份验证和访问控制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6772113b6d66e0f9aad43e59