我有一个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
字段的任意声明。使用它们的路径主干(例如domain
或roles
(是不起作用的。有什么建议吗?
经过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
}
-这很好用。