GraphQL 是一种用于 API 的查询语言和运行时环境,它的出现使得前端与后端的交互变得更加灵活和高效。然而在使用 GraphQL 进行数据交互时,我们也需要考虑到数据的安全性。在 GraphQL 中,身份验证是一种必需的手段,而 JWT 是一种常用的身份验证方式之一。
JWT 的基础知识
JWT(JSON Web Token)是一种用于身份验证的标准,它可以将用户在登录成功后生成的 token 进行编码,在客户端和服务器端之间进行传输,同时也可以防止 token 的篡改和伪造。
在 JWT 中,包含了三个部分:header、payload 和 signature。
header 部分包含加密算法和 token 类型等信息,例如以下的示例:
{ "alg": "HS256", "typ": "JWT" }
payload 部分则包含了需要传递的数据,例如用户 ID、角色等各种信息:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
signature 则是由 header 和 payload 以及一个秘钥生成的一串字符串,用于校验 token 的真实性。
在 GraphQL 中使用 JWT 进行身份验证,主要分为以下几个步骤:
- 用户在登录后生成一个 JWT token,并将其存储在客户端。
- 在每次请求 GraphQL API 的时候,客户端需要在请求 header 中携带此 token。
- 服务器接收到请求后,校验 token 的真实性,确认用户的合法性。
代码示例:
生成 JWT token
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ---- - - --- ---- ----- ----- ----- ----- ------- - ----- ----- - -------------- --------- - ---------- ---- ---
将 token 存储在客户端
在客户端中将 token 存储起来,例如使用 localStorage:
localStorage.setItem('token', token);
请求 GraphQL API
在发起请求前,需要在请求 header 中携带 token:
const headers = { authorization: `Bearer ${localStorage.getItem('token')}` }; fetch('/graphql', headers);
检验请求是否合法
在服务端的 GraphQL resolver 中获取到 header 中携带的 Authorization 字段,进行校验:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- --------- - - ------ - ------ ------ ----- -------- -- - ----- ---------- - ------------------------------ -- ------------- - ----- --- -------------------- ------ --- --------- - ----- ----- - ------------------ ------ --- - ----- ------- - ----------------- ---------- ----- - --- ----- ---- - - -------- -- ------------------------- -- --- - ----- ----- - ----- --- -------------- --------- - - - -
总结
在 GraphQL 中使用 JWT 进行身份验证,可以保障数据的安全性,防止未授权的用户对数据进行操作。虽然 JWT 是一种常用的身份验证方式,但是在使用的过程中也需要注意避免过度依赖 token,以及对 token 进行泄露等情况的防范。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645351e4968c7c53b07c2376