前言
在开发 Web 应用程序时,我们通常需要使用不同的技术栈和服务来实现各种功能。对于身份验证和授权功能来说,我们可能需要使用 Passport.js 作为身份验证库,Apollo Server 作为 GraphQL 服务器,以及 MongoDB 作为数据库。本篇文章将介绍如何使用 npm 包 apollo-passport-mongodb-driver 来实现一个具有身份验证和授权功能的 GraphQL 服务器。
简介
apollo-passport-mongodb-driver 是一个基于 Passport.js 和 MongoDB 的身份验证和授权库,它提供了一种方便的方式来实现用户身份验证和授权功能。通过使用 apollo-passport-mongodb-driver,我们可以轻松地创建一个 GraphQL 服务器,这个服务器可以进行用户身份验证,授权和角色管理等功能。
安装
我们可以通过 npm 命令来安装 apollo-passport-mongodb-driver:
npm install apollo-passport-mongodb-driver
使用
接下来,我们将会使用 apollo-passport-mongodb-driver 来实现一个基本的用户身份验证和授权功能。我们将会使用 Apollo Server 来创建一个 GraphQL API,使用 MongoDB 来存储用户数据以及使用 Passport.js 来进行用户身份验证和授权。
环境设置
首先,我们需要设置一些环境变量,这些变量用于连接 MongoDB 数据库和设置 JWT 密钥。在开发环境中,我们可以使用 .env 文件来设置这些变量,如下所示:
DB_URL=mongodb://localhost:27017/mydatabase JWT_SECRET=mysecret
数据模型
接下来,我们需要定义一个 User 数据模型,这个数据模型用于存储用户信息。我们可以使用 Mongoose.js 来定义这个模型,示例如下:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- - ------ - - --------- ----- ---------- - --- -------- --------- ------- --------- ------- ----- ------- --- -------------- - ---------------------- ------------
身份验证策略
接下来,我们需要定义一个 Passport.js 的身份验证策略。我们可以使用 apollo-passport-mongodb-driver 来定义这个策略。这个策略的作用是验证用户的身份,并返回用户对象。如果用户不存在或者密码不正确,它将返回错误。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- - -------------------- - - ------------------------------------------ ----- ---- - -------------------------- ------------- --- -------------------------- ---------- --------- ----- -- - ----- ---- - ----- -------------- -------- --- -- ------- - ------ -------- ----------- --- --------- - ----- ----- - ----- ------------------------------ -- -------- - ------ -------- -------------- ------------ - ------ ---------- ------ -- --
GraphQL API
接下来,我们可以使用 Apollo Server 来创建一个 GraphQL API,示例如下:
-- -------------------- ---- ------- ----- - ------------- --- - - ------------------------- ----- - ------------ - - ------------------------------------------ ----- -------- - ---- ---- ----- - ------------ ---- - ---- -------- - --------------- -------- --------- --------- ------- - ---- ---- - --------- ------- ----- ------- - -- ----- --------- - - ------ - ------------ -------- ----- ---- -- - ------ --------- -- -- --------- - ------ ----- -------- - --------- -------- -- ---- -- - ----- - ---- - - ----- --------------------------------- - --------- -------- --- -- ------- - ----- --- -------------- -------------- - ----- ----- - ---------------------- ------ ------ -- -- -- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- -------------- --- --- --- ----------------------- --- -- -- - --------------- ------ ----- -- --------- ---
在这个 API 中,我们定义了两个 GraphQL 查询:currentUser 和 Mutation。查询 currentUser 用于返回当前登录用户的信息,Mutation 中的 login 用于进行用户身份验证,并返回一个 JWT 字符串。我们使用 apollo-passport-mongodb-driver 中提供的 buildContext 函数来构建 GraphQL 上下文,并将其传递给 Apollo Server。
身份验证中间件
最后,在我们的 Express.js 应用程序中,我们可以使用 apollo-passport-mongodb-driver 中提供的 authMiddleware 中间件来进行用户身份验证。我们可以通过调用这个中间件来保护我们的 API,示例如下:
const express = require('express'); const app = express(); app.use(authMiddleware()); app.use('/graphql', graphqlHTTP({ schema: schema }));
当用户访问 /graphql 路径时,如果没有通过身份验证,它将返回一个 401 错误。
示例代码
最后,我们提供一个完整的示例代码,用于演示如何使用 apollo-passport-mongodb-driver 来实现用户身份验证和授权功能。
-- -------------------- ---- ------- -- --------- ----- ------- - ------------------- ----- - ------------- --- - - --------------------------------- ----- - ------------- -------------- - - ------------------------------------------ ----- -------- - -------------------- ----- ------------- - ----------------------------------- ----- -------- - -------------------- -- --- -- ----------- --------- --------------------------- -- ------- ---------- ------------------------------------ - ---------------- ----- ------------------- ----- ----------------- ------ --- ------------------------------- ------- -- -------------------- ---------- ------ -------------------- -------------------------------- -- -- ---------------------- -- ----------- -- ---- ----- ----- - ------ - - --------- ----- ---------- - --- -------- --------- ------- --------- ------- ----- ------- --- --------------------------------- - ----- -------- ---------- - ------ -------- --- -------------- -- ----- ---- - ---------------------- ------------ -- ----------- ----- ----------------------------- ----- -- ---------- ---------- ----------------------------- ----- -- ----------------- ------- ------------- --- ------------------- ---------- --------- ----- -- - ----- ---- - ----- -------------- -------- --- -- ------- - ------ ---------- ------ - -------- ---------- ---------- --- - ----- ----- - ----- ------------------------------ -- -------- - ------ ---------- ------ - -------- ---------- ---------- --- - ------ ---------- ------ -- -- -- ------- ----- ----- -------- - ---- ---- ----- - ------------ ---- - ---- -------- - --------------- -------- --------- --------- ------- - ---- ---- - --------- ------- ----- ------- - -- ----- --------- - - ------ - ------------ -------- ----- ---- -- - ------ --------- -- -- --------- - ------ ----- -------- - --------- -------- -- ---- -- - ----- - ---- - - ----- ------------------------- - --------- -------- --- -- ------- - ----- --- -------------- -------------- - ----- ----- - ---------------------- ------ ------ -- -- -- ----- --- - ---------- ----------- -------------------------- ------------------------ ---------------------------- --------- ----- ---- ------------------------------- -------------------------- ------------------- ------------- ------- ------ ---- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- -------------- --- --- --- ------------------------ --- --- -- ----- ------ ----- ---- - ---------------- -- ----- ---------------- -- -- - ------------------- ------- -- --------------------------- ---
# .env DB_URL=mongodb://localhost:27017/mydatabase JWT_SECRET=mysecret
总结
通过使用 apollo-passport-mongodb-driver,我们可以轻松地实现 GraphQL API 中的用户身份验证和授权功能。这个库提供了一个方便的方式来集成 Passport.js 和 MongoDB,并提供了一些有用的工具和函数,使身份验证和授权变得更加简单。希望本篇文章能对您有所帮助,谢谢阅读!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005582181e8991b448d54d3