У меня есть токен доступа OAuth (от Azure). Я хотел бы проверить подпись.
Я декодировал токен
Заголовок
{
"typ": "JWT",
"alg": "RS256",
"x5t": "abc123",
"kid": "abc123"
}
И полезную нагрузку
{
"aud": "api://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"iss": "https://sts.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/",
"iat": 1580132587,
"nbf": 1580132587,
"exp": 1580136487,
"acct": 0,
"acr": "1",
"aio": "xxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxx==",
"amr": [
"pwd"
],
"appid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxf",
"appidacr": "0",
"ipaddr": "yyy.yyy.yyy.yyy",
"name": "test",
"oid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"scp": "user_impersonation",
"sub": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"unique_name": "test@mycompany.onmicrosoft.com",
"upn": "test@mycompany.onmicrosoft.com",
"uti": "xxxxxxxxxxxxx-xxxxxxxxx",
"ver": "1.0"
}
(После проверка предполагаемой аудитории (ауд)) Мне нужно проверить подпись. Для этого мне сначала нужно вычислить подпись. Для этого
- Мне нужно вызвать документ метаданных Azure, чтобы подтвердить ключ publi c в заголовке.
https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/.well-known/openid-configuration
После этого я получаю публичные c ключи (URI JWKS), например,
https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/discovery/v2.0/keys
Это дает мне массив
[{
"kty": "RSA",
"use": "sig",
"kid": "abc123",
"x5t": "abc123",
"n": "...",
"e": "...",
"x5c": [..."],
"issuer": " https: //login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0"
}, {
"kty": "RSA",
"use": "sig",
"kid": "...",
"x5t": "...",
"n": "....",
"e": "...",
"x5c": ["."],
"issuer": "https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0"
},
]
Я проверяю, что kid
и x5t
соответствуют полям в заголовке.
Вопросы
- Как рассчитать фактическую подпись? В моем случае алгоритм подписи RS256, поэтому я должен сделать что-то вроде этого
RSASHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), public_key)
Что такое public_key? А в нативном Javascript есть функция RSASHA256?