前言
GraphQL 作为现代化的 API 查询语言,已经被广泛应用于 Web 开发中,成为前端与后端进行数据通信的主要方式之一。在大多数情况下,对接口进行认证授权是必要的。JSON Web Token(JWT)是一种常用的身份认证方式,其相比于传统的 cookie 和 session 机制更加灵活和安全。在本文中,我们将介绍在 GraphQL 中使用 JWT 实现认证授权的方法。
JWT 简介
JSON Web Token(JWT)是一种开放标准(RFC 7519),通常用于在不同的应用程序或服务之间安全地传输信息。JWT 由三个部分组成,分别为头部、载荷和签名,其结构如下:
header.payload.signature
头部
JWT 头部通常由两部分组成,即 alg
和 typ
。alg
表示签名算法的类型,例如 HS256
表示使用 HMAC SHA-256 算法进行签名;typ
表示令牌的类型,例如 JWT。
载荷
JWT 载荷包含了需要传输的信息,例如用户的 ID、角色、权限等等。载荷也可以包含私有声明,用于定制 JWT。
签名
JWT 签名是将头部、载荷和密钥组成的字符串通过指定的算法进行加密得到的,其可以用于验证令牌的完整性和真实性。
在 GraphQL 中使用 JWT
在 GraphQL 中使用 JWT 进行认证授权的主要流程如下:
- 客户端登录并获取 JWT;
- 客户端将 JWT 存储在本地,并在每个请求中将 JWT 作为 Authorization 头部发送给服务器;
- 服务器解析 JWT 并验证其有效性;
- 如果验证成功,服务器返回请求的数据;否则,服务器返回错误信息。
JWT 的生成和解析
在 GraphQL 中使用 JWT,首先需要有一个生成和解析 JWT 的工具。常用的 JWT 工具库有 jsonwebtoken 和 jwt-simple。这里我们以 jsonwebtoken 为例,示例代码如下:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------ - ----------- -- -- -------- --------------------- ----- - ----- ------- - - ------- ------- ----- ----- -- ------ ----------------- ------- - ---------- ---- --- - -------- ------------------ - --- - ----- ------- - ----------------- -------- ------ -------- - ----- ------- - ------ ----- - - -------------- - - -------------- ------------ --展开代码
上述代码中,generateToken
函数接收两个参数,分别为用户 ID 和角色,其生成的 JWT 的有效期为 1 小时。verifyToken
函数用于解析 JWT,如果解析成功就返回载荷中的信息,否则就返回 null。
在 GraphQL 中进行认证授权
我们可以使用 GraphQL 的上下文(context)来实现在 GraqhQL 中使用 JWT 进行认证授权。在每个请求中,将 JWT 解析成用户信息,并将其存储在 context 中。示例代码如下:
-- -------------------- ---- ------- ----- - ----------- - - ----------------- ----- --------- - - ------ - ------------ ----- -------- - -- - ------- ------- ----- - ------- ---- - - ------------- -- ---------- -- ----- --- -------- - ------ ----- - -- --------- ------ --------------------- -- -- -- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- - -- - ------------- ---- --- ----- ----- - ------------------------- -- --- ----- ---- - ------------------- -- -------- ------- - ------ - ----- ----- -- -- ---展开代码
上述代码中,context
函数用于在每个请求中将 JWT 解析成用户信息并存储在 context 中。在 post
查询中,我们从 context 中获取用户信息并判断其角色是否正确,然后执行查询并返回结果。
在客户端中使用 JWT
在客户端中使用 JWT,我们需要在登录成功后将 JWT 存储在本地,并在每个请求中将 JWT 作为 Authorization 头部发送给服务器。示例代码如下:
-- -------------------- ---- ------- ----- -------- --------------- --------- - ----- -------- - ----- --------------- - ------- ------- ----- ---------------- --------- -------- --- -------- - --------------- ------------------ -- --- ----- ---- - ----- ---------------- ----------------------------- ------------ -- - ----- ----- ------ ----- - ----- -------- ---------------- - ----- ----- - ----------------------------- -- --- ----- -------- - ----- ----------------- - ------- ------- ----- ---------------- ----- --- -------- - --------------- ------------------- -------------- ------- --------- -- --- ----- ---- - ----- ---------------- ------ ----- -展开代码
上述代码中,我们使用 localStorage
将 JWT 存储在本地,在每个请求中将 JWT 作为 Authorization 头部发送给服务器。
总结
本文介绍了在 GraphQL 中使用 JWT 实现认证授权的方法。我们可以使用 jsonwebtoken 或 jwt-simple 等 JWT 工具库来生成和解析 JWT,使用 GraphQL 的上下文来实现在每个请求中获取用户信息,从而实现 GraphQL 的认证授权。
参考链接
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646706dd968c7c53b0770716