随着互联网的发展,越来越多的应用程序需要用户认证来保护用户数据和资源。在过去,应用程序通常使用自己的认证系统,但现在越来越多的应用程序开始采用 OAuth2 协议来进行用户认证。OAuth2 是一个开放标准,允许用户授权第三方应用程序访问他们的受保护资源,而无需将他们的用户名和密码提供给第三方应用程序。
在本文中,我们将介绍如何使用 Express.js 框架搭建一个基于 OAuth2 的用户认证系统。我们将使用 OAuth2 的授权码授权模式来进行用户认证。
1. 安装和配置 Express.js
首先,我们需要安装和配置 Express.js。如果您还没有安装 Node.js 和 Express.js,请先安装它们。安装完成后,我们可以使用以下命令创建一个新的 Express.js 应用程序:
$ npm install express-generator -g $ express myapp $ cd myapp $ npm install
这将创建一个名为 myapp
的新应用程序,并安装所有必要的依赖项。
2. 配置 OAuth2
接下来,我们需要配置 OAuth2。我们将使用 oauth2-server
模块来实现 OAuth2 认证。我们可以使用以下命令安装 oauth2-server
模块:
$ npm install oauth2-server --save
然后,我们需要创建一个 OAuth2 服务器实例。在 app.js
中添加以下代码:
// javascriptcn.com 代码示例 const oauth2 = require('oauth2-server'); const model = require('./model'); // 自定义的数据模型 const app = express(); app.oauth = oauth2({ model: model, // 数据模型 grants: ['authorization_code'], debug: true }); app.use(app.oauth.errorHandler());
在上面的代码中,我们首先引入 oauth2-server
模块,并使用 require
函数将其作为 oauth2
变量导入。然后,我们从 ./model
文件中导入自定义的数据模型。我们还指定了一些 OAuth2 服务器的配置选项,包括支持的授权类型和调试模式。最后,我们将 oauth2
中间件添加到应用程序中,并使用 errorHandler
函数来处理 OAuth2 错误。
3. 创建用户认证接口
现在,我们可以开始创建用户认证接口。我们将使用 express.Router()
创建一个新的路由器,并将其添加到我们的应用程序中。在 app.js
中添加以下代码:
const authRouter = require('./routes/auth'); app.use('/auth', authRouter);
然后,我们可以在 routes/auth.js
文件中创建我们的认证路由。在 routes/auth.js
中添加以下代码:
const express = require('express'); const router = express.Router(); router.post('/token', app.oauth.grant()); module.exports = router;
在上面的代码中,我们首先创建了一个新的路由器,并使用 express.Router()
函数来实现它。然后,我们在 /token
路径上创建了一个 POST 请求处理程序,并使用 app.oauth.grant()
函数将其添加到 OAuth2 服务器中。这个处理程序将处理 OAuth2 的授权码授权模式,并返回访问令牌。
4. 创建受保护的 API
现在,我们已经可以使用 OAuth2 进行用户认证了。接下来,我们将创建一些受保护的 API,只有经过身份验证的用户才能访问它们。在 app.js
中添加以下代码:
const apiRouter = require('./routes/api'); app.use('/api', app.oauth.authorise(), apiRouter);
在上面的代码中,我们首先创建了一个新的路由器,并使用 express.Router()
函数来实现它。然后,我们在 /api
路径上创建了一个中间件处理程序,并使用 app.oauth.authorise()
函数将其添加到 OAuth2 服务器中。这个中间件处理程序将检查用户是否经过身份验证,如果没有,则返回一个错误响应。最后,我们将路由器添加到应用程序中。
然后,我们可以在 routes/api.js
文件中创建我们的 API 路由。在 routes/api.js
中添加以下代码:
const express = require('express'); const router = express.Router(); router.get('/me', (req, res) => { res.json({ user_id: req.user.id, name: req.user.name }); }); module.exports = router;
在上面的代码中,我们首先创建了一个新的路由器,并使用 express.Router()
函数来实现它。然后,我们在 /me
路径上创建了一个 GET 请求处理程序。这个处理程序将返回当前经过身份验证的用户的 ID 和名称。
5. 运行应用程序
现在,我们已经完成了我们的应用程序。我们可以使用以下命令启动它:
$ npm start
然后,我们可以使用 Postman 或其他 HTTP 客户端来测试我们的应用程序。首先,我们需要获取访问令牌。我们可以向 /auth/token
路径发送一个 POST 请求,包括 OAuth2 客户端 ID、客户端密钥、授权码和重定向 URI。例如:
POST /auth/token HTTP/1.1 Host: localhost:3000 Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&client_id=client_id&client_secret=client_secret&code=code&redirect_uri=redirect_uri
如果授权成功,服务器将返回一个带有访问令牌的 JSON 对象:
{ "access_token": "access_token", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "refresh_token" }
现在,我们可以使用访问令牌来访问受保护的 API。我们可以向 /api/me
路径发送一个 GET 请求,包括访问令牌。例如:
GET /api/me HTTP/1.1 Host: localhost:3000 Authorization: Bearer access_token
如果用户已经经过身份验证,服务器将返回一个带有用户 ID 和名称的 JSON 对象:
{ "user_id": "user_id", "name": "name" }
总结
在本文中,我们介绍了如何使用 Express.js 框架搭建一个基于 OAuth2 的用户认证系统。我们首先安装和配置了 Express.js 和 oauth2-server
模块。然后,我们创建了认证和受保护的 API 路由,并使用 OAuth2 进行用户认证。最后,我们使用 Postman 或其他 HTTP 客户端测试了我们的应用程序。希望这篇文章对您有所帮助!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65504fa77d4982a6eb92e60f