如何使用"http://url/path"作为字段名称反序列化 JWT?



我有一个activx web服务器,它将对每个请求验证JWT,并提取声明供内部使用。我已经让JWT解码和验证过程工作,基于Auth0的这个例子。

我遇到的问题是,我需要使用的企业应用程序的声明结构为:

{
"https://some-org-url/domain": "some-domain",
"https://some-org-url/roles": [
"...",
],
"https://some-org-url/tag-list": [
"...",
],
"iss": "https://auth-app.com/",
"sub": "app|xxxxxxxxxxx",
"aud": [
"https://some-org-url",
"https://auth-app.com/userinfo"
],
"iat": 1660117559,
"exp": 1660203959,
"azp": "xxxxxxxxx",
"scope": "openid profile email"
}

我可以通过将我的结构定义为来提取语法有效的声明

#[derive(Debug, Deserialize)]
pub struct Claims {
iss: String,
sub: String,
aud: Vec<String>,
iat: u32,
exp: u32,
azp: String,
scope: String
}

但我没能找到提取剩余索赔的方法:

  • https://some-org-url/domain
  • https://some-org-url/roles
  • https://some-org-url/tag-list

即不能按原样定义为struct字段的任意声明。使用它们的路径主干(例如domainroles(是不起作用的。有什么建议吗?

经过jsonwebtoken::decode几次之后,我意识到它在您定义的Claims结构上调用Deserialize,并将JWT主体作为数据传入,因此您可以利用序列字段别名来实现所需的结果:

#[derive(Debug, Deserialize)]
pub struct Claims {
#[serde(alias = "https://some-org-url/domain")]
domain: String,
#[serde(alias = "https://some-org-url/roles")]
roles: Vec<String>,
#[serde(alias = "https://some-org-url/tag-list")]
tag_list: Vec<String>,
iss: String,
sub: String,
aud: Vec<String>,
iat: u32,
exp: u32,
azp: String,
scope: String
}

-这很好用。

最新更新