GraphQL 是一种用于 API 开发的查询语言,它提供了强大的灵活性来定义数据模型和数据交互。在 GraphQL 中,客户端通过发送查询/变更/订阅请求来获取所需的数据,这些请求一般需要身份验证和权限控制。为了实现这些功能,GraphQL 需要一个可靠的 token 机制。
Token 的作用
Token 是用于身份验证和权限控制的一种方式,它是一段由服务器生成的加密字符串,客户端必须携带该 token 才能进行操作。在 GraphQL 中,token 的作用主要有以下两个方面:
身份验证:当客户端向服务器发送请求时,服务器会首先验证该用户是否已经登录,并根据用户的身份将相应的资源(如数据、接口)暴露给该用户。
权限控制:在身份验证通过后,服务器会检查该用户是否具有执行该操作的权限。如果没有权限,则服务器会拒绝该操作,并返回相应的错误信息。
Token 的生成与传递
在 GraphQL 中,一般使用 JSON Web Token(JWT)来生成和传递 token。
Token 的生成分为以下几个步骤:
创建一个包含用户信息和过期时间等字段的 payload 对象。
将 payload 对象进行签名,以确保其不被篡改。
将签名后的 payload 和签名算法等信息组合成一个 token 字符串。
客户端通过在请求头中携带 token 来传递身份验证信息。具体来说,请求头应包含一个类似于 Authorization: Bearer <token>
的字段。
Token 的校验与更新
服务器接收到带有 token 的请求后,首先需要进行 token 的校验和解密操作。如果 token 不合法或者已经过期,则服务器会拒绝该请求,并返回相应的错误信息。
同时,为了保证 token 的安全性,服务器还需要定期地更新 token。具体来说,服务器可以在每次用户登录成功后生成一个新的 token,并将其发送给客户端。此时,旧的 token 将失效,客户端必须使用新的 token 作为身份验证信息。
示例代码
以下是一个基于 jsonwebtoken
模块实现的 JWT token 生成和校验的示例代码:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); // 生成 token const generateToken = (payload) => { // 生成签名 const signature = process.env.JWT_SECRET; // 设置过期时间(单位为秒) const expiresIn = 60 * 60; // 1小时 // 生成 token const token = jwt.sign(payload, signature, { expiresIn }); return token; }; // 校验 token const verifyToken = (token) => { // 获取签名 const signature = process.env.JWT_SECRET; try { // 解密 token const decoded = jwt.verify(token, signature); // 返回 token 中所包含的信息 return decoded; } catch (err) { // 校验失败,返回错误信息 throw new Error('Invalid token'); } };
总结
本文介绍了 GraphQL 中的 token 机制,并详细讲解了 token 的作用、生成与传递、校验与更新等方面的内容。了解这些知识对于构建安全可靠的 GraphQL API 至关重要。我们希望本文能够为读者在实践中遇到的问题提供参考和指导。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652969ca7d4982a6ebbf3ac9