护照天蓝色广告,它是否解析和验证令牌?

LP1*_*P13 3 node.js azure-active-directory adal passport.js

我的 MEAN 堆栈应用程序使用 Azure AD 进行身份验证。我正在使用“passport-azure-ad”模块进行 web api 身份验证。根据这里的帖子和回复,我明白了

如果用户已经通过客户端 (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);
    }
Run Code Online (Sandbox Code Playgroud)


下面的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);
Run Code Online (Sandbox Code Playgroud)

Bra*_*ner 5

我是passport-azure-ad. 要回答您的问题,是的,它将为您验证令牌。它通过调用代码中的 jwtVerify 来实现这一点。Ÿ欧能看到这个从这里开始。它将使用在您的配置中的元数据端点上找到的密钥解密令牌。

如果验证不成功,您将从代码中得到一个错误,正如您在上面看到的和在此处引用的:

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);
                }
Run Code Online (Sandbox Code Playgroud)

让我知道这是否有帮助,如果有,请标记回答。谢谢!