Jupyter AI

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

📅 发表日期: 2024年8月15日

分类: 🔗GraphQL API 开发入门

👁️阅读: --

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

为什么使用GraphQL中的认证?

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

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

在GraphQL中实现认证

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

1. 设置Apollo Server

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

npm install apollo-server jsonwebtoken

然后,设置基本的GraphQL服务器:

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进行测试的示例。

# 用户登录,获取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的性能优化与最佳实践之查询优化!