我在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_unverified
或Unverified
,但我很难弄清楚如何使用它们。
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
是一个占位符,用于在没有颁发者字段的情况下引发错误。(