为什么可以';我不能验证我的Azaure AD JWT签名吗?

为什么可以';我不能验证我的Azaure AD JWT签名吗?,jwt,azure-active-directory,jwt-auth,Jwt,Azure Active Directory,Jwt Auth,我在Azure AD租户上注册了一个应用程序。当我在登录后收到访问令牌时,我会将令牌发送到node.js API。我正在尝试验证签名,但不断出现“无效签名”错误。JWT头列出了它用来对令牌签名的特定密钥。那为什么我不能验证呢?在AAD配置中有什么我需要调整的吗?是否有需要指定传递给azure ad jwt的选项?我试着传入{观众:'https://graph.windows.net“}。我还尝试传入解码令牌中的受众,以及标头中列出的特定kid,以便它只尝试令牌表示其已签名的特定密钥 这是给出错误

我在Azure AD租户上注册了一个应用程序。当我在登录后收到访问令牌时,我会将令牌发送到node.js API。我正在尝试验证签名,但不断出现“无效签名”错误。JWT头列出了它用来对令牌签名的特定密钥。那为什么我不能验证呢?在AAD配置中有什么我需要调整的吗?是否有需要指定传递给azure ad jwt的选项?我试着传入
{观众:'https://graph.windows.net“}
。我还尝试传入解码令牌中的受众,以及标头中列出的特定
kid
,以便它只尝试令牌表示其已签名的特定密钥

这是给出错误的代码:

const aad = require('azure-ad-jwt');

module.exports = (req, res, next) => {
    const jwtToken = req.headers.authorization.replace('Bearer ', '');

    aad.verify(jwtToken, null, function (err, result) {
        if (result) {
            console.log("JWT is valid");
            next();
        } else {
            console.log("JWT is invalid: " + err);
            res.status(401).json({
                message: "Auth failed"
            });
        }
    });
};

如果您的前端正在为观众获取代币
https://graph.windows.net
,则该令牌不适用于您的API。 它是Azure AD Graph API的标记。 您不应该验证这一点

相反,前端需要指定API应用程序的客户端id或应用程序id URI作为资源(如果使用v1端点/ADAL)或API定义的有效范围(如果使用v2端点/MSAL)。
然后您将获得一个可以验证的令牌。

您是如何获得令牌的?你得到这个令牌的资源是什么?你能解码令牌并显示屏幕截图吗?这很有趣。实际上,我正在使用Postman获取一个令牌,将其发送到我的API进行测试。我在Azure中配置了API权限。当我指定绑定到该权限的范围(并且只有该范围)时,验证就起作用了。但是,如果我指定了该范围之外的任何内容(即openid、profile),那么它就会失败。甚至base-64编码的令牌看起来也非常不同。另一个观察结果是,当我自己使用自定义作用域时,访问令牌会返回一个
“scp”:“email openid profile User.Read”
声明(在解码的正文中)。这导致了更多的问题。在获取令牌时,您应该只为一个API指定作用域。