Как проверить JWT-токен Skype Bot Connector?

Я пытаюсь проверить токен авторизации из эмулятора канала Microsoft Bot Framework в соответствии с документацией.

Я получаю документ метаданных OpenId с https://api.aps.skype.com/v1/.well-known/openidconfiguration и загружаю ключи с https://api.aps.skype.com/v1/keys.

Когда я отправляю сообщение из эмулятора моему боту, я получаю запрос к / api / messages с заголовком авторизации, который содержит токен JWT. Заголовок токена содержит эту информацию

{
  'alg': 'RS256',
  'kid': 'YbRAQRYcE_motWVJKHrwLBbd_9s',
  'x5t': 'YbRAQRYcE_motWVJKHrwLBbd_9s',
  'typ': 'JWT'
}

В соответствии с ценностью ребенка, я выбираю этот ключ JWK

{
  "kty": "RSA",
  "use": "sig",
  "kid": "YbRAQRYcE_motWVJKHrwLBbd_9s",
  "x5t": "YbRAQRYcE_motWVJKHrwLBbd_9s",
  "n": "vbcFrj193Gm6zeo5e2_y54Jx49sIgScv-2JO-n6NxNqQaKVnMkHcz-S1j2FfpFngotwGMzZIKVCY1SK8SKZMFfRTU3wvToZITwf3W1Qq6n-h-abqpyJTaqIcfhA0d6kEAM5NsQAKhfvw7fre1QicmU9LWVWUYAayLmiRX6o3tktJq6H58pUzTtx_D0Dprnx6z5sW-uiMipLXbrgYmOez7htokJVgDg8w-yDFCxZNo7KVueUkLkxhNjYGkGfnt18s7ZW036WoTmdaQmW4CChf_o4TLE5VyGpYWm7I_-nV95BBvwlzokVVKzveKf3l5UU3c6PkGy-BB3E_ChqFm6sPWw",
  "e": "AQAB",
  "x5c": ["MIIC4jCCAcqgAwIBAgIQfQ29fkGSsb1J8n2KueDFtDANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE2MDQxNzAwMDAwMFoXDTE4MDQxNzAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL23Ba49fdxpus3qOXtv8ueCcePbCIEnL/tiTvp+jcTakGilZzJB3M/ktY9hX6RZ4KLcBjM2SClQmNUivEimTBX0U1N8L06GSE8H91tUKup/ofmm6qciU2qiHH4QNHepBADOTbEACoX78O363tUInJlPS1lVlGAGsi5okV+qN7ZLSauh+fKVM07cfw9A6a58es+bFvrojIqS1264GJjns+4baJCVYA4PMPsgxQsWTaOylbnlJC5MYTY2BpBn57dfLO2VtN+lqE5nWkJluAgoX/6OEyxOVchqWFpuyP/p1feQQb8Jc6JFVSs73in95eVFN3Oj5BsvgQdxPwoahZurD1sCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAe5RxtMLU2i4/vN1YacncR3GkOlbRv82rll9cd5mtVmokAw7kwbFBFNo2vIVkun+n+VdJf+QRzmHGm3ABtKwz3DPr78y0qdVFA3h9P60hd3wqu2k5/Q8s9j1Kq3u9TIEoHlGJqNzjqO7khX6VcJ6BRLzoefBYavqoDSgJ3mkkYCNqTV2ZxDNks3obPg4yUkh5flULH14TqlFIOhXbsd775aPuMT+/tyqcc6xohU5NyYA63KtWG1BLDuF4LEF84oNPcY9i0n6IphEGgz20H7YcLRNjU55pDbWGdjE4X8ANb23kAc75RZn9EY4qYCiqeIAg3qEVKLnLUx0fNKMHmuedjg=="],
  "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0"
}

Для проверки токена я использую pyjwt. И здесь я не знаю, какой ключ использовать для проверки токена в функции jwt.decode().

jwt.decode(token, key=key_from_skype_com)

Для обоих полей n и x5c я попробовал эти варианты:

  • передать их как из отчаяния
  • base64url-декодировать их
  • base64url-декодирует их и загружает с помощью функции load_der_public_key() из пакета криптографии

Криптографический код

from cryptography.hazmat import backends
from cryptography.hazmat.primitives import serialization
serialization.load_der_public_key(decoded_key, backend=backends.default_backend())

Кажется, что поле n JWK закодировано в base64-urlsafe, а x5c - просто в base64. Поэтому я расшифровал их соответствующим образом.

Я не эксперт по криптографии. Я попытался найти документацию MS, которая в основном содержит примеры использования их SDK для Node.js и C#. И я прочитал RFC 7517 и RFC 7515, но не нашел никакой конкретной информации.

0 ответов

Другие вопросы по тегам