GraphQL 是一种用于 API 的查询语言和运行时环境,它可以让客户端准确地获取它需要的数据,并且没有任何冗余。在 Node.js 中使用 GraphQL 实现授权验证可以让我们更好地保护我们的 API,只有经过身份验证的用户才能访问受保护的资源。
本文将介绍如何在 Node.js 中使用 GraphQL 实现授权验证,并提供示例代码。
什么是授权验证?
授权验证是一种保护 API 免受未经授权的访问的机制。它通过验证用户的身份和权限来控制对 API 资源的访问。在授权验证中,用户必须提供有效的身份验证凭据,并且必须具有访问所请求资源的权限。
在 Node.js 中使用 GraphQL 实现授权验证需要以下步骤:
- 定义 GraphQL 的 schema,包括受保护的资源和查询和变更操作。
- 实现 GraphQL 的 resolver,用于处理查询和变更操作。
- 实现授权验证逻辑,以确保只有经过身份验证的用户才能访问受保护的资源。
我们将逐一介绍这些步骤。
定义 GraphQL 的 schema
首先,我们需要定义 GraphQL 的 schema。在 schema 中,我们需要定义受保护的资源和查询和变更操作。例如,考虑以下 schema:
-- -------------------- ---- ------- ---- ----- - --- ---- - ---- -------- - ------------------- -------- ------ --------- ---- - ---- ---- - --- --- ----- ------- ------ ------- -展开代码
在这个 schema 中,我们定义了一个受保护的资源 me
,它返回当前经过身份验证的用户的信息。我们还定义了一个变更操作 updateProfile
,它允许经过身份验证的用户更新他们的个人资料。
实现 GraphQL 的 resolver
接下来,我们需要实现 GraphQL 的 resolver,用于处理查询和变更操作。在 resolver 中,我们需要实现查询和变更操作的具体逻辑。例如,考虑以下 resolver:
-- -------------------- ---- ------- ----- --------- - - ------ - --- -------- ----- - ---- -- -- - -- ------- - ----- --- ---------- --------------- - ------ ---- -- -- --------- - -------------- -------- - ----- ----- -- - ---- -- -- - -- ------- - ----- --- ---------- --------------- - --------- - ---- ---------- - ----- ------ ---- -- -- -展开代码
在这个 resolver 中,我们实现了 me
查询和 updateProfile
变更操作。在 me
查询中,我们首先检查用户是否已经经过身份验证,如果没有,则抛出错误。在 updateProfile
变更操作中,我们也首先检查用户是否已经经过身份验证,如果没有,则抛出错误。然后,我们更新用户的个人资料,并返回更新后的用户信息。
实现授权验证逻辑
最后,我们需要实现授权验证逻辑,以确保只有经过身份验证的用户才能访问受保护的资源。在 Node.js 中,我们可以使用中间件来实现授权验证逻辑。例如,考虑以下中间件:
-- -------------------- ---- ------- ----- ------------ - ----- ---- ----- -- - ----- ----- - ------------------------- -- -------- - ------ ------------------------- --------------- - --- - ----- ---- - ------------------ -------- - ---- ------ - ----- ----- - ------------------------- --------------- - - ----- ----------- - ------- -- - -- ----- -- --- ---- ------ ---- -展开代码
在这个中间件中,我们首先从请求头中获取 JWT 令牌。如果没有令牌,则返回未经身份验证的错误。然后,我们使用 JWT 验证逻辑验证令牌,并将用户信息添加到请求中。最后,我们调用 next()
函数,将请求传递给下一个中间件。
在使用 GraphQL 的时候,我们可以将这个中间件添加到 GraphQL 的路由中:
app.use('/graphql', authenticate, graphqlHTTP({ schema: schema, rootValue: resolvers, graphiql: true, }))
在这个路由中,我们首先调用 authenticate
中间件进行身份验证。如果身份验证通过,则将请求传递给 GraphQL 的处理程序。
示例代码
下面是一个完整的示例代码,它演示了如何在 Node.js 中使用 GraphQL 实现授权验证:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- - ----------- - - -------------------------- ----- - ----------- - - ------------------ ----- --- - ----------------------- ----- --- - --------- ----- ------ - ------------- ---- ----- - --- ---- - ---- -------- - ------------------- -------- ------ --------- ---- - ---- ---- - --- --- ----- ------- ------ ------- - -- ----- --------- - - ------ - --- -------- ----- - ---- -- -- - -- ------- - ----- --- ---------- --------------- - ------ ---- -- -- --------- - -------------- -------- - ----- ----- -- - ---- -- -- - -- ------- - ----- --- ---------- --------------- - --------- - ---- ---------- - ----- ------ ---- -- -- - ----- ------------ - ----- ---- ----- -- - ----- ----- - ------------------------- -- -------- - ------ ------------------------- --------------- - --- - ----- ---- - ------------------ -------- - ---- ------ - ----- ----- - ------------------------- --------------- - - ----- ----------- - ------- -- - -- ----- -- --- ---- ------ ---- - ------------------- ------------- ------------- ------- ------- ---------- ---------- --------- ----- --- ---------------- -- -- - ------------------- ------- -- ---- ------ --展开代码
在这个示例中,我们定义了一个 GraphQL schema,包括一个受保护的资源 me
和一个变更操作 updateProfile
。然后,我们实现了 GraphQL resolver,用于处理查询和变更操作。最后,我们实现了一个身份验证中间件,用于保护受保护的资源。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cbe7c0e46428fe9e5074b3