如何使用jwt.io手动验证从自定义授权服务器获得的令牌?

时间:2019-03-22 13:35:42

标签: oauth oauth-2.0 jwt openid identityserver4

我正在通过试验ASP.NET Core和IdentityServer4来学习OAuth2和OpenID Connect。到目前为止,我按照一定的Udemy课程创建了受保护的API服务器,授权服务器和客户端。由于客户端能够从授权服务器获取访问令牌并使用它来访问ASP.NET Core Web API项目中受保护的API,因此事情进展顺利。

但是,我很好奇如何手动验证从授权服务器获得的JWT。我得到的令牌是这样的:

  

eyJhbGciOiJSUzI1NiIsImtpZCI6IjdiMjM1NzYyMTRlOTg3ZjE3NTdjMWYxNDE1ZTg4OGEyIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NTMyNTYxNzMsImV4cCI6MTU1MzI1OTc3MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9yZXNvdXJjZXMiLCJiYW5rT2ZEb3ROZXRBcGkiXSwiY2xpZW50X2lkIjoiY2xpZW50Iiwic2NvcGUiOlsiYmFua09mRG90TmV0QXBpIl19.boION1QMOxuHxgIkBT0hZchkCEzINSpIS20Az5HkkkkrbH72IHqC2u9tOQobCsPt4okSPIuKGmgsGY2oyPMNcQpZPAOivmKXknhij_lhTv7pzaSXmFFSSpih-eigk4243VkGz8fTH9vA_IHmQ59o9zv0Wva_pKBt9lBSd39BDocNblJR092VHl66gAp79iEJctDzEKBBdN_E-RCrgPPsetU_sO0wqgOuxA0wECAo_jQhPu3LkuU9sKfj2HAFGLVxwz0Is3SAg1XIXeZylivAJdXThMkVypjrFBTeehso_9g26MVY4bKCfZ5Bx75NmYUbOfpX1gLPSo0CWvTfHhwaNg

当我在jwt.io网站上对其进行解码时,会显示Header:

{
  "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"
        }
    ]
}

但是其中哪些是公钥?我尝试将“ nekid的值粘贴到“验证签名”部分中公共密钥文本字段下的jwt.io页面,但是始终会收到“无效签名”错误。 / p>

那么如何从发现端点获取RS256令牌的公钥,以及如何在jwt.io网站中手动使用它来验证令牌?

1 个答案:

答案 0 :(得分:0)

将整个(第一个也是唯一的)filter_dict = {"{}__range".format(date_type): [date_one, date_two]} search = MyClass.objects.filter(**filter_dict) 对象值(包括大括号)放置在其中,至少包括以下内容:

keys