介绍
GraphQL 是一种用于构建 API 的查询语言和运行时环境。它允许客户端精确地指定它需要的数据,并且可以在一个请求中获取多个资源。与 REST API 相比,GraphQL 更加灵活、高效和易于维护。
在 GraphQL 中,身份验证是一个非常重要的话题。JSON Web Token(JWT)是一种流行的身份验证协议,它可以在客户端和服务器之间传递安全的信息。在本文中,我们将介绍如何在 GraphQL 中使用 JWT 进行身份验证。
JWT 简介
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式来传输信息。JWT 由三部分组成:
- Header(头部):包含令牌的类型和使用的算法。
- Payload(载荷):包含令牌的声明和数据。
- Signature(签名):用于验证令牌是否被篡改。
JWT 可以在客户端和服务器之间传递安全的信息,如身份验证信息、授权信息等。它可以避免在每个请求中都进行身份验证,从而提高了应用程序的性能。
在 GraphQL 中使用 JWT 进行身份验证
在 GraphQL 中使用 JWT 进行身份验证需要完成以下步骤:
- 在服务器端生成 JWT。
- 将 JWT 发送给客户端。
- 客户端在每个请求中将 JWT 发送给服务器。
- 服务器验证 JWT,并根据 JWT 中的信息进行身份验证。
下面我们将一步一步地介绍如何在 GraphQL 中使用 JWT 进行身份验证。
生成 JWT
在服务器端生成 JWT 需要使用一个 JWT 库。在本文中,我们将使用 jsonwebtoken
库。首先安装 jsonwebtoken
库:
--- ------- ------------
然后在服务器端生成 JWT:
----- --- - ------------------------ ----- ---- - - --- -- --------- ---------- -- ----- ------ - ---------------- ----- ----- - -------------- ------- - ---------- ---- --- -------------------
在上面的代码中,我们定义了一个用户对象 user
,然后使用 jwt.sign()
方法生成 JWT。jwt.sign()
方法接受三个参数:
- 要在 JWT 中包含的数据。
- 用于加密 JWT 的密钥。
- 选项对象,包括过期时间等。
生成的 JWT 将被打印到控制台。
发送 JWT
在服务器生成 JWT 后,需要将 JWT 发送给客户端。在 GraphQL 中,可以将 JWT 添加到响应头中。例如,在 Express 中,可以使用以下代码将 JWT 添加到响应头中:
------------------------ ------- -----------
验证 JWT
在客户端发送请求时,需要将 JWT 添加到请求头中。例如,在 Apollo Client 中,可以使用以下代码将 JWT 添加到每个请求中:
------ - ------------- -------------- -------------- - ---- ----------------- ------ - ---------- - ---- ------------------------------ ----- -------- - ---------------- ---- ----------- --- ----- -------- - -------------- - ------- -- -- - ----- ----- - ------------------------------ ------ - -------- - ----------- -------------- ----- - ------- --------- - --- -- -- --- ----- ------ - --- -------------- ----- -------------------------- ------ --- ---------------- ---
在上面的代码中,我们定义了一个 authLink
,它使用 setContext()
方法将 JWT 添加到每个请求中。JWT 存储在本地存储中,可以使用 localStorage.getItem('token')
方法获取。
在服务器端验证 JWT 需要使用一个 JWT 库。在本文中,我们将使用 jsonwebtoken
库。首先安装 jsonwebtoken
库:
--- ------- ------------
然后在服务器端验证 JWT:
----- --- - ------------------------ ----- ------ - ---------------- ----- -------------- - ----- ---- ----- -- - ----- ---------- - -------------------------- -- ------------ - ----- ----- - ------------------ ------ --- - ----- ------------ - ----------------- -------- -------- - ------------- - ----- ----- - ------------------- - - ------- -- ------------------------
在上面的代码中,我们定义了一个中间件函数 authMiddleware
,它从请求头中获取 JWT,然后使用 jwt.verify()
方法验证 JWT。如果 JWT 验证成功,将在请求对象中添加一个 user
属性,其中包含 JWT 中的数据。
示例代码
下面是一个完整的示例代码,演示如何在 GraphQL 中使用 JWT 进行身份验证。
服务器端代码
----- ------- - ------------------- ----- - ------------- --- - - --------------------------------- ----- --- - ------------------------ ----- -------- - ---- ---- ---- - --- --- --------- ------- - ---- ----- - --- ---- - ---- -------- - --------------- -------- --------- --------- ------ - -- ----- ----- - -- --- -- --------- ----------- --------- -------- --- ----- ------ - ---------------- ----- ------------- - ------ -- - ----- ----- - -------------- ------- - ---------- ---- --- ------ ------- ---------- -- ----- -------------- - ----- ---- ----- -- - ----- ---------- - -------------------------- -- ------------ - ----- ----- - ------------------ ------ --- - ----- ------------ - ----------------- -------- -------- - ------------- - ----- ----- - ------------------- - - ------- -- ----- --------- - - ------ - --- --- --- - --- -- -- - ------ --------- -- -- --------- - ------ --- - --------- -------- -- -- - ----- ---- - ----------- ------ -- ------------- --- -------- -- ------------- --- -------- -- -- ------ - ----- ----- - -------------------- ------ ------ - ---- - ----- --- -------------- -------- -- ----------- - -- -- -- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- -- --- --- --- ----- --- - ---------- ------------------------ ------------------------ --- --- ------------ ----- ---- -- -- -- --------------- ------ ----- -- -------------------------------------------- --
客户端代码
------ ------ - -------- - ---- -------- ------ - ------------- -------------- -------------- - ---- ----------------- ------ - --------------- --------- ------------ --- - ---- ----------------- ------ - ---------- - ---- ------------------------------ ----- -------- - ---------------- ---- -------------------------------- --- ----- -------- - -------------- - ------- -- -- - ----- ----- - ------------------------------ ------ - -------- - ----------- -------------- ----- - ------- --------- - --- -- -- --- ----- ------ - --- -------------- ----- -------------------------- ------ --- ---------------- --- ----- -------- - ---- ----- - -- - -- -------- - - -- ----- -------------- - ---- ------------------- -------- ---------- -------- - --------------- ---------- --------- ---------- - -- ----- --- - -- -- - ----- ---------- ------------ - ------------- ----- ---------- ------------ - ------------- ----- - ----- -------- ----- - - ------------------- ----- ------- - --------------------------- - ------------ -- ----- -- -- - ----------------------------- ------- -- --- ----- ----------- - ----- -- -- - --- - ----- ------- ---------- - --------- -------- - --- - ----- ----- - ------------------- - -- -- --------- ------ ------------------ -- ------- ------ -------------- ------ - -- --------- - - --------- ----------------------- - - - -- ------ ----------- ---------------------- ---------------- ------------- -- ---------------------------- -- ------ --------------- ---------------------- ---------------- ------------- -- ---------------------------- -- ------- ------------------------------------ --- -- --- -- -- ----- ---------- - -- -- - --------------- ---------------- ---- -- ----------------- -- ------ ------- -----------
结论
在本文中,我们介绍了如何在 GraphQL 中使用 JWT 进行身份验证。我们首先介绍了 JWT 的基础知识,然后演示了如何在服务器端生成 JWT,并将其发送给客户端。我们还演示了如何在客户端将 JWT 添加到每个请求中,并在服务器端验证 JWT。最后,我们提供了一个完整的示例代码,演示了如何在 React 应用程序中使用 JWT 进行身份验证。
JWT 是一种非常流行的身份验证协议,它可以在客户端和服务器之间传递安全的信息。在 GraphQL 中使用 JWT 进行身份验证可以提高应用程序的性能和安全性。希望本文对你有所帮助,谢谢阅读!
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/672718b42e7021665e1c252b