Существует настольное приложение Windows на основе .NET Framework, которое взаимодействует с внутренним веб-сайтом на основе PHP.Я испытываю постоянные сбои проверки подписи при попытке проверить токены, предоставленные приложением .NET на веб-сайт PHP (openssl_verify
возвращает 0
).
.NET Frameworkиспользует Microsoft Authentication Library (MSAL) для аутентификации пользователя в Azure Active Directory (AAD).Библиотека возвращает токен в виде строки.Приложение отправляет этот токен как часть своего запроса на сервер на основе PHP.
var result = await Application.AcquireTokenAsync (scopes) .ConfigureAwait (false);
var token = result.AccessToken;
headers.Add ("X-Auth-AAD-Token", токен);
Веб-сайт сервера на основе PHP получает токен, предоставленный.NET-приложение.Затем он пытается проверить токен и использовать его при запросе пользовательских данных из Azure Active Directory.Веб-сайт PHP использует библиотеку Networg / oauth2-azure , которая является поставщиком универсальной библиотеки thephpleage / oauth2-client , которая затем использует firebase / php-jwt библиотека для обработки токенов JWT.
Приложение PHP создает экземпляр Azure
провайдера и вызывает
$provider->validateAccessToken($token);
, где $token
- строка, полученная из.NET приложение.Этот метод вызывает
$keys = $this->getJwtVerificationKeys();
(array)JWT::decode($accessToken, $keys, ['RS256'])
, где $keys
- массив открытых ключей, полученных из конечной точки https://login.windows.net/common/discovery/keys
.
JWT::decode
затем разделяет токен на заголовок, полезную нагрузку иподпись, расшифруйте их, выберите правильный открытый ключ и проверьте подпись:
public static function decode($jwt, $key, array $allowed_algs = array())
$tks = explode('.', $jwt);
list($headb64, $bodyb64, $cryptob64) = $tks;
$header = static::jsonDecode(static::urlsafeB64Decode($headb64))
$sig = static::urlsafeB64Decode($cryptob64);
$key = $key[$header->kid];
static::verify("$headb64.$bodyb64", $sig, $key, $header->alg);
, где jsonDecode
звонки
$obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
и urlsafeB64Decode
выглядит как
public static function urlsafeB64Decode($input)
$remainder = strlen($input) % 4;
if ($remainder) {
$padlen = 4 - $remainder;
$input .= str_repeat('=', $padlen);
}
return base64_decode(strtr($input, '-_', '+/'));
Затем метод verify
пытается проверить подпись, вызвав openssl_verify
.
private static function verify($msg, $signature, $key, $alg)
list($function, $algorithm) = static::$supported_algs[$alg]; // list('openssl', 'SHA256')
openssl_verify($msg, $signature, $key, $algorithm);
Функция openssl_verify возвращает 0
, что означает, что проверка подписи завершилась неудачно(не соответствует).
Что я делаю не так?Как это исправить?
Редактировать: Я не должен проверять подпись, если токен не выдан для "я".Поскольку токен, который я проверял, относится к Graph API, только Graph API должен его проверять.После того как я изменил область действия токена, запрошенного для веб-приложения, подпись проверяется, как и ожидалось.