JWT子声明在验证期间被忽略

时间:2019-03-29 16:51:30

标签: javascript node.js authentication jwt express-jwt

嗯,由于我是第一次在节点应用程序中实现JWT,所以这个问题可能很幼稚,对此我有太多疑问。

首先,我不清楚isssubaud的主张。根据我的基本理解,我知道iss是令牌的发行者,因此我可以假定它是应用程序的公司名称。 sub是令牌的主题,或者用简单的术语来说可能是用户标识/用户名。最后,aud是针对受众或简单地说是api服务器url /资源服务器。如果我正确理解了这些条款,请告诉我。

现在,由于我的知识有限,我已经设置了基本的JWT签名和验证。一个小片段如下:

JWT.js

module.exports = {
sign: (payload, options) => {
    let signOptions = {
        issuer: config.JWT_ISSUER,
        subject: options.subject,
        audience: config.JWT_AUDIENCE,
        expiresIn: "24h",
    };

    return jwt.sign(payload, config.JWT_SECRET, signOptions);
},
verify: (token, options) => {
    let verifyOptions = {
        issuer: config.JWT_ISSUER,
        subject: options.subject,
        audience: config.JWT_AUDIENCE,
        expiresIn: "24h",
    };

    try {
        return jwt.verify(token, config.JWT_SECRET, verifyOptions);
    }
    catch (err){
        return false;
    }
},

现在发行令牌的方式如下:

// Issue JWT token
let userData = {
    user_name: user.userName,
    client_id: user.clientId
};
const token = jwt.sign({ userData }, { subject: user.userName });

验证如下:

// Verify the token
const authData = jwt.verify(token, { subject: req.body.subject });  

主要问题

当我向api端点发送请求进行验证时,如果我在正文中没有主题字段的情况下发送了请求( 令牌带有子字段 ) ,令牌已成功验证。但是,如果我使用正确/不正确的值在正文中发送主题字段,则会分别成功/禁止。

  • 为什么会这样?
  • 为什么在请求中没有传递任何子字段时为什么不禁用令牌?
  • 我需要手动验证吗?

1 个答案:

答案 0 :(得分:0)

根据JWT standard

  

4.1.2。 “ sub”(主题)声明

     

“ sub”(主题)声明标识的主体是      智威汤逊的主题。 JWT中的声明通常是声明      关于这个主题。主题值必须在以下范围内      在发行人的背景下本地唯一或全球唯一。      此权利要求的处理通常是特定于应用程序的。的      “ sub”值是区分大小写的字符串,其中包含StringOrURI      值。使用此声明是可选的。

因此,当您没有它时,它会通过,但错误的值会导致失败。 jwt软件包遵循标准。

现在,如果您打算将其强制性设置,则必须将其自定义,但要警告您,然后可能无法使用认为不是强制性的第三方身份验证(如果您的用例)。 (我不知道在现实生活中是否确实如此)