From e8f9e8fede905621f5bb6498d91fc74664fa3f1c Mon Sep 17 00:00:00 2001 From: Emin Martinian Date: Thu, 1 May 2025 22:23:56 -0400 Subject: [PATCH 1/5] Improvements to slides including highlight hacks and examples --- docs/custom.css | 10 ++ docs/custom_highlight.js | 92 ++++++++++++ docs/slides.org | 294 +++++++++++++++++++++++++-------------- 3 files changed, 291 insertions(+), 105 deletions(-) create mode 100644 docs/custom.css create mode 100644 docs/custom_highlight.js diff --git a/docs/custom.css b/docs/custom.css new file mode 100644 index 0000000..2667178 --- /dev/null +++ b/docs/custom.css @@ -0,0 +1,10 @@ + + .highlight { + background-color: yellow; + } + .highlight-line { + background-color: yellow; + display: block; + //padding: 2px 4px; +} + diff --git a/docs/custom_highlight.js b/docs/custom_highlight.js new file mode 100644 index 0000000..cdbb288 --- /dev/null +++ b/docs/custom_highlight.js @@ -0,0 +1,92 @@ + +if (typeof patternMap === 'undefined') { + var patternMap = {}; +} + +var my_pattern = null; + Reveal.addEventListener('slidechanged', function(event) { + highlightLinesWithPatterns(event.currentSlide, patternMap); + }); + + function highlightLinesWithDecorator(slide, pattern) { + slide.querySelectorAll('.src').forEach(el => { + const originalLines = el.innerHTML.split('\n'); + const processedLines = []; + + originalLines.forEach(line => { + // Check if line contains pattern + if (line.includes(pattern) && !line.includes('highlight-line')) { + // Find the position of the first span tag + const firstSpanIndex = line.indexOf('${fromSpan}` + ); + } else { + // If no span tag found, just add the line as is + processedLines.push(line); + } + } else { + processedLines.push(line); + } + }); + + el.innerHTML = processedLines.join('\n'); + }); +} + + + +function highlightLinesWithPatterns(slide, patternMap) { + // patternMap is a dictionary like {section_id_1: 'pattern_1', section_id_2: 'pattern_2', ...} + console.log('checking'); + const startSpan = ''; + slide.querySelectorAll('.src').forEach(el => { + // Find the parent section element to get its ID + let parentSection = el.closest('section'); + let sectionId = parentSection ? parentSection.id : null; + console.log(`checking section ${sectionId}`) + // Determine which pattern to use based on section ID + let patternToUse = sectionId && patternMap[sectionId] + ? patternMap[sectionId] + : null; + + // Skip if no matching pattern found for this section + if (!patternToUse) return; + + const originalLines = el.innerHTML.split('\n'); + const processedLines = []; + + originalLines.forEach(line => { + // Check if line contains the pattern for this section + if (line.includes(patternToUse) && !line.includes('highlight-line')) { + // Find the position of the first span tag + const firstSpanIndex = line.indexOf('` + ); + } else { + // If no span tag found, just add the line as is + processedLines.push(line); + } + } else { + processedLines.push(line); + } + }); + + el.innerHTML = processedLines.join('\n'); + }); +} diff --git a/docs/slides.org b/docs/slides.org index a4d5c00..3bd6859 100644 --- a/docs/slides.org +++ b/docs/slides.org @@ -8,42 +8,127 @@ #+REVEAL_ROOT: https://cdn.jsdelivr.net/npm/reveal.js@4.0.0/ #+REVEAL_PLUGINS: (notes) #+REVEAL_THEME: solarized -#+REVEAL_INIT_OPTIONS: fragments:true, transition:'fade' +#+REVEAL_INIT_OPTIONS: fragments:true, transition:'fade', margin: 0.0001, width:'100%' +#+REVEAL_EXTRA_SCRIPT_SRC: custom_highlight.js +#+REVEAL_EXTRA_CSS: custom.css #+COMMENT: Use `s` to engage speaker mode #+TITLE: Tips, Tricks, and Reasons for JSON Web Tokens (JWTs) #+AUTHOR: Emin Martinian +#+BEGIN_EXPORT html + +#+END_EXPORT -* Basic Setup :noexport: -#+BEGIN_SRC emacs-lisp :exports none -(require 'ox-reveal) +* Macro Example -;; Make sure to use version 4.0 and set REVEAL_REVEAL_JS_VERSION below -(setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js@4.0.0/") -(setq org-reveal-plugins '(notes)) -(setq org-export-babel-evaluate 't) -#+END_SRC +This example defines a code block called =example-code-block= and then +uses noweb syntax to reference it in later slides and the next with +slight tweaks. -#+RESULTS: -: t +#+name: example-code-block +#+BEGIN_SRC python :exports none :results value +@app.route('/support/urgent') # built-in flask decorator +@requires_jwt # custom decorator to validate JWT +@jwt_claims(['paid_support']) # ensures token is for premium user +@jwt_iat(datetime.timedelta(hours=24)) # ensure recent token +def support_urgent(): + ... # process ending support request +#+END_SRC +* Macro Example -* Code Fragment Example :noexport: +- First reference -#+BEGIN_SRC python -print("This appears immediately") +#+BEGIN_SRC python :noweb yes :exports code +# here it is +<> #+END_SRC -#+ATTR_REVEAL: :frag appear -#+BEGIN_SRC python -print("This appears after clicking") +* Reusing macro + :PROPERTIES: + :CUSTOM_ID: reusing-macro + :END: + +- Second reference with highlight + +#+COMMENT: setup highlighting +#+html: + + +#+BEGIN_SRC python :noweb yes :exports code +# another version +<> #+END_SRC + +* Fancy Fragment :noexport: + +#+MACRO: fb @@html:
@@ +#+MACRO: fe @@html:
@@ + +{{{fb(1)}}} + - Point A +#+begin_src +Code for point A +#+end_src +{{{fe}}} +{{{fb(2)}}} + - Point B +#+begin_src +Code for point B +#+end_src +{{{fe}}} +{{{fb(3)}}} + - Point C +#+begin_src bash +Code for point C +#+end_src +{{{fe}}} + +* Fancy Table :noexport: + +| @@html:
A
@@ | @@html:
B
@@ | +|--------------------------------------------------------------------+---| +| @@html:
C
@@ | @@html:
D
@@ | + +* Embedded graphviz :noexport: + +Could use graphviz online at https://rsms.me/graphviz/ to visualize +the diagram as you are create it or below to generate it using +javascript. Harder to manage width in org-reveal, so we just stick to +locally generated images. + +#+begin_export html + + +
+#+END_export + +* Mermaid.js :noexport: + +Could also use mermaid.js (and [[https://www.mermaidchart.com/play][online editor]]) to create + embed +diagram. Pretty cool, but more limited layout options than graphviz. + * JWT: JSON Web Token Used for authentication/authorization such as: @@ -70,38 +155,37 @@ Imagine app with many features + servers + engineers: - Can't give everyone access to sensitive info -* JWT Architecture +* Authentication vs Validation #+BEGIN_NOTES - Auth server manages passwords, takes credit cards, etc. - Must be secure and in sync; hard to load balance - Cannot let just any employee have access #+END_NOTES -Separate authentication from validation/application: -- Authentication requires secret keys (high security) -- Validation can use public key (less security) -- Easier to manage secrets, keys, load, sync, etc. - #+name: jwt-auth-vs-app-start #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-auth-vs-app-start.jpg :eval never-export - digraph auth_system { + node [fontsize="30"]; + edge [fontsize="30"]; + // Define subgraphs subgraph top { rank=same; - AuthServer [label="Auth Server", shape=box]; - hidden [style=invis]; + AuthServer [label="Auth Server\n", shape=box]; + hidden [style=invis]; AppServer [label="App Server(s)", shape=box]; } - subgraph bottom { rank=same; Client [label="Client", shape=box]; } + AuthServer -> hidden [color=none,xlabel="\nAuthentication requires\nsecret keys (high security)",fontsize="20"]; + AppServer -> hidden [color=none,xlabel="\nValidation can use\n public key (less security)",fontsize="20"]; + // Define connections AuthServer -> Client [label="JWT", constraint=false, splines=ortho, style=invis]; - Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth\nor credit card)", constraint=false, splines=ortho, style=invis]; + Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth or\ncredit card)", constraint=false, splines=ortho,style=invis]; Client -> AppServer [label="Request Service\nusing JWT", constraint=false, splines=ortho,style=invis]; // Define hidden edges to force layout @@ -112,10 +196,10 @@ digraph auth_system { #+end_src +#+ATTR_HTML: :width 90% #+RESULTS: jwt-auth-vs-app-start [[file:images/jwt-auth-vs-app-start.jpg]] - * JWT: Authentication Request #+BEGIN_NOTES @@ -125,19 +209,12 @@ Managing the authentication server is more complicated. #+END_NOTES -Client authenticates to server: - -#+ATTR_REVEAL: :frag (appear appear) -- Auth server must be secure -- Payment or Login with username/password/MFA -- May require database check, locks, other slow ops - - - #+name: jwt-auth-vs-app-auth #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-auth-vs-app-auth.jpg :eval never-export digraph auth_system { + node [fontsize="30"]; + edge [fontsize="30"]; // Define subgraphs subgraph top { rank=same; @@ -164,23 +241,20 @@ digraph auth_system { #+end_src +#+ATTR_HTML: :width 90% #+RESULTS: jwt-auth-vs-app-auth [[file:images/jwt-auth-vs-app-auth.jpg]] * JWT: Authentication Response -Server responds with JWT: - -#+ATTR_REVEAL: :frag (appear appear) -- header describing JWT -- claims describing info/rights (iat, nbf, exp, etc.) -- signature from Auth Server - #+name: jwt-auth-vs-app-auth-response #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-auth-vs-app-auth-response.jpg :eval never-export digraph auth_system { + node [fontsize="30"]; + edge [fontsize="30"]; + // Define subgraphs subgraph top { rank=same; @@ -194,9 +268,12 @@ digraph auth_system { Client [label="Client", shape=box]; } + AppServer -> hidden [style=invis]; + // Define connections + Client -> AuthServer [label=" JWT contains:\nheader\nclaims\nsignature", color=none,constraint=false, splines=ortho]; AuthServer -> Client [label="JWT", constraint=false, splines=ortho]; - Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth)", constraint=false, splines=ortho,style=invis]; +// Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth)", constraint=false, splines=ortho,style=invis]; Client -> AppServer [label="Request Service\nusing JWT", constraint=false, splines=ortho,style=invis]; // Define hidden edges to force layout @@ -207,6 +284,7 @@ digraph auth_system { #+end_src +#+ATTR_HTML: :width 90% #+RESULTS: jwt-auth-vs-app-auth-response [[file:images/jwt-auth-vs-app-auth-response.jpg]] @@ -214,26 +292,20 @@ digraph auth_system { * JWT: Application Request #+BEGIN_NOTES -- Distributed Trust -- App Server(s) can be load balanced or serverless -- App Server(s) can be maintained with lower security requirements -#+END_NOTES - - -Client sends JWT to App Server: - -#+ATTR_REVEAL: :frag (appear appear) -- App Server validates JWT with public key +- App Server validates JWT with public key (lower security needs) - No DB/state/sync/update; can be serverless - Checks JWT for rights + provides service - +#+END_NOTES #+name: jwt-auth-vs-app-request-app #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-auth-vs-app-request-app.jpg :eval never-export digraph auth_system { + node [fontsize="30"]; + edge [fontsize="30"]; + // Define subgraphs subgraph top { rank=same; @@ -248,8 +320,8 @@ digraph auth_system { } // Define connections - AuthServer -> Client [label="JWT", constraint=false, splines=ortho,style=invis]; - Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth)", constraint=false, splines=ortho,style=invis]; + Client -> AuthServer [label="App Server\nvalidates\nJWT with\npublic key", color=none,constraint=false, splines=ortho]; +// Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth)", constraint=false, splines=ortho,style=invis]; Client -> AppServer [label="Send JWT to\nRequest Service", constraint=false, splines=ortho]; // Define hidden edges to force layout @@ -260,6 +332,7 @@ digraph auth_system { #+end_src +#+ATTR_HTML: :width 90% #+RESULTS: jwt-auth-vs-app-request-app [[file:images/jwt-auth-vs-app-request-app.jpg]] @@ -276,42 +349,6 @@ Auth Server has **secrets**; needs **security** + maintenance - Easy to deploy App Server(s); e.g., serverless - Lower security for App Server(s), logs, debug, etc. -#+name: jwt-auth-vs-app-separate -#+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-auth-vs-app-separate.jpg :eval never-export - -digraph auth_system { - // Define subgraphs - subgraph top { - rank=same; - AuthServer [label="Auth Server", shape=box]; - hidden [style=invis]; - AppServer [label="App Server(s)", shape=box]; - } - - subgraph bottom { - rank=same; - Client [label="Client", shape=box]; - } - - // Define connections - AuthServer -> Client [label="JWT", constraint=false, splines=ortho,style=invis]; - Client -> AuthServer [label="Authenticate\n(e.g., login\nor OAuth)", constraint=false, splines=ortho,style=invis]; - Client -> AppServer [label="Send JWT to\nRequest Service", constraint=false, splines=ortho, style=invis]; - - // Define hidden edges to force layout - AuthServer -> hidden [style=invis]; - hidden -> AppServer [style=invis]; - hidden -> Client [style=invis]; -} - -#+end_src - -#+RESULTS: jwt-auth-vs-app-separate -[[file:images/jwt-auth-vs-app-separate.jpg]] - - - - * What do JWTs look like? @@ -359,6 +396,9 @@ MC4CAQAwBQYDK2VwBCIEIC+D6rD2YbXtV0ccR3smoR0ynhVuyyqvplFLbQWDdAtn - indicate username, roles, rights, restrictions, payments #+END_NOTES +#+COMMENT: May want to set sub-nodes (with **) below to :noexport: +#+COMMENT: to simplify navigation when doing presentation + ** Secret Key #+BEGIN_NOTES @@ -455,13 +495,28 @@ Decoded Payload from JWT: - *nbf*: Not before (useful for managing life-cycle ) * Python/Flask Example + :PROPERTIES: + :CUSTOM_ID: python-flask-example + :END: + +#+BEGIN_EXPORT html + +#+END_EXPORT + +- Easy to verify/decode using libraries (e.g., =pyjwt=) + - can compose checks using decorators: -Easy to verify/decode using libraries (e.g., =pyjwt=) and compose -checks using decorators: +#+html: #+BEGIN_SRC python -@app.route('/support/urgent') -@requires_jwt # validates JWT +@app.route('/support/urgent') # built-in flask decorator +@requires_jwt # custom decorator to validate JWT @jwt_claims(['paid_support']) # ensures token is for premium user @jwt_iat(datetime.timedelta(hours=24)) # ensure recent token def support_urgent(): @@ -490,6 +545,7 @@ proc = subprocess.Popen([sys.executable, 'app.py'], env=my_env) * Example of =@requires_jwt= +#+ATTR_REVEAL: :code_attribs data-line-numbers='4|5' #+BEGIN_SRC python def requires_jwt(func): @wraps(func) @@ -683,15 +739,33 @@ print(req.text) -* Anti-Patterns +* Caveats -#+ATTR_REVEAL: :frag (appear appear appear) +#+ATTR_REVEAL: :frag (appear appear) - Beware using header fields to check signature - don't trust =alg= field or limit possibilities - e.g., ~algorithms=['EdDSA']~ - be careful with =kid=, =jku=, =jwk=, etc. - Don't simulate sessions with JWTs -- Token revocation issue: access/refresh tokens + - Use access/refresh tokens to solve logout/revocation + +* Example JKU Header Attack + +#+ATTR_REVEAL: :frag (none appear appear) +- Header can provide URL for key (useful): + - src_shell[:exports code]{{alg: "EdDSA", jku: "https://good.com/pk.json"}} +- Attacker can replace JKU with their own key: + - src_shell[:exports code]{{alg: "EdDSA", jku: "https://bad.com/pk.json"}} +- Don't trust header (validate against whitelist) + +* Example ALG Header Attack + +#+ATTR_REVEAL: :frag (none appear appear) +- Header can provide URL for key (useful): + - src_shell[:exports code]{{alg: "EdDSA", jku: "https://good.com/pk.json"}} +- Attacker can replace ALG with symmetric version: + - src_shell[:exports code]{{alg: "HS256", jku: "https://bad.com/pk.json"}} +- Don't trust header (validate against whitelist) * Revocation via Access/Refresh @@ -720,7 +794,6 @@ server will invalidate refresh token + require new credential check. #+name: jwt-get-refresh #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-get-refresh.jpg :eval never-export - digraph auth_system { // Define subgraphs subgraph top { @@ -747,6 +820,7 @@ digraph auth_system { } #+END_SRC +#+ATTR_HTML: :width 90% #+RESULTS: jwt-get-refresh [[file:images/jwt-get-refresh.jpg]] @@ -782,6 +856,7 @@ digraph auth_system { } #+END_SRC +#+ATTR_HTML: :width 90% #+RESULTS: jwt-get-access [[file:images/jwt-get-access.jpg]] @@ -817,11 +892,15 @@ digraph auth_system { } #+END_SRC +#+ATTR_HTML: :width 90% #+RESULTS: jwt-use-access [[file:images/jwt-use-access.jpg]] * Revocation + :PROPERTIES: + :ID: b85213ac-fd6e-4453-a250-141ea99156c6 + :END: #+name: jwt-revoke #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/jwt-revoke.jpg :eval never-export @@ -853,6 +932,7 @@ digraph auth_system { } #+END_SRC +#+ATTR_HTML: :width 90% #+RESULTS: jwt-revoke [[file:images/jwt-revoke.jpg]] @@ -871,14 +951,18 @@ and separate validation from parsing. - e.g., NGINX can verify before passing to app server #+RESULTS: nginx-example [[file:images/nginx-example.jpg]] -- See implementation in =nginx= directory: -- https://github.com/aocks/ox_jwt ([[https://github.com/aocks/ox_jwt/blob/main/nginx/conf.d/example.conf#L44][example.conf]]) +- See [[https://github.com/aocks/ox_jwt/blob/main/nginx/conf.d/example.conf#L44][example.conf]] in =nginx= directory on [[https://github.com/aocks/ox_jwt][github.com/aocks/ox_jwt]] + +#+ATTR_HTML: :width 50% #+name: nginx-example #+begin_src dot :cmdline -Kdot -Tjpg :exports results :file images/nginx-example.jpg :eval never-export ,#+BEGIN_SRC dot digraph RequestFlow { + node [fontsize="30"]; + edge [fontsize="30"]; + rankdir = LR; request [label="request\nwith JWT"]; request -> nginx; From 2666bde2159754041da2f80a54ba3151ff386b22 Mon Sep 17 00:00:00 2001 From: Emin Martinian Date: Thu, 1 May 2025 22:47:26 -0400 Subject: [PATCH 2/5] updated images --- docs/images/jwt-auth-vs-app-auth-response.jpg | Bin 8957 -> 26300 bytes docs/images/jwt-auth-vs-app-auth.jpg | Bin 11818 -> 26960 bytes docs/images/jwt-auth-vs-app-request-app.jpg | Bin 9792 -> 30856 bytes docs/images/jwt-auth-vs-app-start.jpg | Bin 7637 -> 27417 bytes docs/images/nginx-example.jpg | Bin 20572 -> 43984 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/jwt-auth-vs-app-auth-response.jpg b/docs/images/jwt-auth-vs-app-auth-response.jpg index 6dae253654f6f57bd49862de80cc4424e31c619e..1160b0e3ed123f5c8186e091d38a1cdc45fd5e14 100644 GIT binary patch literal 26300 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 JVR(N3zW}Xla5(?~ literal 8957 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 diff --git a/docs/images/jwt-auth-vs-app-auth.jpg b/docs/images/jwt-auth-vs-app-auth.jpg index e9847b3136c4687e5b87b19b8623a505d874559a..c029aedf5c4d0a12a8a407a1df70c9f853fdf6e6 100644 GIT binary patch literal 26960 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 literal 11818 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 AwEzGB diff --git a/docs/images/jwt-auth-vs-app-request-app.jpg b/docs/images/jwt-auth-vs-app-request-app.jpg index 79ab6d2105fd3961a2ca2260a9481227ddc040d9..1edb1ff74250c292165f762940419d6ce4e92dd1 100644 GIT binary patch literal 30856 zcmeFZ1yo$YmM(l64;tJhKmrNwZXs9*9^3;23m%}+MuG&F00|x-!69hl?!h&|n??cz z=teu}-*?`>X70Un-~1!*&3gY@uY1)xr`D0KT~&MU+WY&e?|$5^1NWaRt0@B@5D2hB ze}TJOKvq##N#UiIt|W`SEsvACojr?>053lar?;1*t38X_a}}27+Da-cKH~h3xmj%O zUR!&=dCTJAZT-gatsnl~5}*j+;o#unVB_K9;@-Q5hfhdBL`XnDNJ~aeLcvJK%*05? zz`(-J%fZ6R&BnmMDfXC~UqDz`n3+RDMqE&uS4dd!FE0VzyLXR}fRKiWh(_=M!vn$p z@aL`zAjJc@VTxmdSOE-D5GE<;t`A@a01!4>+P?_=|9(Iim{{02xOn&Q3D7q*+y^i~ zn3xz?nAq4@Sm?Wh(ANPhQf#sZ0tz_fI@Y+X9u$J1$)EAqp4N0z>P{ipgFMq39~c}O9+{q*ott0y@pBQj z0pHx(-ubn=hde$xJv+ZZ{ki;$Tp$4Re~9(ZlKq`rq-eP?u&^+(aQ`9~2*Vd$FiEkn z9|+)(Dd^x@dyumVhT>5?P5xZdeUD8@7eV>Ta|)k|T^RNd`4`dtNwR;RU}66$$^Kce zf01huAjAZr2M?1JkOM9*ISbk5L-09=&i=O_g#jHUivI_#+wuAb? zYcFc%rIpsNh?M8K%GKP8PadTCa=n_@6_m|q?y0;3dg>8cH~5$KHzx#L)hb8GPi^4iRk)&_@>-56|8-eW2r+9+= zgYNvet@r@+4#1!3mOJIz&AV9F`Rj_I7Ddejz6N?-n#=nTfVphIx!OerdD@L z22Op6vhk+RBsIm&IoSMn%UM1y!o zEkiRy0~%kf7X8ZhRWKYgQX~Jq`@IPTd9uG5L&(33C*_>Zzde8ypppNcXN?v*$S0-c z;CZ-OMUGVIy2F0%2?%A1+M9HnaEmCj;`fkEPlVwO#Ow~(WuFDjP5sw35!4HYD$jVY zF{3Od^lKxJmwx*mZM|sCa2G|1Upw6ae?67e%I|>T7l_Uq@E-H{YD>%ie7^0KMtmCdr)?zPY(n>Hc{`$Rtr!W6)-TgPetIvjv{Jg&vWf$qSIk=}a#HZ*_w)t$gX);yUmI?aVEytnNiQun-Sa_yUh*m~SJ`TY z1rFuB$I}Gad8&K?Ebo8_$Mw8R%F~G}1m|B@xC(1ORlRZ9amQ36YsUPlI;Qo1$kh9r zzA)FfL527E1T!{7>=<*jG$$!KI^yA&z9&JH+^9)|=0k-3XNG2VhF&{m*itWHmFp|} z$I2fq15&*3_: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 literal 9792 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 *BC$uX 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 literal 7637 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 z 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 From b75af3697fb68d60d0c1c6fa7d754e6ee4fc38d9 Mon Sep 17 00:00:00 2001 From: Emin Martinian Date: Thu, 1 May 2025 22:53:26 -0400 Subject: [PATCH 3/5] Fixes and docs to highlighting --- docs/custom_highlight.js | 98 ++++----- docs/slides.html | 465 +++++++++++++++++++++------------------ docs/slides.org | 100 +++++++-- 3 files changed, 379 insertions(+), 284 deletions(-) diff --git a/docs/custom_highlight.js b/docs/custom_highlight.js index cdbb288..4ae1127 100644 --- a/docs/custom_highlight.js +++ b/docs/custom_highlight.js @@ -1,71 +1,62 @@ -if (typeof patternMap === 'undefined') { - var patternMap = {}; +// This file is a bit of a hack. It allows us to force +// highlighting of line of code. See slides.org for example +// usage. In theory, we could have used highlight.js, but +// I did not like how that dimmed unhighlighted areas and +// generally made the syntax highlighting look ugly. + +// ---------------Start clip section------------------------- +// You will need to put the code between here and the +// commend called "end clip section" at the start of +// your HTML file (e.g., via +BEGIN_EXPORT html) so +// that you get these variables and functions defined +// at the start for slides to use them. + +if (typeof highlightLineMapper === 'undefined') { + var highlightLineMapper = {}; } -var my_pattern = null; - Reveal.addEventListener('slidechanged', function(event) { - highlightLinesWithPatterns(event.currentSlide, patternMap); - }); +function highlightSlide(sectionId, lines) { + highlightLineMapper[sectionId] = new Set(lines) +} - function highlightLinesWithDecorator(slide, pattern) { - slide.querySelectorAll('.src').forEach(el => { - const originalLines = el.innerHTML.split('\n'); - const processedLines = []; +// -----------------End clip section------------------------- - originalLines.forEach(line => { - // Check if line contains pattern - if (line.includes(pattern) && !line.includes('highlight-line')) { - // Find the position of the first span tag - const firstSpanIndex = line.indexOf('${fromSpan}` - ); - } else { - // If no span tag found, just add the line as is - processedLines.push(line); - } - } else { - processedLines.push(line); - } - }); - el.innerHTML = processedLines.join('\n'); + Reveal.addEventListener('slidechanged', function(event) { + highlightLinesWithLines(event.currentSlide, highlightLineMapper); }); -} - -function highlightLinesWithPatterns(slide, patternMap) { - // patternMap is a dictionary like {section_id_1: 'pattern_1', section_id_2: 'pattern_2', ...} - console.log('checking'); +function highlightLinesWithLines(slide, lineMap) { + // lineMap is a dictionary like + // {section_id_1: Set, section_id_2: Set, ...} + // where each Set contains line numbers (1-based) to highlight const startSpan = ''; + slide.querySelectorAll('.src').forEach(el => { // Find the parent section element to get its ID let parentSection = el.closest('section'); let sectionId = parentSection ? parentSection.id : null; - console.log(`checking section ${sectionId}`) - // Determine which pattern to use based on section ID - let patternToUse = sectionId && patternMap[sectionId] - ? patternMap[sectionId] - : null; + console.log(`checking section ${sectionId}`); + + // Get the set of line numbers to highlight for this section + let linesToHighlight = sectionId && lineMap[sectionId] + ? lineMap[sectionId] + : null; - // Skip if no matching pattern found for this section - if (!patternToUse) return; + // Skip if no line numbers set found for this section + if (!linesToHighlight) return; const originalLines = el.innerHTML.split('\n'); const processedLines = []; - - originalLines.forEach(line => { - // Check if line contains the pattern for this section - if (line.includes(patternToUse) && !line.includes('highlight-line')) { + + // Process each line, highlighting those whose line number (1-based) is in the set + originalLines.forEach((line, index) => { + // Check if this line number (converting to 1-based) should be highlighted + const lineNumber = index + 1; + + if (linesToHighlight.has(lineNumber) && !line.includes('highlight-line')) { // Find the position of the first span tag const firstSpanIndex = line.indexOf('` ); } else { - // If no span tag found, just add the line as is - processedLines.push(line); + // If no span tag found, wrap the entire line + processedLines.push(`${startSpan}${line}`); } } else { + // Not a line to highlight, keep as is processedLines.push(line); } }); - + el.innerHTML = processedLines.join('\n'); }); } diff --git a/docs/slides.html b/docs/slides.html index fc44200..7445125 100644 --- a/docs/slides.html +++ b/docs/slides.html @@ -13,6 +13,7 @@ +

@@ -20,11 +21,20 @@

Tips, Tricks, and Reasons for JSON Web Tokens (JWTs)

Emin Martinian

+
-
-

JWT: JSON Web Token

+
+

JWT: JSON Web Token

Used for authentication/authorization such as:

@@ -46,12 +56,11 @@

JWT: JSON Web Token

-
-
-

Why JWTs?

+
+

Why JWTs?

Imagine app with many features + servers + engineers:

@@ -66,13 +75,11 @@

Why JWTs?

- -
-
-

JWT Architecture

+
+

Authentication vs Validation

-

-Separate authentication from validation/application: -

-
    -
  • Authentication requires secret keys (high security)
  • -
  • Validation can use public key (less security)
  • -
  • Easier to manage secrets, keys, load, sync, etc.
  • - -
- -
-

jwt-auth-vs-app-start.jpg +

+

jwt-auth-vs-app-start.jpg

- -
-
-

JWT: Authentication Request

+
+

JWT: Authentication Request

-

-Client authenticates to server: -

- -
    -
  • Auth server must be secure
  • -
  • Payment or Login with username/password/MFA
  • -
  • May require database check, locks, other slow ops
  • - -
- - - -
-

jwt-auth-vs-app-auth.jpg +

+

jwt-auth-vs-app-auth.jpg

- -
-
-

JWT: Authentication Response

-

-Server responds with JWT: -

+
+

JWT: Authentication Response

-
    -
  • header describing JWT
  • -
  • claims describing info/rights (iat, nbf, exp, etc.)
  • -
  • signature from Auth Server
  • - -
- - -
-

jwt-auth-vs-app-auth-response.jpg +

+

jwt-auth-vs-app-auth-response.jpg

- -
-
-

JWT: Application Request

+
+

JWT: Application Request

-

-Client sends JWT to App Server: -

- -
    -
  • App Server validates JWT with public key
  • -
  • No DB/state/sync/update; can be serverless
  • -
  • Checks JWT for rights + provides service
  • - -
- - - - - -
-

jwt-auth-vs-app-request-app.jpg +

+

jwt-auth-vs-app-request-app.jpg

- - - - -
-
-

Separate Auth From Validation

+
+

Separate Auth From Validation

Auth Server has secrets; needs security + maintenance

@@ -216,23 +163,11 @@

Separate Auth From Validation

  • Lower security for App Server(s), logs, debug, etc.
  • - - -
    -

    jwt-auth-vs-app-separate.jpg -

    -
    - - - - - -
    -
    -

    What do JWTs look like?

    +
    +

    What do JWTs look like?

    Base64 encoded header.payload.signature:

    @@ -290,10 +225,9 @@

    What do JWTs look like?

    -
    -
    -

    Secret Key

    +
    +

    Secret Key

    - - -
    -

    Public Key

    +
    +

    Public Key

    sk = serialization.load_der_private_key(  # de-serialize encoded key
    @@ -349,12 +281,9 @@ 

    Public Key

    MCowBQYDK2VwAyEAUVLjZWAVK5ZE1ewI5QBdr0Nig1Qkx3kl5zHIADvw0M8= -----END PUBLIC KEY-----
    - - -
    -
    -

    Encoding Example JWT

    +
    +

    Encoding Example JWT

    import textwrap  # just for display
    @@ -378,10 +307,9 @@ 

    Encoding Example JWT

    .SU6aXJ0YbH7Vg1jROpQfvnhn98Rt9zBeS7-c5O9jH- LL5mQqMMFq61eZjf0tLLqExm-dckRUNa3-qT7R2SKmCw
    -
    -
    -

    Decoding Example JWT

    +
    +

    Decoding Example JWT

    decoded_jwt = jwt.decode(example_jwt, algorithms=['EdDSA'], key=pk)
    @@ -395,12 +323,11 @@ 

    Decoding Example JWT

     {'sub': 'a', 'name': 'b', 'iat': 1}
     
    -
    -
    -

    Main JWT Fields

    +
    +

    Main JWT Fields

    • sub: Subject (username, email, etc.)
    • iat: Issued at (useful for checking freshness)
    • @@ -408,31 +335,137 @@

      Main JWT Fields

    • nbf: Not before (useful for managing life-cycle )
    +
    +
    +
    +
    +

    Python/Flask Example

    +
      +
    • Easy to verify/decode using libraries (e.g., pyjwt) +
        +
      • can compose checks using decorators:
      • + +
    • +
    + +
    + +
    @app.route('/support/urgent')  # built-in flask decorator
    +@requires_jwt                  # custom decorator to validate JWT
    +@jwt_claims(['paid_support'])  # ensures token is for premium user
    +@jwt_iat(datetime.timedelta(hours=24))  # ensure recent token
    +def support_urgent():
    +    ... # process ending support request
    +
    +
    -
    -

    Python/Flask Example

    -

    -Easy to verify/decode using libraries (e.g., pyjwt) and compose -checks using decorators: -

    +
    +

    Python/Flask Example

    +
      +
    • Easy to verify/decode using libraries (e.g., pyjwt) +
        +
      • can compose checks using decorators:
      • + +
    • + +
    + +
    -
    @app.route('/support/urgent')
    -@requires_jwt                  # validates JWT
    +
    @app.route('/support/urgent')  # built-in flask decorator
    +@requires_jwt                  # custom decorator to validate JWT
     @jwt_claims(['paid_support'])  # ensures token is for premium user
     @jwt_iat(datetime.timedelta(hours=24))  # ensure recent token
     def support_urgent():
         ... # process ending support request
     
    +
    +
    +
    +
    +

    Python/Flask Example

    +
      +
    • Easy to verify/decode using libraries (e.g., pyjwt) +
        +
      • can compose checks using decorators:
      • + +
    • + +
    + + +
    + +
    @app.route('/support/urgent')  # built-in flask decorator
    +@requires_jwt                  # custom decorator to validate JWT
    +@jwt_claims(['paid_support'])  # ensures token is for premium user
    +@jwt_iat(datetime.timedelta(hours=24))  # ensure recent token
    +def support_urgent():
    +    ... # process ending support request
    +
    +
    +
    -
    -

    Starting Flask

    +
    +
    +

    Python/Flask Example

    +
      +
    • Easy to verify/decode using libraries (e.g., pyjwt) +
        +
      • can compose checks using decorators:
      • + +
    • + +
    + + + +
    + +
    @app.route('/support/urgent')  # built-in flask decorator
    +@requires_jwt                  # custom decorator to validate JWT
    +@jwt_claims(['paid_support'])  # ensures token is for premium user
    +@jwt_iat(datetime.timedelta(hours=24))  # ensure recent token
    +def support_urgent():
    +    ... # process ending support request
    +
    +
    +
    +
    +
    +
    +

    Python/Flask Example

    +
      +
    • Easy to verify/decode using libraries (e.g., pyjwt) +
        +
      • can compose checks using decorators:
      • + +
    • + +
    + + + +
    + +
    @app.route('/support/urgent')  # built-in flask decorator
    +@requires_jwt                  # custom decorator to validate JWT
    +@jwt_claims(['paid_support'])  # ensures token is for premium user
    +@jwt_iat(datetime.timedelta(hours=24))  # ensure recent token
    +def support_urgent():
    +    ... # process ending support request
    +
    +
    +
    +
    +

    Starting Flask

    import os
    @@ -448,16 +481,14 @@ 

    Starting Flask

    - -
    -
    -

    Example of @requires_jwt

    +
    +

    Example of @requires_jwt

    -
    def requires_jwt(func):
    +
    def requires_jwt(func):
         @wraps(func)
         def decorated(*args, **kwargs):        
             token = request.headers.get("Authorization").split(" ")[1]
    @@ -469,14 +500,13 @@ 

    Example of @requires_jwt

    key=current_app.config['JWT_KEY']) # public key return func(*args, **kwargs) except Exception as problem: - return f'{problem=}', 401 # return 401 or other error code + return f'{problem=}', 401 # return 401 or other error code return decorated
    -
    -
    -

    Ensure Valid Token

    +
    +

    Ensure Valid Token

    import requests
    @@ -502,14 +532,11 @@ 

    Ensure Valid Token

    code: 200 text: Hello World!
    - - -
    -
    -

    Example of @jwt_claims

    +
    +

    Example of @jwt_claims

    def jwt_claims(claims_list: typing.Sequence[str]):
    @@ -525,10 +552,9 @@ 

    Example of @jwt_claims

    return make_decorator
    -
    -
    -

    Ensure Claims (Bad Token)

    +
    +

    Ensure Claims (Bad Token)

    import datetime, requests
    @@ -546,10 +572,9 @@ 

    Ensure Claims (Bad Token)

    code: 401 text: Missing claims: ['premium_user']
    -
    -
    -

    Ensure Claims (Bad Claims)

    +
    +

    Ensure Claims (Bad Claims)

    
    @@ -569,10 +594,9 @@ 

    Ensure Claims (Bad Claims)

    code: 401 text: Token age 20193 days, 17:37:05.670865 not within 0:00:30
    -
    -
    -

    Ensure Claims (Success)

    +
    +

    Ensure Claims (Success)

    now = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
    @@ -592,25 +616,22 @@ 

    Ensure Claims (Success)

    code: 200 text: processing support request for user b
    -
    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • Alice sends request combining to act for Bob
    - -
    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • @@ -633,12 +654,11 @@

      Example Use Case: Proxy

      return msg
      -
    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • @@ -661,10 +681,9 @@

      Example Use Case: Proxy

      return msg
      -
    -
    -

    Python demo

    +
    +

    Python demo

    
    @@ -684,15 +703,11 @@ 

    Python demo

    Created issue assigned to Bob. Alice acted on behalf of Bob
    - - - -
    -
    -

    Anti-Patterns

    +
    +

    Caveats

    • Beware using header fields to check signature
        @@ -704,17 +719,56 @@

        Anti-Patterns

      • be careful with kid, jku, jwk, etc.
    • -
    • Don't simulate sessions with JWTs
    • -
    • Token revocation issue: access/refresh tokens
    • +
    • Don't simulate sessions with JWTs +
        +
      • Use access/refresh tokens to solve logout/revocation
      • + +
    • + +
    +
    +
    +
    +
    +

    Example JKU Header Attack

    +
      +
    • Header can provide URL for key (useful): +
        +
      • {alg: "EdDSA", jku: "https://good.com/pk.json"}
      • + +
    • +
    • Attacker can replace JKU with their own key: +
        +
      • {alg: "EdDSA", jku: "https://bad.com/pk.json"}
      • + +
    • +
    • Don't trust header (validate against whitelist)
    +
    +
    +
    +
    +

    Example ALG Header Attack

    +
      +
    • Header can provide URL for key (useful): +
        +
      • {alg: "EdDSA", jku: "https://good.com/pk.json"}
      • + +
    • +
    • Attacker can replace ALG with symmetric version: +
        +
      • {alg: "HS256", jku: "https://bad.com/pk.json"}
      • +
    • +
    • Don't trust header (validate against whitelist)
    • +
    -
    -

    Revocation via Access/Refresh

    +
    +

    Revocation via Access/Refresh

    • Problem: Can't cancel or logout a JWT
    • Solution: Refresh/Access token @@ -736,61 +790,51 @@

      Revocation via Access/Refresh

      - -
    -
    -

    Get Refresh Token

    +
    +

    Get Refresh Token

    -
    -

    jwt-get-refresh.jpg +

    +

    jwt-get-refresh.jpg

    - -
    -
    -

    Get Access Token

    +
    +

    Get Access Token

    -
    -

    jwt-get-access.jpg +

    +

    jwt-get-access.jpg

    - -
    -
    -

    Use Access Token

    +
    +

    Use Access Token

    -
    -

    jwt-use-access.jpg +

    +

    jwt-use-access.jpg

    - -
    -
    -

    Revocation

    +
    +

    Revocation

    -
    -

    jwt-revoke.jpg +

    +

    jwt-revoke.jpg

    - -
    -
    -

    Separate validation from parsing

    +
    +

    Separate validation from parsing

    -
    -

    Summary and next steps

    +
    +

    Summary and next steps

    -
    -

    Secret Key

    - - -
    - -
    import base64, jwt  #  pip install 'pyjwt[crypto]'
    -from cryptography.hazmat.primitives.asymmetric import ed25519
    -from cryptography.hazmat.primitives import serialization
    -from cryptography.hazmat.backends import default_backend
    -
    -secret_key = base64.b64encode(  # How to generate new key
    -    ed25519.Ed25519PrivateKey.generate().private_bytes(
    -        encoding=serialization.Encoding.DER,
    -        format=serialization.PrivateFormat.PKCS8,
    -        encryption_algorithm=serialization.NoEncryption())
    -).decode('utf8')
    -
    -secret_key = (  # We hard code secret key so you can verify results
    -    'MC4CAQAwBQYDK2VwBCIEIC+D6rD2YbXtV0ccR3smoR0ynhVuyyqvplFLbQWDdAtn'
    -)
    -
    -
    -
    -
    -

    Public Key

    -
    - -
    sk = serialization.load_der_private_key(  # de-serialize encoded key
    -    base64.b64decode(secret_key),backend=default_backend(),
    -    password=None)
    -
    -pk = sk.public_key()
    -public_key = pk.public_bytes(  # serialize
    -    encoding=serialization.Encoding.PEM,
    -    format=serialization.PublicFormat.SubjectPublicKeyInfo
    -).decode('utf8')
    -                
    -print(public_key)
    -
    -
    - - -
    ------BEGIN PUBLIC KEY-----
    -MCowBQYDK2VwAyEAUVLjZWAVK5ZE1ewI5QBdr0Nig1Qkx3kl5zHIADvw0M8=
    ------END PUBLIC KEY-----
    -
    -
    -
    -

    Encoding Example JWT

    -
    - -
    import textwrap  # just for display
    -
    -example_jwt = jwt.encode(
    -    headers={'typ':'JWT', 'alg':'EdDSA'},
    -    payload={'sub': 'a', 'name': 'b', 'iat': 1},
    -    key=sk)  # this is the JWT that would be used
    -print(textwrap.indent(textwrap.fill(       # format for
    -      '\n.'.join(example_jwt.split('.')),  # nice display
    -     width=44, replace_whitespace=False), prefix='  '))
    -
    -
    - -

    -Encoded JWT: -

    -
    -eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9
    -.eyJzdWIiOiJhIiwibmFtZSI6ImIiLCJpYXQiOjF9
    -.SU6aXJ0YbH7Vg1jROpQfvnhn98Rt9zBeS7-c5O9jH-
    -LL5mQqMMFq61eZjf0tLLqExm-dckRUNa3-qT7R2SKmCw
    -
    -
    -
    -

    Decoding Example JWT

    -
    - -
    decoded_jwt = jwt.decode(example_jwt, algorithms=['EdDSA'], key=pk)
    -print(decoded_jwt)
    -
    -
    - -

    -Decoded Payload from JWT: -

    -
    -{'sub': 'a', 'name': 'b', 'iat': 1}
    -
    -
    -
    -

    Main JWT Fields

    +
    +

    Main JWT Fields

    • sub: Subject (username, email, etc.)
    • iat: Issued at (useful for checking freshness)
    • @@ -461,31 +363,13 @@

      Python/Flask Example

      @jwt_iat(datetime.timedelta(hours=24)) # ensure recent token def support_urgent(): ... # process ending support request - - -
    -
    -

    Starting Flask

    -
    - -
    import os
    -import sys
    -import subprocess
    -
    -os.chdir(os.path.expanduser('~/code/ox_jwt/src/ox_jwt'))
    -my_env = os.environ.copy()
    -my_env['FLASK_JWT_KEY'] = public_key.split('\n')[1]
    -my_env['FLASK_JWT_ALGS'] = 'EdDSA,ES256'
    -proc = subprocess.Popen([sys.executable, 'app.py'], env=my_env)
    -# Use proc.kill() to shutdown server
    -
     
    -
    -

    Example of @requires_jwt

    +
    +

    Example of @requires_jwt

    def requires_jwt(func):
    @@ -505,38 +389,10 @@ 

    Example of @requires_jwt

    -
    -

    Ensure Valid Token

    -
    - -
    import requests
    -
    -req = requests.get('http://127.0.0.1:5000/hello', headers={
    -    'Authorization': f'Bearer {example_jwt}mybad'})  # bad token
    -print(f'Bad token response:\n  code: {req.status_code}\n'
    -      f'  text: {req.text}\n')
    -
    -req = requests.get('http://127.0.0.1:5000/hello', headers={
    -    'Authorization': f'Bearer {example_jwt}'})
    -print(f'Good token response:\n  code: {req.status_code}\n'
    -      f'  text: {req.text}\n')
    -
    -
    - -
    -Bad token response:
    -  code: 401
    -  text: problem=InvalidSignatureError('Signature verification failed')
    -
    -Good token response:
    -  code: 200
    -  text: Hello World!
    -
    -
    -
    -

    Example of @jwt_claims

    +
    +

    Example of @jwt_claims

    def jwt_claims(claims_list: typing.Sequence[str]):
    @@ -553,74 +409,10 @@ 

    Example of @jwt_claims

    -
    -

    Ensure Claims (Bad Token)

    -
    - -
    import datetime, requests
    -
    -req = requests.get('http://127.0.0.1:5000/support/urgent', headers={
    -    'Authorization': f'Bearer {example_jwt}'})  # bad token
    -
    -print(f'Bad token response:\n  code: {req.status_code}\n'
    -      f'  text: {req.text}\n')
    -
    -
    - -
    -Bad token response:
    -  code: 401
    -  text: Missing claims: ['premium_user']
    -
    -
    -
    -

    Ensure Claims (Bad Claims)

    -
    - -
    
    -premium_jwt = jwt.encode(headers={'typ':'JWT', 'alg':'EdDSA'},
    -    payload={'sub': 'a', 'premium_user': 'b', 'iat': 1}, key=sk)
    -
    -req = requests.get('http://127.0.0.1:5000/support/urgent', headers={
    -    'Authorization': f'Bearer {premium_jwt}'})
    -
    -print(f'Premium token response:\n  code: {req.status_code}\n'
    -      f'  text: {req.text}\n')
    -
    -
    - -
    -Premium token response:
    -  code: 401
    -  text: Token age 20193 days, 17:37:05.670865 not within 0:00:30
    -
    -
    -
    -

    Ensure Claims (Success)

    -
    - -
    now = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
    -recent_premium_jwt = jwt.encode(headers={'typ':'JWT', 'alg':'EdDSA'},
    -    payload={'sub': 'a', 'premium_user': 'b', 'iat': int(now)}, key=sk)
    -
    -req = requests.get('http://127.0.0.1:5000/support/urgent', headers={
    -    'Authorization': f'Bearer {recent_premium_jwt}'})
    -
    -print(f'Recent premium token response:\n  code: {req.status_code}\n'
    -      f'  text: {req.text}\n')
    -
    -
    - -
    -Recent premium token response:
    -  code: 200
    -  text: processing support request for user b
    -
    -
    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • @@ -630,8 +422,8 @@

      Example Use Case: Proxy

    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • @@ -657,8 +449,8 @@

      Example Use Case: Proxy

    -
    -

    Example Use Case: Proxy

    +
    +

    Example Use Case: Proxy

    • Auth Server grants JWT letting Alice to act for Bob
    • claims: {"sub": "Alice", "proxy": "Bob"}
    • @@ -682,32 +474,10 @@

      Example Use Case: Proxy

    -
    -

    Python demo

    -
    - -
    
    -now = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
    -proxy_example_jwt = jwt.encode(headers={'typ':'JWT', 'alg':'EdDSA'},
    -    payload={'sub': 'Alice', 'proxy': 'Bob'}, key=sk)
    -
    -req = requests.get('http://127.0.0.1:5000/issue', headers={
    -    'Authorization': f'Bearer {proxy_example_jwt}'})
    -print(req.text)
    -
    -
    -
    - -
    -127.0.0.1 - - [24/Apr/2025 13:25:28] "GET /issue HTTP/1.1" 200 -
    -Created issue assigned to Bob.
    -Alice acted on behalf of Bob
    -
    -
    -
    -

    Caveats

    +
    +

    Caveats

    • Beware using header fields to check signature
        @@ -729,8 +499,8 @@

        Caveats

    -
    -

    Example JKU Header Attack

    +
    +

    Example JKU Header Attack

    • Header can provide URL for key (useful):
        @@ -748,8 +518,8 @@

        Example JKU Header Attack

    -
    -

    Example ALG Header Attack

    +
    +

    Example ALG Header Attack

    • Header can provide URL for key (useful):
        @@ -767,8 +537,8 @@

        Example ALG Header Attack

    -
    -

    Revocation via Access/Refresh

    +
    +

    Revocation via Access/Refresh

    • Problem: Can't cancel or logout a JWT
    • Solution: Refresh/Access token @@ -793,48 +563,48 @@

      Revocation via Access/Refresh

    -
    -

    Get Refresh Token

    +
    +

    Get Refresh Token

    -
    +

    jwt-get-refresh.jpg

    -
    -

    Get Access Token

    +
    +

    Get Access Token

    -
    +

    jwt-get-access.jpg

    -
    -

    Use Access Token

    +
    +

    Use Access Token

    -
    +

    jwt-use-access.jpg

    -
    -

    Revocation

    +
    +

    Revocation

    -
    +

    jwt-revoke.jpg

    -
    -

    Separate validation from parsing

    +
    +

    Separate validation from parsing

    -
    -

    Summary and next steps

    +
    +

    Summary and next steps