嗯,由于我是第一次在节点应用程序中实现JWT,所以这个问题可能很幼稚,对此我有太多疑问。
首先,我不清楚iss
,sub
和aud
的主张。根据我的基本理解,我知道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端点发送请求进行验证时,如果我在正文中没有主题字段的情况下发送了请求( 令牌带有子字段 ) ,令牌已成功验证。但是,如果我使用正确/不正确的值在正文中发送主题字段,则会分别成功/禁止。
答案 0 :(得分:0)
4.1.2。 “ sub”(主题)声明
“ sub”(主题)声明标识的主体是 智威汤逊的主题。 JWT中的声明通常是声明 关于这个主题。主题值必须在以下范围内 在发行人的背景下本地唯一或全球唯一。 此权利要求的处理通常是特定于应用程序的。的 “ sub”值是区分大小写的字符串,其中包含StringOrURI 值。使用此声明是可选的。
因此,当您没有它时,它会通过,但错误的值会导致失败。 jwt
软件包遵循标准。
现在,如果您打算将其强制性设置,则必须将其自定义,但要警告您,然后可能无法使用认为不是强制性的第三方身份验证(如果您的用例)。 (我不知道在现实生活中是否确实如此)