GraphQL 是一种现代的 Web API 查询语言,JWT (JSON Web Tokens) 是一种轻量级的用户身份验证和授权机制。在应用程序中,我们通常使用 GraphQL 来提供易于使用和可靠的 API,同时使用 JWT 进行身份验证和授权。在本文中,我们将介绍如何在 GraphQL 中使用 JWT 验证,并提供示例代码以指导您完成此过程。
什么是 JWT
JSON Web Tokens (JWTs) 是一种开放标准 (RFC 7519),用于通过网络安全地在各方之间传输声明。JWT 可以使用对称 (HS256、HS384、HS512) 或非对称 (RS256、RS384、RS512、ES256、ES384、ES512) 加密算法签名。在身份验证和授权方面,JWT 通常包含身份验证信息 (如用户 ID) 和应该被授权的操作 (如读/写)。JWT 是 Web 应用程序中保护 API 的有力工具。
一个 JWT 令牌通常由三部分组成:标头,有效负载和签名。
标头包含令牌的元数据和加密算法的类型。
有效负载包含令牌中包含的数据。有效载荷包含声明,这是使用 JSON 表示的键值对集。有三种类型的声明:注册声明、公共声明和私有声明。注册声明是预定义的声明,用于描述 JWT。一般来说,公共声明包含与 JSON 对象相同的信息。私有声明包含自定义类的信息。
标头和有效载荷使用 Base64 URL 编码。
签名在服务器端由密钥生成,并用于验证令牌的真实性。
在 GraphQL 中使用 JWT 验证
下面是在 GraphQL 中使用 JWT 验证的步骤,其中涉及了两个 GraphQL 库:express-graphql 和 express-jwt。
步骤1:安装所需的库
在项目目录下打开终端(或控制台),并运行以下命令:
--- ------- --------------- ----------- ------------
步骤2:导入所需的库
首先,我们将需要导入所需的库和模块。请注意,jsonwebtoken 模块用于创建和验证令牌。这是一个示例代码片段,您需要根据您的项目结构进行修改。
-- --------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ----------- - --------------------------- ----- --- - ------------------------ ----- ------ - -------------------- ----- --------- - ----------------------- ----- - ---- - - ---------------------
步骤3:定义 JWT 的密钥
我们需要定义一个密钥,以便我们在服务器上创建和验证令牌。您应该使用随机生成的字符串作为密钥,而不是硬编码密钥值。在本示例中,我们使用了“my-secret-key”。
-- -- --- -- ----- -------------- - ----------------
步骤4:创建 GraphQL 服务器
接下来,我们将创建一个 GraphQL 服务器,该服务器将处理所有 GraphQL 查询和突变。
-- -- ------- --- ----- ------ - ---------- ----------- -- -- --- ------------ ------- --------------- ----------- --------- ----------- ----- ---------- -- -- ----------- -- -- ------- ----- ----------- --------------- -- -- ------- ------- ---------- ---------- --------- ----- -------- ----- -- -- - ----- ---- - ----- -------------- ---- ------------ --- ------ - ---- -- - --- --
请注意,此代码段包括 expressJwt 中间件和 GraphQL 数据查询和突变。我们还为 GraphQL 查询设置了上下文 context,以便我们稍后可以使用此上下文进行验证。
步骤5:定义 GraphQL 查询
我们需要定义一些 GraphQL 查询,以便客户端可以请求相关数据。以下示例包含查询所有用户和查找指定用户。
-- -- ------- -- ----- - - ------ ------ ------- - - -- ---- ------------ ----- ---- -
步骤6:定义 GraphQL 突变
我们还需要定义一些 GraphQL 突变(用于操作数据),以便客户端可以执行其权限允许的操作。以下示例包含创建用户和更新用户的突变。
-- -- ------- -- -------- - - ----- ----------------- ------------------ ---- - ---- -------------- ---- ------ ------------------ ---- -
步骤7:验证 JWT 令牌
在本例中,我们已针对所有 GraphQL 查询和突变实现了身份验证。如果客户端将有效令牌作为身份验证头发送,则服务器将通过 expressJwt 中间件验证该令牌。请注意,我们忽略了针对“/登录”路径的身份验证,以便客户端可以通过登录服务获取新的令牌。以下是一个示例代码片段,它验证了 JWT 令牌是否有效:
-- -- --- ------ ----- - -------------- - - --------------------- ----- ----- - --------------------------------- ------ ----------------- --------------- ----- -------- -- - -- ----- - ------ ---------------------- -------- -------- ------ --- - -------- - -------- ------- ---
步骤8:示例代码
以下是一个完整的示例代码,以帮助您更好地理解如何在 GraphQL 中使用 JWT 验证。
-- --------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ----------- - --------------------------- ----- --- - ------------------------ ----- ------ - -------------------- ----- --------- - ----------------------- ----- - ---- - - --------------------- -- -- --- -- ----- -------------- - ---------------- -- -- ------- --- ----- ------ - ---------- ----------- -- -- --- ------------ ------- --------------- ----------- --------- ----------- ----- ---------- -- -- ----------- -- -- ------- ----- ----------- --------------- -- -- ------- ------- ---------- ---------- --------- ----- -------- ----- -- -- - ----- ---- - ----- -------------- ---- ------------ --- ------ - ---- -- - --- -- -- -- ------- -- ----- ----- - - ----- - ------ ------- ------------ ----- ---- - -- -- -- ------- -- ----- -------- - - -------- - ----------------- ------------------ ---- -------------- ---- ------ ------------------ ---- - -- -- -- --- ------ ----- - -------------- - - --------------------- ----- ----- - --------------------------------- ------ ----------------- --------------- ----- -------- -- - -- ----- - ------ ---------------------- -------- -------- ------ --- - -------- - -------- ------- ---
结论
在本文中,我们介绍了如何在 GraphQL 中使用 JWT 验证。我们引入了 JWT 和其工作原理,示范了在 GraphQL 中包含 JWT 验证所需的步骤,并提供了示例代码以供参考。我们希望这篇文章能够帮助您学习如何在 GraphQL 中使用 JWT 验证,以便您可以在开发项目中实现身份验证和授权。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6735cdec0bc820c582509152