GraphQL 是一种通过 API 统一查询语言来描述客户端和服务器之间的数据传输协议。它广泛应用于现代 Web 应用开发中,因为可以轻松地管理复杂的数据模型和提高应用程序性能。在许多情况下,我们需要对 GraphQL 查询进行身份验证,以保护应用程序中的敏感信息。但是,如何在 GraphQL 中使用 JWT 进行身份验证呢?下面将详细介绍。
JWT 简介
JWT(JSON Web Token)是一种安全的身份验证机制,它使用 JSON 对象和数字签名来传输身份验证信息。它由三个部分组成:
<Header>.<Payload>.<Signature>
- Header:由两个部分组成,即类型(“JWT”)和使用的加密算法。
- Payload:包含身份验证的任何有用信息,例如用户 ID、用户名等。
- Signature:用于验证 Payload 的签名,以确保数据未被篡改。
在 GraphQL 中使用 JWT 进行身份验证
以下是在 GraphQL 中使用 JWT 进行身份验证的详细步骤:
1. 生成 JWT
将用户的 ID、用户名等信息包含在 JWT 的 Payload 中,并使用加密算法对其进行签名。在后端,您可以使用任何编程语言库来生成 JWT。下面是一个简单的 Node.js 例子:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ---- - - --- ------- --------- --------- -- ----- ----- - -------------- ------------ - ---------- ---- --- -------------------
- 第一个参数
user
是要包含在 Payload 中的用户信息。 - 第二个参数
secretkey
是要用于加密签名的密钥。 - 第三个参数
expiresIn
定义了 JWT 的有效期。
此段代码生成 JWT,其内容如下所示:
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEyMzQiLCJ1c2VybmFtZSI6ImpvaG5kb2UiLCJleHAiOjE2MTUxMTI5MzJ9.5cuZhJP5v5cARq3H5N5B5gUhKfRmlRDRzni8EUV5apw
2. 将 JWT 发送到客户端
在GraphQL返回用户数据之前,将 JWT 发送给客户端。这可以通过将其放置在响应体的 Authentication 首部字段中来实现,例如:
-- -------------------- ---- ------- - ------- - -------- - - ------- ----- ----- -------- --------------------- - - -- ---------- - ----------------- ------- -------------------------------------------------------------------------------------------------------------------------------------- - -
3. 解码 JWT
在客户端上,可以轻松地使用许多 JWT 库来解码 JWT。下面是一个使用 JavaScript 的例子:
const token = 'eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEyMzQiLCJ1c2VybmFtZSI6ImpvaG5kb2UiLCJleHAiOjE2MTUxMTI5MzJ9.5cuZhJP5v5cARq3H5N5B5gUhKfRmlRDRzni8EUV5apw'; const decodedToken = jwt.decode(token); console.log(decodedToken);
这应该输出用户信息的对象,其内容如下所示:
{ "id": "1234", "username": "johndoe", "exp": 1615112932 }
4. 在 GraphQL 中验证 JWT
使用解码后的 JWT Payload 中的用户信息,可以检查用户是否有权访问所需的 GraphQL 操作。例如,在 Node.js 中,可以编写一个中间件函数来验证 JWT:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ----------- - ----- ---- ----- -- - ----- ---------- - ------------------------------ ----- ----- - ---------- -- ------------------ ------ -- -------- ------ ---------------------------- ------- -- ----- ------------ --- - ----- ------- - ----------------- ------------- -------- - -------- ------- - ----- ---- - ----------------------------- --------- - -- -------------- - ------------
此中间件函数检查请求标头中是否存在 JWT,并验证其是否有效。如果有效,则在 req 对象中设置用户信息。在做出 GraphQL 查询之前使用此中间件来验证 JWT:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ----------- - ------------------------- ------------------- ----------------- -- -- ------- -------- - ----- -------- -- --------- ---- ----- ---------------- -- -- ------------------- ------- -- ---- --------
在这个例子中,将 JWT 解码后的用户信息存储在 req.user 中,并将其作为 GraphQL 上下文的一部分传递给解析器。在解析器中,可以检查用户信息并根据需要执行操作。
总结
- JWT 是一种安全的身份验证机制,用于在客户端和服务器之间传输身份验证信息。
- 在 GraphQL 中使用 JWT 进行身份验证,需要将 JWT 发送到客户端并在服务器上验证它。
- 在验证 JWT 时,需要检查 Payload 中的用户信息,并将其存储在 GraphQL 上下文中。
- 在解析器中,可以检查上下文信息并根据需要执行操作。
此外,为了加强安全性,您可以选择使用 HTTPS 连接来加密数据传输。希望本文能够帮助你更好地保护你的 GraphQL 应用程序中的敏感信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646addd5968c7c53b0a55d24