在上一篇文章中,我们讨论了OAuth
和JWT
的基本概念,了解了它们在现代Web应用中的重要性。在本篇中,我们将专注于如何在GraphQL API
中实现认证,以确保数据的安全性和用户的合法性。
为什么使用GraphQL中的认证?
GraphQL
提供了一种灵活的方式来查询和操作数据。然而,随着数据的开放性,保护数据变得尤为重要。有效的认证机制不仅可以保护数据,还可以确保访问控制。通过实现认证,您可以:
- 确保只有授权用户才能访问API。
- 控制用户对特定数据的访问。
- 提高应用的安全性。
在GraphQL中实现认证
这里有几种常见的方法来在GraphQL API
中实现认证,其中最广泛使用的是JWT
(JSON Web Tokens)。以下是一个基于Node.js和Apollo Server
的实现示例。
1. 设置Apollo Server
首先,您需要安装Apollo Server
和jsonwebtoken
库:
1
| npm install apollo-server jsonwebtoken
|
然后,设置基本的GraphQL
服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| const { ApolloServer, gql } = require('apollo-server'); const jwt = require('jsonwebtoken');
const typeDefs = gql` type User { id: ID! username: String! }
type Query { me: User }
type Mutation { login(username: String!, password: String!): String } `;
const users = [ { id: 1, username: 'test', password: 'password' }, ];
const SECRET_KEY = 'mysecretkey';
const resolvers = { Query: { me: (parent, args, context) => { if (!context.user) throw new Error('Unauthenticated'); return context.user; }, }, Mutation: { login: (parent, { username, password }) => { const user = users.find((user) => user.username === username && user.password === password); if (!user) throw new Error('Invalid credentials');
const token = jwt.sign({ id: user.id }, SECRET_KEY, { expiresIn: '1h' }); return token; }, }, };
const server = new ApolloServer({ typeDefs, resolvers, context: ({ req }) => { const token = req.headers.authorization || ''; try { const user = jwt.verify(token, SECRET_KEY); return { user }; } catch (e) { return {}; } }, });
server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
|
在上面的代码中:
- 定义了
User
类型和Query
、Mutation
。
- 使用
jsonwebtoken
库创建和验证JWT。这展示了用户登录和获取当前用户信息的基本逻辑。
2. 登录与获取用户信息的操作
通过以上实现,用户可以发送请求以获取令牌和个人信息。以下是一个使用curl
进行测试的示例。
1 2 3 4 5
| curl -X POST -H "Content-Type: application/json" -d '{"query":"mutation { login(username: \"test\", password: \"password\") }"}' http://localhost:4000/
curl -X POST -H "Authorization: <YOUR_JWT>" -H "Content-Type: application/json" -d '{"query":"{ me { id username } }"}' http://localhost:4000/
|
3. 处理未授权访问
在解析查询时,我们检查上下文中的user
对象。如果用户未认证(即未提供有效的JWT),我们抛出Unauthenticated
错误。这对前端开发者和API用户来说,是一种清晰的错误反馈。
结论
在本篇中,我们探讨了如何在GraphQL API
中实现认证,着重于使用JWT
作为认证方式。认证为我们的API提供了一层安全防护,使得只有经过验证的用户才能访问数据。在下篇文章中,我们将深入讨论在GraphQL
中进行查询的优化和最佳实践,确保你的应用不仅安全而且高效。
保持关注,下一篇将为你展示GraphQL
的性能优化与最佳实践之查询优化!