Day29 - 【概念篇】用Keycloak学习JWT权杖格式 - JWT权杖格式介绍(1)

本系列文之後也会置於个人网站


在今天文章之前...

小财神,「铁人发文」按钮还在阿!/images/emoticon/emoticon36.gif/images/emoticon/emoticon16.gif

好拉!那既然这样,以下今天文章开始:


总觉得...直接开始说明什麽是JWT格式来着。但感觉这样会很无聊,不如我们从已经拿到的Token来看吧!

至今爲止,除了存取权杖(access_token)、更新权杖(refresh_token)外,还拿到过识别权杖(id_token)。仔细看三者,都有两个「.」可以将权杖分成三个部份。

这些权杖都可以透过JWT.io去解析。总之先透过Password Grant Flow取得access_tokenrefresh_token,或是透过「快速开始」应用取得id_token

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ4VXh6WGR4UWpFNDNIZGdYbXJkUjBQZWxXN1ZoZWowbGRkR2NhN0VubXpZIn0.eyJleHAiOjE2MzM5OTIyNzgsImlhdCI6MTYzMzk5MTk3OCwianRpIjoiMzRlOWQxYjEtM2Q3MC00MmYwLTgzOTUtMGU3NDE1OGMxMmRjIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3F1aWNrLXN0YXJ0IiwiYXVkIjpbIm15LXF1aWNrLXN0YXJ0LWFwcCIsImFjY291bnQiXSwic3ViIjoiMzQ1YjFiY2EtOTgwNS00YjRiLWEwZjgtZGEyYzcwMTc2YzU5IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib2F1dGhfdG9vbHMiLCJzZXNzaW9uX3N0YXRlIjoiYjAxM2RmZjMtZmFjMy00YjVmLTkwMjctM2I0NTM1NzVmMzllIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyJodHRwczovL29hdXRoLnRvb2xzIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXF1aWNrLXN0YXJ0Iiwib2ZmbGluZV9hY2Nlc3MiLCJxdWljay1zdGFydC1leGFtcGxlLXJvbGUxIiwiR3JvdXAgUm9sZSBBIiwidW1hX2F1dGhvcml6YXRpb24iLCJlbXBsb3llZSJdfSwicmVzb3VyY2VfYWNjZXNzIjp7Im15LXF1aWNrLXN0YXJ0LWFwcCI6eyJyb2xlcyI6WyJxdWljay1zdGFydC1leGFtcGxlLXJvbGV4IiwiUmVhZGVyIl19LCJvYXV0aF90b29scyI6eyJyb2xlcyI6WyJ0ZXN0X3JvbGUiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImIwMTNkZmYzLWZhYzMtNGI1Zi05MDI3LTNiNDUzNTc1ZjM5ZSIsIndlYnNpdGUiOiJodHRwczovL2JvYi5pZCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJiaXJ0aGRhdGUiOiIyMDIxLzEwLzAzIiwiZ2VuZGVyIjoibWFuIiwibmlja25hbWUiOiLlsI_mmI4iLCJuYW1lIjoiQm9iIExlZSIsInByZWZlcnJlZF91c2VybmFtZSI6ImJvYiIsIm1pZGRsZV9uYW1lIjoiSiIsImdpdmVuX25hbWUiOiJCb2IiLCJmYW1pbHlfbmFtZSI6IkxlZSIsImVtYWlsIjoiYm9iQGZha2UuZW1haWwiLCJwaWN0dXJlIjoiaHR0cHM6Ly9jZG4ucGl4YWJheS5jb20vcGhvdG8vMjAxMy8wNy8xMy8xMC8wNy9tYW4tMTU2NTg0Xzk2MF83MjAucG5nIn0.kgI-wale8fgsBrB7CtWXJux-zWcK63FaI3BgNKBVx8BD33urWVkyqRqdjC5w0Y_qOKmyKEC8p0KB8ljqtpmGjFmwjM5Ntp8VSsiGCPHLVB28Xu2i9S_Px5kbJOOP4Dr_c6rLJhDH3SVZbVuHSH8n_0Fpgp7_6-mqoeK6yYW1MYagb0R9OwyaHCUfef68ODZpKvpbG-vRant5FsDU4N11KFzxUbGDe10Kx48HVonZB1NVy5K6rToT3qdZRf9g4z-n2ZJxiKqQGVJucUQYAHq56kDi95DsKBpoNodppzYDxb2ZCGCEz0FQFhkI_CSZaoawIXW_876KlI4iwcuFuuVWcw",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0NjUwNDBkYi1lNGJkLTRiYTYtOWM2Ny02ZWYxZGJmMmUxOWYifQ.eyJleHAiOjE2MzM5OTM3NzgsImlhdCI6MTYzMzk5MTk3OCwianRpIjoiZjZhM2QyMmMtOGM4My00OGFmLTkwMmQtMjg5MjIxYWEzZDFkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3F1aWNrLXN0YXJ0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3F1aWNrLXN0YXJ0Iiwic3ViIjoiMzQ1YjFiY2EtOTgwNS00YjRiLWEwZjgtZGEyYzcwMTc2YzU5IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6Im9hdXRoX3Rvb2xzIiwic2Vzc2lvbl9zdGF0ZSI6ImIwMTNkZmYzLWZhYzMtNGI1Zi05MDI3LTNiNDUzNTc1ZjM5ZSIsInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImIwMTNkZmYzLWZhYzMtNGI1Zi05MDI3LTNiNDUzNTc1ZjM5ZSJ9.jIbGrKmEG-ltLq2jWXA3l7c3Inq55y_72aaQpamscc0",
    "token_type": "Bearer",
    "not-before-policy": 1632625952,
    "session_state": "b013dff3-fac3-4b5f-9027-3b453575f39e",
    "scope": "email profile"
}

