在 Web 开发中,认证和授权是非常重要的安全机制。认证通常指验证用户的身份,而授权则是确定用户对资源的访问权限。Node.js 提供了很多实现认证和授权的方法,本文将详细介绍这些方法的应用和指导意义。
认证
用户名和密码认证
最基本的认证方式就是用户名和密码认证。在 Node.js 中,可以使用 passport-local 模块来实现用户名和密码认证。该模块提供了一个 LocalStrategy 策略,可以用于验证本地用户名和密码。
下面是一个使用 passport-local 模块实现用户名和密码认证的示例代码:
// www.javascriptcn.com code example
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));在该示例代码中,passport-local 模块提供了一个 LocalStrategy 策略,用于验证本地用户名和密码。User.findOne 方法用于查询数据库中是否存在该用户名,如果存在则验证密码是否正确,如果验证通过则返回用户信息。
OAuth 认证
OAuth 是一种流行的认证协议,用于在不暴露用户密码的情况下,授权第三方应用访问用户资源。在 Node.js 中,可以使用 passport-oauth 模块来实现 OAuth 认证。该模块提供了一系列的策略,用于支持不同的 OAuth 提供商,如 Facebook、Google、GitHub 等。
下面是一个使用 passport-oauth 模块实现 GitHub OAuth 认证的示例代码:
// www.javascriptcn.com code example
const passport = require('passport');
const GitHubStrategy = require('passport-github2').Strategy;
passport.use(new GitHubStrategy({
clientID: GITHUB_CLIENT_ID,
clientSecret: GITHUB_CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/github/callback"
},
function(accessToken, refreshToken, profile, done) {
User.findOrCreate({ githubId: profile.id }, function (err, user) {
return done(err, user);
});
}
));在该示例代码中,passport-github2 模块提供了一个 GitHubStrategy 策略,用于实现 GitHub OAuth 认证。clientID 和 clientSecret 分别是 GitHub 应用的 ID 和密钥,callbackURL 是 GitHub 认证成功后重定向到应用的 URL。User.findOrCreate 方法用于查询数据库中是否存在该 GitHub 用户,如果不存在则创建用户。
授权
基于角色的授权
基于角色的授权是一种常见的授权方式,它将用户分配到不同的角色,每个角色有不同的权限。在 Node.js 中,可以使用 connect-roles 模块来实现基于角色的授权。
下面是一个使用 connect-roles 模块实现基于角色的授权的示例代码:
// www.javascriptcn.com code example
const connectRoles = require('connect-roles');
const user = new connectRoles({
failureHandler: function (req, res, action) {
res.status(403).send('Access Denied - You don\'t have permission to: ' + action);
}
});
user.use('access admin page', function (req) {
if (req.user && req.user.role === 'admin') {
return true;
}
});在该示例代码中,connect-roles 模块提供了一个 connectRoles 中间件,用于实现基于角色的授权。user.use 方法用于定义授权规则,如果用户具有相应的角色,则返回 true。
基于资源的授权
基于资源的授权是另一种常见的授权方式,它将用户分配到不同的资源,每个资源有不同的权限。在 Node.js 中,可以使用 acl 模块来实现基于资源的授权。
下面是一个使用 acl 模块实现基于资源的授权的示例代码:
// www.javascriptcn.com code example
const acl = require('acl');
acl.addUserRoles('joed', 'guest');
acl.allow('guest', 'blogs', 'view');
acl.isAllowed('joed', 'blogs', 'view', function (err, res) {
if (res) {
console.log('User joed is allowed to view blogs');
}
});在该示例代码中,acl 模块提供了一些方法,用于实现基于资源的授权。acl.addUserRoles 方法用于将用户分配到相应的角色,acl.allow 方法用于定义资源的访问权限。acl.isAllowed 方法用于验证用户是否具有访问资源的权限。
应用
认证和授权是 Web 开发中非常重要的安全机制,Node.js 提供了很多实现认证和授权的方法,开发者可以根据项目需求选择合适的方法。本文介绍了用户名和密码认证、OAuth 认证、基于角色的授权和基于资源的授权的实现方法,并提供了相应的示例代码,希望对开发者有所帮助。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da24f9a941bf71341dfdb7