阅读声明而不进行验证,了解结果返回



我在Rust中使用JWT,遇到了导航问题。我是Rust和JWT的新手,对我来说太赤裸了。

我使用的是在这里找到的jwt板条箱。

我想做的是创建一个包含标头和声明的签名JWT。权利要求只有一个字段issuer。我可以免费发行新代币。

fn issue_token(user_id: &str) -> Result<String, &'static str> {
let header: Header = Default::default();

let claims = RegisteredClaims {
issuer: Some("user who issued token".into()),
subject: Some(user_id.into()),
..Default::default()
};
let unsigned_token = Token::new(header, claims);
let key: Hmac<Sha256> =
Hmac::new_from_slice("secret_key".as_bytes()).map_err(|_e| "Invalid key")?;
let signed_token = unsigned_token
.sign_with_key(&key)
.map_err(|_e| "Sign error")?;
Ok(signed_token.into())
}

issuer声明很重要。因为有不同的进程有自己的令牌。所有的issuers已经向主服务器注册了它们的secret。现在,其他用户将连接到特定的issuer,验证用户是谁,并发布已签名的JWT。用户不知道secret是什么,这在issuer和服务器之间是已知的。

在服务器端,我想做的是读取claims来识别issuer是谁。一旦我知道issuer是谁,我就知道用什么秘密来验证签名。

我在验证令牌时没有问题,一旦我验证了令牌,我就可以阅读声明了。但我需要先阅读声明,然后验证令牌。

除了签名和验证的基本示例之外,文档对我来说很清楚。

在查看板条箱的文档时,我一直无法弄清楚如何实现我想要做的事情。

我已经找到了我想要的东西,这里是parse_unverifiedUnverified,但我很难弄清楚如何使用它们。

parse_unverified看起来是两者中更有前景的,因为文档中指出Not recommended. Parse the header and claims without checking the validity of the signature

有人对Rust和jwt板条箱有任何经验吗?

我相信我已经部分弄明白了。

它从导入正确的板条箱选项开始

use jwt::{Claims, Error, Header, RegisteredClaims, Token, Unverified, VerifyWithKey};

然后我可以创建一个新的变量,比如

let unverified: Result<Token<Header, Claims, Unverified<'_>>, Error> =
Token::parse_unverified(token);

现在这个工作了,构建和运行都很好。我现在遇到的问题实际上是现在解析unverified

我看得越多,我认为这可能与JWT无关,而与标准Rust操作有关。作为其返回的CCD_ 18。

有什么见解吗?

这是一个标准的Result,所以你必须像往常一样用?打开它才能到达里面的Token。即使这不能验证签名,但由于无效的base64/JSON编码或JWT帧,它仍然可能失败。(如果这里有错误,令牌甚至在结构上都无效,所以没有必要再进一步了。(

let unverified: Token<Header, Claims, _> = Token::parse_unverified(token)?;

现在,您可以在unverified上使用Token提供的任何设施,例如unverified.claims()

不过,您可能希望使用RegisteredClaims进行解析,这样可以更容易地访问颁发者字段:

let unverified: Token<Header, RegisteredClaims, _> =
Token::parse_unverified(token)?;
let issuer = unverified.claims().issuer.as_ref()
.ok_or(MissingIssuerError)?;

CCD_ 26将是CCD_。(MissingIssuerError是一个占位符,用于在没有颁发者字段的情况下引发错误。(

相关内容

  • 没有找到相关文章

最新更新