因为更新权杖refresh_token比较短,就以更新权杖为例。「.」将权杖分成三个部份,由上至下分别为「Header」、「Payload」、「Verify Signature」,也就是描述权杖基础资料(meta data)的「档头」、包含各个cliams权杖资料的「主要内容」、和证明权杖内容未被串改过得「数位签章」。之後会在一一分析各个部份的内容,现在就先看看如何将前两个部份主换成叫为容易读的JSON格式。

关於kidsid等等意义,与如何处理signature以证明权杖正确性。在iT铁人赛内容将不会提到。
原本有计划再一二篇详细分析JWT格式,以及其他相关的名词,也就包含:JOSE、JWT、JWS、JWE和JWK。也许会题到JWK,但不会好好说明区别。

前两个部份是经过Base64编码的结果,所以同样可以透过Base64进行解码:

echo <header|payload>| base64 -di -|python3 -m json.tool

也就是透过以下指令:

echo eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0NjUwNDBkYi1lNGJkLTRiYTYtOWM2Ny02ZWYxZGJmMmUxOWYifQ| base64 -di -|python3 -m json.tool

可以得到header的结果:

{
    "alg": "HS256",
    "typ": "JWT",
    "kid": "465040db-e4bd-4ba6-9c67-6ef1dbf2e19f"
}

如果拿access_tokenpayload来进行解析,就会得到以下结果:

其中看到不少在User & GroupUser & Claim & Profile 所设定和看到的内容。


<<:  JavaScript Day31 - 系列目录

>>:  [NestJS 带你飞!] DAY31 - 实战演练 (下)

Day21:今天来聊一下Azure Sentinel 介绍

传统的安全性资讯与事件管理(SIEM)系统通常需要很长的时间 来安装及设定。这类系统在设计时也不一定...

铁人赛 Day3 -- PHP 基本语法 & 常用的预设变数

PHP起手式 我PHP程序不写也在这之中,将会无法正确执行我们的程序码 <?php ?>...

Day30 -- Countdown Clock

目标 今天要来做的是倒数计时器 Step1 let countdown; function time...

Unity自主学习(三):如何安装Unity(二)

我们昨天为了接下来的学习,安装了"Unity Hub",今天就要来熟悉一下Uni...

Day 17 ATT&CK for ICS - Persistence(2)

T0857 System Firmware 韧体做为跟硬体的互动的桥梁,若设备中的可能有韧体安全的问...