Как проверить токен Azure OAuth Access JWT в нативном Javascript без использования библиотеки? - PullRequest
1 голос
/ 27 января 2020

У меня есть токен доступа 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"
}

(После проверка предполагаемой аудитории (ауд)) Мне нужно проверить подпись. Для этого мне сначала нужно вычислить подпись. Для этого

  1. Мне нужно вызвать документ метаданных 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 соответствуют полям в заголовке.

Вопросы

  1. Как рассчитать фактическую подпись? В моем случае алгоритм подписи RS256, поэтому я должен сделать что-то вроде этого

RSASHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), public_key)

Что такое public_key? А в нативном Javascript есть функция RSASHA256?

1 Ответ

2 голосов
/ 27 января 2020

Получите х5т, который соответствует ребенку полученного токена. Это ключ publi c, хотя обычно требуется перевод в формат PEM.

Большинство людей затем используют сертифицированную библиотеку для проверки подписи с ключом publi c. Вот мой код , который делает это для проверки токена Azure.

Под нативным JavaScript Я предполагаю, что вы имеете в виду NodeJS, так как токены доступа проверяются API и не пользовательский интерфейс.

В конечном счете, я считаю, что библиотеки, такие как jsonwebtoken, вызывают базовый криптографический код операционной системы - не для слабонервных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...