OAuth 2.0 是当前流行的身份验证和授权框架之一,它能让开发者构建安全的 Web 应用程序。在本文中,我们将学习如何在 Express.js 中实现 OAuth 2.0 身份验证。
什么是 OAuth 2.0 ?
OAuth 2.0 是一个开放标准,用于安全地授权和验证用户访问第三方应用程序的资源。OAuth 2.0 通过令牌授权并且通过 OAuth 2.0,第三方应用程序可以请求访问用户受保护的资源,而无需了解其密码或其他凭据。
要使用 OAuth 2.0 身份验证,我们需要进行以下步骤:
- 注册应用程序
- 访问授权服务器
- 接收令牌
- 获取用户信息
1. 注册应用程序
在使用 OAuth 2.0 进行身份验证之前,我们需要在服务提供商的开发者门户上注册应用程序。在注册应用程序时,会为我们提供客户端 ID 和客户端秘钥,因此请记下这些值。
2. 访问授权服务器
在授权和验证期间,我们需要向授权服务器发出请求。在 Express.js 中,我们可以使用 Passport.js 中间件来处理身份验证。我们需要安装 passport
和 passport-oauth2
插件:
npm install passport passport-oauth2 --save
然后,在 app.js 文件中创建一个 Passport 认证策略:
const passport = require('passport'); const OAuth2Strategy = require('passport-oauth2'); require('dotenv').config(); passport.use(new OAuth2Strategy({ authorizationURL: process.env.OAUTH_AUTHORIZATION_URL, tokenURL: process.env.OAUTH_TOKEN_URL, clientID: process.env.OAUTH_CLIENT_ID, clientSecret: process.env.OAUTH_CLIENT_SECRET, callbackURL: process.env.OAUTH_CALLBACK_URL }, (accessToken, refreshToken, profile, cb) => { User.findOrCreate({ username: profile.username }, (err, user) => { if (err) { return cb(err); } cb(null, user); }); } ));
上面的代码使用 OAuth2Strategy 中间件来创建一个 Passport 认证策略。在一切就绪之后,它将使用回调 URL 来进行身份验证。
3. 接收令牌
为了接收 OAuth 2.0 令牌,我们需要在 Express.js 服务器上设置一个回调 URL。这可以通过如下代码完成:
app.get('/auth/example/callback', passport.authenticate('oauth2', { failureRedirect: '/login' }), (req, res) => { // Successful authentication, redirect home. res.redirect('/'); });
我们可以在应用程序的路由中将这个 URL 与 OAuth 认证关联起来。当用户完成身份验证并返回服务器时,Passport 将在这个 URL 上运行,并将令牌和其他相关数据传递给我们的服务器。
4. 获取用户信息
如果您想要访问授权服务器中存储的用户详细信息,您将需要使用 Passport.js 的用户信息中间件。在上面提到的身份验证回调中,我们可以使用以下代码获取用户信息:
app.get('/auth/example/callback', passport.authenticate('oauth2', { failureRedirect: '/login' }), (req, res) => { // Successful authentication, redirect home. res.redirect('/'); });
上面的代码将在用户进行身份验证后,从授权服务器获取用户的详细信息。
总结
在本文中,我们学习了如何使用 OAuth 2.0 在 Express.js 应用程序中实现身份验证过程。通过注册应用程序,并使用中间件和策略,我们可以轻松地创建一个安全的 Web 应用程序,其中包含 OAuth 2.0 身份验证过程。
参考资料
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6593bc73eb4cecbf2d860a56