GraphQL 是一种新型的 API 技术,旨在改善传统 RESTful API 的缺陷。其中,认证和授权是构建安全和可靠 API 的必要组成部分。JWT(JSON Web Token)是一种流行的认证和授权机制,它具有可扩展性和灵活性。在本文中,我们将讨论如何在 GraphQL 中使用 JWT 实现认证和授权。
JWT 简介
JWT 是在网络上安全地传输信息(尤其是在身份验证方面)的一种简洁的、URL 安全的、具有自包含性的数据格式。JWT 由三个部分组成,分别为头部、载荷和签名。
头部包含了 JWT 使用的加密算法和类型信息:
{ "alg": "HS256", "typ": "JWT" }
载荷包含了 JWT 所要存储的信息,如用户的 ID、用户名等:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
签名部分使用头部中定义的加密算法和密钥对头部和载荷进行加密,确保信息的完整性和安全性。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
在 GraphQL 中添加 JWT 认证和授权
要在 GraphQL 中实现 JWT 认证和授权,我们需要使用一个流行的 GraphQL 库,例如 apollo-server-express
, 它基于 Express。 在代码中安装 jsonwebtoken
库 以便生成和验证 JWT。我们将编写一个 GraphQL 解析器,该解析器将从 HTTP headers 中提取 JWT 并验证其身份。
步骤一:安装所需的库
我们需要在代码中安装 jsonwebtoken
库以生成和验证 JWT,apollo-server-express
库将用于设置 GraphQL 服务器和路由处理程序,express
库将用于添加中间件和路由处理程序。
npm install apollo-server-express express jsonwebtoken
步骤二:创建 JWT 设置配置项
我们需要为生成 JWT 设置一些必要的配置项。以下是一个示例的配置项,它将包含加密和解密 JWT 所使用的密钥、算法和到期时间。
-- -------------------- ---- ------- ----- -------------- - ---------------- ----- ------------- - -------- ----- -------------- - ----- ----- ----------- - - ------- --------------- ---------- -------------- ---------- --------------- --
步骤三:生成 JWT
我们将创建一个函数,该函数将使用 jwtSettings 对象中的密钥、算法和到期时间信息生成 JWT 并返回其字符串表示形式。下面是一个示例 JWT 生成函数:
const jwt = require("jsonwebtoken"); function createToken(payload) { return jwt.sign(payload, jwtSettings.secret, { algorithm: jwtSettings.algorithm, expiresIn: jwtSettings.expiresIn, }); }
步骤四:验证 JWT
我们将创建一个中间件函数,该函数将使用 JWT 中的密钥、算法和在配置项中设置的到期时间信息将 JWT 进行验证。 如果 JWT 验证成功则将继续执行相应处理程序,否则,将返回错误代码。
-- -------------------- ---- ------- -------- ---------------- ---- ----- - -- ------ --- ----- ---------- - -------------------------- -- ------------- - ----------------------------------- ------- ------------- --------- ------- - ----- ----- - ------------------ ------ -- -------- - ----------------------------------- ------- -------- ------- - --- - -- -- --- ----- ------------ - ----------------- ------------------- - ----------- ------------------------ --- --------- - ------------- ------- - ----- ----- - ----------------------------------- ------- -------- - -
步骤五:设置 GraphQL 服务器
我们将创建一个 GraphQL 服务,该服务将包含使用上述中间件函数的路由。我们将进行以下操作:
- 在路由中定义中间件函数的处理程序
- 将路由添加到 express 应用程序中
- 使用
apollo-server-express
库设置 GraphQL 服务器
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ------------- --- - - --------------------------------- ----- --- - ---------- -- ------- --------------------- -- -------- ------------ ----- ---- -- - ----------------- -- -- ------- --------- --- -- -- ------- ------ ----- -------- - ---- ---- ----- - ------ ------ - -- -- -- ------- -------- ----- --------- - - ------ - ------ -------- ----- - ----- -- -- - ------ ------- --------------- -- -- -- -- -- ------- --- ----- ------ - --- -------------- --------- --------- --- ------------------------ --- --- -- -- ------- ---- ---------------- -- -- - ------------------- ----- -- -------------------------------- ---
这个示例中 'Hello, ${token.name}' 返回了用户的名称,提供认证授权功能。
步骤六:测试 GraphQL 服务器
现在我们已经设置了 GraphQL 服务器,我们可以使用任何类似于 GraphiQL、Apollo Client 的 GraphQL 客户端测试工具来进行测试。
在 HTTP headers 中添加 JWT,key 为 'Authorization', value 为 Bearer <token>
, 其中 <token>
是 JWT 签名。
query { hello }
你会得到模仿这个形式的结果:
{ "data": { "hello": "Hello, John Doe" } }
结论
GraphQL 是一种在 API 开发中相当流行的技术,而 JWT 是一种流行的认证和授权机制。使用这两种技术的结合,您可以创建安全的、可靠的 GraphQL API。本文介绍了如何在 GraphQL 中使用 JWT 实现认证和授权,并讨论了相关代码和配置。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fce5304471362601745cb0