20 GraphQL与认证之在GraphQL中实现认证

在上一篇文章中,我们讨论了OAuthJWT的基本概念,了解了它们在现代Web应用中的重要性。在本篇中,我们将专注于如何在GraphQL API中实现认证,以确保数据的安全性和用户的合法性。

为什么使用GraphQL中的认证?

GraphQL提供了一种灵活的方式来查询和操作数据。然而,随着数据的开放性,保护数据变得尤为重要。有效的认证机制不仅可以保护数据,还可以确保访问控制。通过实现认证,您可以:

  • 确保只有授权用户才能访问API。
  • 控制用户对特定数据的访问。
  • 提高应用的安全性。

在GraphQL中实现认证

这里有几种常见的方法来在GraphQL API中实现认证,其中最广泛使用的是JWT(JSON Web Tokens)。以下是一个基于Node.js和Apollo Server的实现示例。

1. 设置Apollo Server

首先,您需要安装Apollo Serverjsonwebtoken库:

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类型和QueryMutation
  • 使用jsonwebtoken库创建和验证JWT。这展示了用户登录和获取当前用户信息的基本逻辑。

2. 登录与获取用户信息的操作

通过以上实现,用户可以发送请求以获取令牌和个人信息。以下是一个使用curl进行测试的示例。

1
2
3
4
5
# 用户登录,获取JWT
curl -X POST -H "Content-Type: application/json" -d '{"query":"mutation { login(username: \"test\", password: \"password\") }"}' http://localhost:4000/

# 使用JWT获取用户信息
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的性能优化与最佳实践之查询优化!

20 GraphQL与认证之在GraphQL中实现认证

https://zglg.work/graphql-api-dev-zero/20/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论