Как я могу вручную проверить токен, полученный с моего пользовательского сервера авторизации, с помощью jwt.io ?

#oauth #oauth-2.0 #jwt #openid #identityserver4

#oauth #oauth-2.0 #jwt #OpenID #identityserver4

Вопрос:

Я узнаю об OAuth2 и OpenID Connect, экспериментируя с ASP.NET Core и IdentityServer4. До сих пор я создавал защищенный сервер API, сервер авторизации и клиент, следуя определенному курсу Udemy. Все прошло хорошо, поскольку клиент может получить токен доступа с сервера авторизации и использовать его для доступа к защищенному API в ASP.NET Основной проект веб-API.

Однако мне любопытно, как я могу вручную проверить JWT, который я получаю с моего сервера авторизации. Токен, который я получаю, это:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjdiMjM1NzYyMTRlOTg3ZjE3NTdjMWYxNDE1ZTg4OGEyIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NTMyNTYxNzMsImV4cCI6MTU1MzI1OTc3MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9yZXNvdXJjZXMiLCJiYW5rT2ZEb3ROZXRBcGkiXSwiY2xpZW50X2lkIjoiY2xpZW50Iiwic2NvcGUiOlsiYmFua09mRG90TmV0QXBpIl19.boION1QMOxuHxgIkBT0hZchkCEzINSpIS20Az5HkkkkrbH72IHqC2u9tOQobCsPt4okSPIuKGmgsGY2oyPMNcQpZPAOivmKXknhij_lhTv7pzaSXmFFSSpih-eigk4243VkGz8fTH9vA_IHmQ59o9zv0Wva_pKBt9lBSd39BDocNblJR092VHl66gAp79iEJctDzEKBBdN_E-RCrgPPsetU_sO0wqgOuxA0wECAo_jQhPu3LkuU9sKfj2HAFGLVxwz0Is3SAg1XIXeZylivAJdXThMkVypjrFBTeehso_9g26MVY4bKCfZ5Bx75NmYUbOfpX1gLPSo0CWvTfHhwaNg

Когда я декодирую его на jwt.io веб-сайт, на котором я получаю заголовок:

 {
  "alg": "RS256",
  "kid": "7b23576214e987f1757c1f1415e888a2",
  "typ": "JWT"
}
  

и полезная нагрузка:

 {
  "nbf": 1553256173,
  "exp": 1553259773,
  "iss": "http://localhost:5000",
  "aud": [
    "http://localhost:5000/resources",
    "bankOfDotNetApi"
  ],
  "client_id": "client",
  "scope": [
    "bankOfDotNetApi"
  ]
}
  

Поскольку я использовал RS256 алгоритм для подписи, мне нужно добавить открытый ключ к jwt.io для проверки токена. Но где я могу получить этот открытый ключ?
Если я перейду к конечной точке обнаружения моего сервера аутентификации (например.http://localhost:5000/.well-known/openid-configuration/jwks ) Я получаю следующие данные:

 {
    keys: [
        {
            kty: "RSA",
            use: "sig",
            kid: "7b23576214e987f1757c1f1415e888a2",
            e: "AQAB",
            n: "509tIiUvmKkjjGOwzKElduRqpRND7YO-Op-IlsAeNwTlxY9_t22XfCqmxUyNvuvmdIVYXz-utl5bee3Tjwp8e7ok-Vn2uX-nI0jBcjTIKL0arbd7Qo5XgvICU4x-UcINrHtqMnY4S_R0uMKgaJkl3105bh9svQh--65tknjiKqmefT4M5SLHStWTisy2e0YwiaqvLam-O_rtbEawMy5-4avZep33y9Wz_JlgWyQ4jKD1Kn8mNGybjRoW3FJRkqzVNUSrGzjqwdDPL1cZOzM2HnbBqwVSFNnJiRYxPxKL_N8Q4CS9e2OVRjTof_EdzTTGC5mkOPhBCjpmvYS5d0j6JQ",
            alg: "RS256"
        }
    ]
}
  

Но какой из них является открытым ключом? Я попытался вставить значения для n , e и kid в jwt.io страница в текстовом поле открытого ключа в разделе «проверка подписи», но я всегда получаю ошибку «Недопустимая подпись».

Итак, как мне получить открытый ключ для токена RS256 из конечной точки обнаружения и как я могу использовать его для проверки токена вручную в jwt.io веб-сайт?

Ответ №1:

Поместите туда полное (первое и единственное) keys значение объекта, включая фигурные скобки, по крайней мере, следующее:

 { 
     "kty":"RSA",  
     "kid":"7b23576214e987f1757c1f1415e888a2", 
     "e":"AQAB", 
     "n":"509tIiUvmKkjjGOwzKElduRqpRND7YO-Op-IlsAeNwTlxY9_t22XfCqmxUyNvuvmdIVYXz-utl5bee3Tjwp8e7ok-Vn2uX-nI0jBcjTIKL0arbd7Qo5XgvICU4x-UcINrHtqMnY4S_R0uMKgaJkl3105bh9svQh--65tknjiKqmefT4M5SLHStWTisy2e0YwiaqvLam-O_rtbEawMy5-4avZep33y9Wz_JlgWyQ4jKD1Kn8mNGybjRoW3FJRkqzVNUSrGzjqwdDPL1cZOzM2HnbBqwVSFNnJiRYxPxKL_N8Q4CS9e2OVRjTof_EdzTTGC5mkOPhBCjpmvYS5d0j6JQ"
}