使用 Express.js + Passport.js 实现 OAuth2.0 认证

OAuth2.0 是一种认证和授权协议,它允许用户授权第三方应用访问他们的资源,而不需要提供他们的用户名和密码。在前端开发中,我们经常需要使用 OAuth2.0 认证来实现用户登录和授权功能。本文将介绍如何使用 Express.js + Passport.js 实现 OAuth2.0 认证。

什么是 Express.js 和 Passport.js?

Express.js 是一个基于 Node.js 平台的 Web 应用程序框架,它提供了一组强大的特性和工具,可以帮助我们快速构建 Web 应用程序。Passport.js 是一个 Node.js 的认证中间件,它支持多种认证策略,包括本地认证、OAuth 认证和 OpenID 认证等。

OAuth2.0 认证流程

在使用 OAuth2.0 认证之前,我们需要了解 OAuth2.0 的认证流程。OAuth2.0 认证流程包括以下几个步骤:

  1. 用户访问第三方应用,第三方应用请求用户授权。
  2. 用户同意授权,第三方应用获得授权码。
  3. 第三方应用使用授权码向认证服务器请求访问令牌。
  4. 认证服务器验证授权码并颁发访问令牌。
  5. 第三方应用使用访问令牌访问受保护的资源。

实现 OAuth2.0 认证

现在我们已经了解了 OAuth2.0 的认证流程,接下来我们将使用 Express.js 和 Passport.js 实现 OAuth2.0 认证。

安装依赖

首先,我们需要安装 Express.js 和 Passport.js 的依赖,可以使用以下命令:

配置 Passport.js

接下来,我们需要配置 Passport.js。在 app.js 中添加以下代码:

const passport = require('passport');
const OAuth2Strategy = require('passport-oauth2').Strategy;

passport.use('oauth2', new OAuth2Strategy({
  authorizationURL: 'https://example.com/oauth2/authorize',
  tokenURL: 'https://example.com/oauth2/token',
  clientID: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET',
  callbackURL: 'http://localhost:3000/oauth2/callback'
}, (accessToken, refreshToken, profile, done) => {
  // 处理认证成功回调
}));

app.use(passport.initialize());

其中,authorizationURLtokenURL 分别是认证服务器的授权和令牌 URL,clientIDclientSecret 是你在认证服务器上注册的应用程序的凭证,callbackURL 是认证服务器认证成功后将用户重定向回来的 URL。

创建认证路由

接下来,我们需要创建认证路由,当用户访问该路由时,将向认证服务器发送请求以获取授权码。在 routes/index.js 中添加以下代码:

const express = require('express');
const passport = require('passport');
const router = express.Router();

router.get('/oauth2', passport.authenticate('oauth2'));

router.get('/oauth2/callback', passport.authenticate('oauth2', {
  successRedirect: '/',
  failureRedirect: '/login'
}));

其中,passport.authenticate('oauth2') 将向认证服务器发送请求以获取授权码,passport.authenticate('oauth2', {...}) 将处理认证成功或失败后的重定向。

创建保护路由

最后,我们需要创建保护路由,当用户访问该路由时,将需要使用访问令牌进行认证。在 routes/protected.js 中添加以下代码:

const express = require('express');
const passport = require('passport');
const router = express.Router();

router.get('/', passport.authenticate('oauth2', { session: false }), (req, res) => {
  // 处理受保护路由
});

module.exports = router;

其中,passport.authenticate('oauth2', { session: false }) 将使用访问令牌进行认证,{ session: false } 将禁用 Passport.js 的会话功能。

示例代码

完整的示例代码可以在 GitHub 上找到:

总结

本文介绍了如何使用 Express.js 和 Passport.js 实现 OAuth2.0 认证。我们首先了解了 OAuth2.0 的认证流程,然后配置了 Passport.js 并创建了认证和保护路由。通过本文的学习,你将能够轻松地实现 OAuth2.0 认证,并将其应用于你的 Web 应用程序中。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c18c8cadd4f0e0ffb85c5c