前言
随着现代应用程序的需求,身份认证已成为很普遍的应用功能。JSON Web Tokens (JWT) 已成为一种流行且安全的 token 格式,他可以用作用户认证和授权。在 GraphQL 中,使用 JWT 进行身份认证非常普遍且方便。
本文将介绍如何在 GraphQL 中使用 JWT 进行身份认证,同时提供相关示例代码。
JWT 简介
JWT 由三个部分组成:header、payload 和 signature。header 包含算法和类型信息,例如:
{ "alg": "HS256", "typ": "JWT" }
payload 包含标准声明和自定义声明,例如:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
signature 由 header 和 payload 基于私钥生成,例如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
通常情况下,JWT 会存储在客户端的 localStorage 或 sessionStorage 中,用于身份认证和授权。
使用 GraphQL 进行身份认证
在 GraphQL 中,可以使用 HTTP 消息头中的 Authorization 字段来发送 JWT token。通常,把这个 token 添加到请求头中,对于所有 GraphQL 操作,可以在服务端中校验该 token。
服务端实现
在服务端,可以使用任何编程语言和库来校验 JWT。以下是使用 Node.js 的例子:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const verifyJWT = (token) => { try { const decoded = jwt.verify(token, 'secret'); return decoded; } catch (e) { throw new Error('Authentication error'); } }; module.exports = verifyJWT;
verifyJWT
函数接受一个 token 参数,并尝试解密 JWT。如果解密成功,就返回 payload。否则,将抛出一个自定义错误。
客户端实现
在客户端,可以使用任何 GraphQL 客户端库来发送 JWT。以下是使用 Apollo Client 的例子:
// javascriptcn.com 代码示例 import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client'; const httpLink = new HttpLink({ uri: 'http://localhost:4000/graphql', }); const authLink = (token) => { return new ApolloLink((operation, forward) => { operation.setContext({ headers: { Authorization: `Bearer ${token}`, }, }); return forward(operation); }); }; const client = new ApolloClient({ link: authLink(localStorage.getItem('token')).concat(httpLink), cache: new InMemoryCache(), });
其中,authLink
是一个自定义 Apollo Link,用于在请求头中添加 Authorization 字段。在构造 authLink
时,可以从 localStorage 中读取 JWT token。在调用 authLink
时,请求头将被自动添加。
在 GraphQL 中校验 JWT
在服务端实现 JWT 校验后,可以将其集成到 GraphQL 解析器中。以下是使用 Apollo Server 的例子:
// javascriptcn.com 代码示例 const { verifyJWT } = require('./auth'); const server = new ApolloServer({ schema, context: ({ req }) => { const token = req.headers.authorization?.replace('Bearer ', '') || ''; const user = verifyJWT(token); return { user }; }, });
context
函数将从 HTTP 请求中提取 JWT token,通过调用 verifyJWT
函数进行 token 校验,将该用户数据注入到 GraphQL 解析器中。
总结
在 GraphQL 中使用 JWT 进行身份认证已成为一个常见的功能需求。通过阅读本文和相关示例代码,读者可以了解如何在 GraphQL 中使用 JWT 进行身份认证,并如何在服务端和客户端实现该功能。
希望本文对读者学习和开发 GraphQL 应用有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fd344a95b1f8cacdcc615a