我的MEAN堆栈应用程序正在使用Azure AD进行身份验证。我正在使用“passport-azure-ad”模块进行网络API验证。基于post & reply here,我理解
如果用户已经通过客户端(UI)进行了身份验证,那么对于每个API调用, 客户端也会将令牌发送到服务器。然后就是 服务器我们可以使用承载策略来“授权”用户访问API。
现在在我的场景中,我只想确保用户已经过身份验证,如果他是,那么允许他访问API。
问题
1.当服务器执行方法" passport.authenticate(' oauth-bearer')" 时, passport-azure-ad 自动解析&验证从客户端收到的令牌或我是否需要执行任何其他步骤?
2.当它无法验证令牌或令牌是坏还是欺骗时会发生什么?
这是我的完整代码
的 AzureAuthenticationService.js
"use strict";
var passport = require('passport');
var OIDCBearerStrategy = require('passport-azure-ad').BearerStrategy;
var options = {
identityMetadata: 'https://login.microsoftonline.com/tenantid/.well-known/openid-configuration',
validateIssuer: true,
passReqToCallback: false,
loggingLevel: 'error'
};
function configure(app) {
app.use(passport.initialize());
app.use(passport.session());
passport.use(new OIDCBearerStrategy(options,
function(token, done) {
//is there anything else i need to do here?
return done(null, token.unique_name, token);
}));
passport.serializeUser(function (user, done) {
done(null, user);
});
passport.deserializeUser(function (id, done) {
done(null, id);
});
}
function authenticate(req, res, next) {
//is there anything else i need to do here?
passport.authenticate('oauth-bearer')(req, res, next);
}
server.js
' UserService'下面是我用来从数据库中获取用户,我想保护该API调用
"use strict";
var authentication = require('./AzureAuthenticationService');
var userService = require('./UserService');
// Initialize server
var express = require('express');
var app = exports.app = express();
authentication.configure(app);
// Set routes
app.get('/api/users',authentication.authenticate,userService.getUsers);
答案 0 :(得分:2)
我是passport-azure-ad
的维护者。要回答您的问题,是的,它会为您验证令牌。它使用代码中的jwtVerify调用来完成此操作。 ÿou can see where this starts here。它将使用在您的配置中的元数据端点处找到的密钥来解密令牌。
如果验证不成功,您将收到代码中的错误,因为您将在上面看到并在此处引用:
jwt.verify(token, PEMkey, options, function(err, token) {
if (err) {
if (err instanceof jwt.TokenExpiredError) {
log.warn("Access token expired");
done(null, false, 'The access token expired');
} else if (err instanceof jwt.JsonWebTokenError) {
log.warn("An error was received validating the token", err.message);
done(null, false, util.format('Invalid token (%s)', err.message));
} else {
done(err, false);
}

请告诉我这是否有帮助,如果有,请回答。谢谢!