Я пытаюсь понять аутентификацию с помощью openid connect
Я получил код авторизации, сервер может обменять его на токен доступа и идентификационный токен.
Я получил файл смой секретный ключ RSA:
"keys": [
{
"kty": "RSA",
"d": "FVSxlyJTtDw .....",
"dp": "dzTM-0C3 ....",
"dq": "XxhRvZewnnvY22....",
"e": "AQAB",
"use": "sig",
"kid": "s1",
"alg": "RS256",
"n": "pJADu0nyhCrh9XIR....",
"p": "0ktANeYxLEB1uEDkSQ....",
"q": "yFRFPKiUCelQ2c-vf,"
"qi": "FhvccbxuaCXAO7iYq2H.....",
},
{
"kty": "RSA",
"d": "J7jk1r3-83KZ7zPrrG659kTVwbsYNJxB.....",
"dp": "ALaPzpUH_1JpN6QmHKaAmruaRXYD_EJ6ZUcbNh".....",
"dq": "bIfqm7lKkuEeTxuOHHt4Iv2ifn.....",
"e": "AQAB.....",
"use": "enc",
"kid": "e1",
"alg": "RSA-OAEP",
"n": "jpEyL3uCZ1Grkg4sFTtAup0TxpZRiNb.....",
"p": "908JDuuB980K6cIf9CHkxVET1.....",
"q": "k5PU03Dl8qUpxArtTxT.....",
"qi": "AIbn9n3zD5VaWfyxxcneY510KSkm.....",
}
]
Первый вопрос: почему у меня два ключа?
Затем, как мне извлечь секретный ключ?
Если я прочитал документ:
Поле «kty» значения «RSA» идентифицирует его как ключ RSA.Значения полей "n" и "e" являются модулем в кодировке base64url и (общедоступным) показателем (соответственно) с использованием минимально необходимого количества октетов.Значение поля "d" является частным показателем в кодировке base64url с использованием минимально необходимого числа октетов.Поля "p", "q", "dp", "dq" и "qi" являются дополнительной частной информацией в кодировке base64url с использованием минимального необходимого количества октетов.
Для 2048-битного ключаполе "n" имеет длину 256 октетов при декодировании, а поле "d" длиной не более 256 октетов при декодировании.
Из того, что я понимаю, секретный ключ, следовательно, является полем: d
_keyPrivate = "FVSxlyJTtDw ....."; //field d:
var client = new RestClient("https://test/oidc/token");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.RequestFormat = DataFormat.Json;
request.AddParameter("grant_type", "authorization_code");
request.AddParameter("code", _code);
request.AddParameter("redirect_uri", "https://localhost:44302/");
request.AddParameter("client_assertion", (headerEncoded + "." + payloadEncoded + "." + _keyPrivate ));
request.AddParameter("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer");
IRestResponse response = client.Execute(request);
Но я получаю как ошибку:
{"error": "unauthorized_client", "detail": "Подписанное утверждение недействительно", "uid": "511334434"}
Можете ли вы мне помочь?
Я уже пробовал разные вещи, но безуспешно?
Нет ли способа загрузить файл .json в объект и извлечьзакрытый ключ?
Заранее спасибо