SlideShare a Scribd company logo
1 of 137
Download to read offline
@mooreds
JWTs:
What PHP developers
need to know
Dan Moore
Longhorn PHP
Nov 2023
1
@mooreds
2
@mooreds
About FusionAuth
● FusionAuth is the authentication and authorization
platform built for developers, by developers.
● FusionAuth solves the problem of building essential
user security without adding risk or distracting from
the primary application.
3
@mooreds
About Me
4
@mooreds
About Me
● Who cares
5
@mooreds
What I’ll Cover
● JWTs in brief
6
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
7
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
● Validation
8
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
● Validation
● Bearer tokens
9
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
● Validation
● Bearer tokens
● Footguns/common issues
10
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
● Validation
● Bearer tokens
● Footguns/common issues
● Refresh tokens
11
@mooreds
What I’ll Cover
● JWTs in brief
● The problem they solve
● Validation
● Bearer tokens
● Footguns/common issues
● Refresh tokens
● JWT revocation
12
@mooreds
JWTs
…Briefly
13
@mooreds
JWTs Briefly
● JSON Web Token
14
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
15
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
16
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
● Signed or encrypted
17
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
● Signed or encrypted
● Stateless, portable tokens of identity
18
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
● Signed or encrypted
● Stateless, portable tokens of identity
● Great for APIs and microservices
19
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
● Signed or encrypted
● Stateless, portable tokens of identity
● Great for APIs and microservices
● Produced by many Identity Providers
20
@mooreds
JWTs Briefly
● JSON Web Token
● Pronounced ‘jot’
● Standard - RFC 7519
● Signed or encrypted
● Stateless, portable tokens of identity
● Great for APIs and microservices
● Produced by many Identity Providers
● Widely supported
21
@mooreds
The Problem
22
@mooreds
23
User API
Todo API
users
todos
@mooreds
24
User API
users user_roles roles
@mooreds
25
Todo API
todos
@mooreds
26
CREATE TABLE todos (
id INT NOT NULL,
text TEXT NOT NULL,
status INT NOT NULL,
user_id CHAR(40) NOT NULL,
PRIMARY KEY (id)
);
@mooreds
27
User API
POST /login
???
@mooreds
Solutions
28
@mooreds
29
User API
POST /login
???
@mooreds
30
User API
POST /login
user
42
users
@mooreds
31
User API
POST /login
User as JSON
user
42
users
@mooreds
32
{
"user": {
"id": "42",
"name": "Dan Moore",
"email": "dan@fusionauth.io",
"roles": ["admin"]
}
}
@mooreds
33
user
42 Todo API
GET /todos?user_id=42
JSON todos
@mooreds
Good
Idea?
34
@mooreds
Danger Will Robinson!!
35
@mooreds
36
user
42 Todo API
GET /todos?user_id=1
JSON todos
@mooreds
A Different
Approach
37
@mooreds
38
User API
Todo API
users
todos
user
T
@mooreds
39
User API
Todo API
users
todos
user
user
T
T
@mooreds
40
User API
Todo API
users
todos
user
user
T
T
T
@mooreds
41
User API
Todo API
users
todos
user
user
T
T
T
GET /token/T User as JSON
@mooreds
42
User API
Todo API
users
todos
user
user
T
T
T
Todo data
@mooreds
Opaque Tokens
● There must be a User -> Token mapping
● In memory or in database
● Can be very chatty
● Couples the User API to EVERYTHING (almost)
● This is OAuth Introspection (RFC 7662)
43
@mooreds
JWTs To
The Rescue
44
@mooreds
45
User API
Todo API
users
todos
user
J
W
T
@mooreds
46
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
@mooreds
47
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
48
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
Todo data
@mooreds
JWT Benefits
● Signed
○ Public/private key pair
○ Symmetric key
49
@mooreds
JWT Benefits
● Signed
○ Public/private key pair
○ Symmetric key
● Validated by Todo API without calling User API
50
@mooreds
JWT Benefits
● Signed
○ Public/private key pair
○ Symmetric key
● Validated by Todo API without calling User API
● Contains roles and other metadata
51
@mooreds
JWTs
Under the Microscope
52
@mooreds
53
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJmdXNpb25hdXRoLml
vIiwiZXhwIjoxNjE5NTU1MDE4LCJhdWQiOiIyMzhkNDc5My03MGRlLTQxODMtO
TcwNy00OGVkOGVjZDE5ZDkiLCJzdWIiOiIxOTAxNmI3My0zZmZhLTRiMjYtODB
kOC1hYTkyODc3Mzg2NzciLCJuYW1lIjoiRGFuIE1vb3JlIiwibWVtYmVyc2hpc
EV4cGlyZWQiOmZhbHNlLCJyb2xlcyI6WyJSRVRSSUVWRV9UT0RPUyIsIkFETUl
OIl19.cPL36Al_8eT7YQVowIOruitxXb0n8w4DKaWVthfEwfc
@mooreds
54
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
=
{
"alg": "HS256",
"typ": "JWT"
}
@mooreds
55
eyJpc3MiOiJmdXNpb25hdXRoLmlvIiwiZXhwIjoxNjE5NTU1MDE4LCJhdWQiOiIyMzhkNDc5My03MGRlLTQxODMtOTcwNy00OGVkOGVjZDE5ZDkiLCJzdWIiOiIxOTAxNmI3
My0zZmZhLTRiMjYtODBkOC1hYTkyODc3Mzg2NzciLCJuYW1lIjoiRGFuIE1vb3JlIiwibWVtYmVyc2hpcEV4cGlyZWQiOmZhbHNlLCJyb2xlcyI6WyJSRVRSSUVWRV9UT0RP
UyIsIkFETUlOIl19
=
{
"iss": "fusionauth.io",
"exp": 1619555018,
"aud": "238d4793-70de-4183-9707-48ed8ecd19d9",
"sub": "19016b73-3ffa-4b26-80d8-aa9287738677",
"name": "Dan Moore",
"roles": ["RETRIEVE_TODOS", "ADMIN"]
}
@mooreds
56
cPL36Al_8eT7YQVowIOruitxXb0n8w4DKaWVthfEwfc
=
Signature
@mooreds
Signature Generation
● Cryptographic operation(Header + Body)
57
@mooreds
Signature Generation
● Cryptographic operation(Header + Body)
● Operation varies by algorithm
58
@mooreds
JWT
Validation
59
@mooreds
60
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
Validate The Signature
61
@mooreds
Validate The Signature
● Use a library
62
@mooreds
Validate The Signature
● Use a library
● If it doesn’t match, STOP
63
@mooreds
Validate The Claims
64
@mooreds
Validate The Claims
● Business logic
65
@mooreds
Validate The Claims
● Business logic
● You must write
66
@mooreds
67
{
"iss": "fusionauth.io",
"exp": 1619555018,
"aud": "238d4793-70de-4183-9707-48ed8ecd19d9",
"sub": "19016b73-3ffa-4b26-80d8-aa9287738677",
"name": "Dan Moore",
"roles": ["RETRIEVE_TODOS", "ADMIN"]
}
@mooreds
68
{
"iss": "fusionauth.io",
"exp": 1619555018,
"aud": "238d4793-70de-4183-9707-48ed8ecd19d9",
"sub": "19016b73-3ffa-4b26-80d8-aa9287738677",
"name": "Dan Moore",
"roles": ["RETRIEVE_TODOS", "ADMIN"]
}
@mooreds
69
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
70
{
"iss": "fusionauth.io",
"exp": 1619555018,
"aud": "238d4793-70de-4183-9707-48ed8ecd19d9",
"sub": "19016b73-3ffa-4b26-80d8-aa9287738677",
"name": "Dan Moore",
"roles": ["RETRIEVE_TODOS", "ADMIN"]
}
@mooreds
71
{
"iss": "fusionauth.io",
"exp": 1619555018,
"aud": "238d4793-70de-4183-9707-48ed8ecd19d9",
"sub": "19016b73-3ffa-4b26-80d8-aa9287738677",
"name": "Dan Moore",
"roles": ["RETRIEVE_TODOS", "ADMIN"]
}
@mooreds
72
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
73
User API
Todo API
users
todos
bad
user
J
W
T
J
W
T
Accounting
API
Accounting
API
Accounting
API
J
W
T
@mooreds
74
User API
Todo API
users
todos
bad
user
J
W
T
J
W
T
Accounting
API
Accounting
API
Accounting
API
J
W
T
@mooreds
Code
75
@mooreds
Bearer
Tokens
76
@mooreds
77
Todo API
todos
bad
J
W
T
J
W
T
@mooreds
Token Storage
● Prefer server side
○ Known as the BFF, or backend for front end, pattern
78
@mooreds
Token Storage
● Prefer server side
○ Known as the BFF, or backend for front end, pattern
● HttpOnly, secure cookie in browser
○ Watch out for XSS
79
@mooreds
Token Storage
● Prefer server side
○ Known as the BFF, or backend for front end, pattern
● HttpOnly, secure cookie in browser
○ Watch out for XSS
● Secure storage on mobile
80
@mooreds
Common
Issues
81
@mooreds
Incorrect Validation
● Use a library
○ There are lots out there
● Check your claims
○ Standard
○ Custom
82
@mooreds
Putting Secrets In a JWT
● Base64 encoded JSON
○ Integrity guaranteed
○ Not secrecy
● Can leak information
83
@mooreds
Using HMAC Without a Good Key
● Susceptible to brute force
○ https://github.com/brendan-rius/c-jwt-cracker
84
@mooreds
Using The “none” Algorithm
● No signature
85
@mooreds
Using The “none” Algorithm
● No signature == no integrity check
86
@mooreds
87
eyJhbGciOiJub25lIn0.eyJpc3MiOiJmdXNpb25hdXRoLmlvIi
wiZXhwIjoxNTg5MjI3NDgwLCJhdWQiOiIyMzhkNDc5My03MGR
lLTQxODMtOTcwNy00OGVkOGVjZDE5ZDkiLCJzdWIiOiIxOTAx
NmI3My0zZmZhLTRiMjYtODBkOC1hYTkyODc3Mzg2NzciLCJuY
W1lIjoiRGFuIE1vb3JlIiwicm9sZXMiOlsiUkVUUklFVkVfVE
9ET1MiXX0.
@mooreds
Using The “none” Algorithm
● Unsanitized credentials!
88
@mooreds
Asymmetric
Keypairs
89
@mooreds
90
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
S
S
@mooreds
Asymmetric Keypairs Avoid This
● The private key signs the JWT
● The public key is used to verify it
91
@mooreds
Why does that matter?
● Scale
92
@mooreds
93
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
Org ABC
Org DEF
@mooreds
Why does that matter?
● Scale
● Security
94
@mooreds
95
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
96
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
@mooreds
Why Not?
● Slower
97
@mooreds
Why Not?
● Slower
● More complex
98
@mooreds
Sharing Public Keys
99
@mooreds
100
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
Needs the
Public Key
@mooreds
Sharing Public Keys
● Distribute the keys
101
@mooreds
102
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
PK
@mooreds
Sharing Public Keys
● Distribute the keys
● JWKS, another standard (RFC 7517)
103
@mooreds
104
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
J
W
T
GET /.well-known/jwks.json
@mooreds
105
{
"keys" : [
{
"alg" : "RS256",
"e" : "AQAB",
"kid" : "uk0PWf8KkTKiJqWwrNjn16QoKKI",
"kty" : "RSA",
"n" :
"2xzTUGNSpIeNcvICSlFlhver42dR9CWYePEoLk6ncuk1nKLzwOr-hy3W2rmkG-x_DaVMVBT5jimClL_k7Fu5xlscexpmNTo3lK_fqWv_qh
nOONSaX0ETqWSrS9MXWnJcPTZkA37ZAwhGKaz8zzSF3Jh_fULWnFHgJxCLBNYmopnvVAv_erJR0wjX9imMpMsBh3w8O6RyN8ghhlkJ0q4JK
yaauF-xk8nLwIAvdWiPWNpzJ57oXfHUXesbLCfLIuM3f_suh_RaZn7uC0jEO1uG23htOqMb1M0TW5uk8pAxdhVKYbKsPR8CMOUc1je8wDo2
w4y4gY_1koST3xnA6IRhBQ",
"use" : "sig",
"x5c" : [
"MIICuDCCAaCgAwIBAQIQMcWR+VPwTieC06b3Fn6XbzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDEw1mdXNpb25hdXRoLmlvMB4XDTIxMD
UyNDE5NDU1OVoXDTMxMDUyNDE5NDU1OVowGDEWMBQGA1UEAxMNZnVzaW9uYXV0aC5pbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCg
gEBANsc01BjUqSHjXLyAkpRZYb3q+NnUfQlmHjxKC5Op3LpNZyi88Dq/oct1tq5pBvsfw2lTFQU+Y4pgpS/5OxbucZbHHsaZjU6N5Sv36lr
/6oZzjjUml9BE6lkq0vTF1pyXD02ZAN+2QMIRims/M80hdyYf31C1pxR4CcQiwTWJqKZ71QL/3qyUdMI1/YpjKTLAYd8PDukcjfIIYZZCdK
uCSsmmrhfsZPJy8CAL3Voj1jacyee6F3x1F3rGywnyyLjN3/7Lof0WmZ+7gtIxDtbhtt4bTqjG9TNE1ubpPKQMXYVSmGyrD0fAjDlHNY3vM
A6NsOMuIGP9ZKEk98ZwOiEYQUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAcj/NIIltfhyP9zsleVn7N/QRavfKA1SBTwtlPMVezuRIX+S3j
zxJb/ot47TBD5WFNY5y5AOkWHQFNkVtuPjUYmKTAqJd0+kVur77tLKzour6wjOp2QgKzG3IGxQnK903JkFlyWF4vSJuOpH8WymJ1jq1gD5z
Jjz2NXqch+gBIp5Kscr2tj2hg2BGmq5v7+5pz2jYHosarj4sJwGsLqk1j479wK1iaMjdBVCMuq/QS9yF0sG0STsjbceyGzFWbknmZdfNup6
C4a0m8paeb9mlgFfIx9qljuNInpc9QZWeRymNJ5spX0WYVRLu7ULrLDXr8xUupjCSMV95yI1XF6tMkw=="
],
"x5t" : "uk0PWf8KkTKiJqWwrNjn16QoKKI",
"x5t#S256" : "UW-4zdFS6YR9g4Vhl3T3xLwfQ_S1aLFh2x4VBvK1sbY"
}
]
}
@mooreds
106
{
"alg" : "RS256",
"kid" : "uk0PWf8KkTKiJqWwrNjn16QoKKI",
"x5c" : [
"MIICuDCCAaCgAwIBAQIQMcWR+VPwTi..."
]
// ...
}
@mooreds
Which Matches
107
@mooreds
108
{
"typ": "JWT",
"alg": "RS256",
"kid": "uk0PWf8KkTKiJqWwrNjn16QoKKI"
}
@mooreds
Refresh
Tokens
109
@mooreds
Lifetimes
● JWTs are meant to be short lived (minutes)
110
@mooreds
Lifetimes
● JWTs are meant to be short lived (minutes)
● Refresh tokens are long lived (days or months)
111
@mooreds
Lifetimes
● JWTs are meant to be short lived (minutes)
● Refresh tokens are long lived (days or months)
● Refresh tokens can be used to create new JWTs
112
@mooreds
Why?
● Compromise between two unsavory options
113
@mooreds
Why?
● Compromise between two unsavory options
● User authenticating regularly
○ User hassle
114
@mooreds
Why?
● Compromise between two unsavory options
● User authenticating regularly
○ User hassle
● Long lived JWTs
○ Security risk
115
@mooreds
116
User API
Todo API
users
todos
user
user
R
T
J
W
T
@mooreds
117
User API
Todo API
users
todos
user
user
J
W
T R
T
R
T
J
W
T
@mooreds
118
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
@mooreds
119
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
Todo data
@mooreds
120
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
@mooreds
121
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
@mooreds
122
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
R
T
@mooreds
123
User API
Todo API
users
todos
user
user
J
W
T R
T
R
T
J
W
T
@mooreds
124
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
@mooreds
125
User API
Todo API
users
todos
user
user
J
W
T
J
W
T
R
T
R
T
J
W
T
Todo data
@mooreds
Logout
● Revoking refresh token
126
@mooreds
127
User API
Todo API
users
todos
user
user
J
W
T
XR
T
R
T
Logout
X
X
@mooreds
JWT Revocation
128
@mooreds
Can You Do It?
129
@mooreds
Kinda
● You have a few options
130
@mooreds
Kinda
● You have a few options
○ Rotate keys
131
@mooreds
Kinda
● You have a few options
○ Rotate keys
○ Really short lifetimes
132
@mooreds
Kinda
● You have a few options
○ Rotate keys
○ Really short lifetimes
○ Deny list
133
@mooreds
134
User API
Todo API
users
todos
user
user
J
W
T
XR
T
R
T
Logout
X
X
jwt.refresh-token.revoke event
Webhook
@mooreds
JWTs + PHP
● What are you trying to accomplish?
○ Generate or parse a raw JWT
■ firebase/php-jwt
○ Consume a JWT in an API
■ Look at your framework
■ https://fusionauth.link/lhp-laravel-jwt-auth-provider
■ https://fusionauth.link/lhp-wp-jwt-auth-provider (only hmac)
■ https://fusionauth.link/lhp-symfony-jwt-auth-provider
■ https://fusionauth.link/lhp-laravel-api-quickstart
135
@mooreds
In
Conclusion
136
@mooreds
Thanks & Questions
● Contact me for more info:
○ dan@fusionauth.io
○ https://twitter.com/mooreds
○ https://fusionauth.io
● Links
○ Feedback/slides:
https://joind.in/event/longhorn-php-conference-2023/what-php-developers-need-to-k
now-about-jwts
○ https://fusionauth.link/lhp-php-jwt-example
○ https://fusionauth.link/decode-jwt
○ https://fusionauth.link/lhp-secure-jwt
○ https://fusionauth.link/lhp-jwt-components
○ FusionAuth Community Edition (free!): https://fusionauth.link/lhp-dl
137

More Related Content

Similar to JWTs - What PHP developers need to know - LonghornPHP.pdf

How to get along with HATEOAS without letting the bad guys steal your lunch?
How to get along with HATEOAS without letting the bad guys steal your lunch?How to get along with HATEOAS without letting the bad guys steal your lunch?
How to get along with HATEOAS without letting the bad guys steal your lunch?Graham Charters
 
OpenStack Toronto Meetup - Keystone 101
OpenStack Toronto Meetup - Keystone 101OpenStack Toronto Meetup - Keystone 101
OpenStack Toronto Meetup - Keystone 101Steve Martinelli
 
Data Democratization at Nubank
 Data Democratization at Nubank Data Democratization at Nubank
Data Democratization at NubankDatabricks
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScriptFrancois Marier
 
Better Laziness Through Hypermedia -- Designing a Hypermedia Client
Better Laziness Through Hypermedia -- Designing a Hypermedia ClientBetter Laziness Through Hypermedia -- Designing a Hypermedia Client
Better Laziness Through Hypermedia -- Designing a Hypermedia ClientPete Gamache
 
Implementing Authorization
Implementing AuthorizationImplementing Authorization
Implementing AuthorizationTorin Sandall
 
Break up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesBreak up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesMarcus Merrell
 
State of the ATT&CK
State of the ATT&CKState of the ATT&CK
State of the ATT&CKMITRE ATT&CK
 
Secure Developer Access at Decisiv
Secure Developer Access at DecisivSecure Developer Access at Decisiv
Secure Developer Access at DecisivTeleport
 
JHipster Beyond CRUD - JHipster Conf' 2019
JHipster Beyond CRUD - JHipster Conf' 2019JHipster Beyond CRUD - JHipster Conf' 2019
JHipster Beyond CRUD - JHipster Conf' 2019Intesys
 
Docker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Docker and Your Path to a Better Staging Environment - webinar by Gil TayarDocker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Docker and Your Path to a Better Staging Environment - webinar by Gil TayarApplitools
 
Extending OutSystems with Javascript
Extending OutSystems with JavascriptExtending OutSystems with Javascript
Extending OutSystems with JavascriptRitaDias72
 
Open APIs - concepts. applications. visualizations.
Open APIs - concepts. applications. visualizations.Open APIs - concepts. applications. visualizations.
Open APIs - concepts. applications. visualizations.Christian Dalager
 
Vulnerable Out of the Box: An Evaluation of Android Carrier Devices
Vulnerable Out of the Box: An Evaluation of Android Carrier DevicesVulnerable Out of the Box: An Evaluation of Android Carrier Devices
Vulnerable Out of the Box: An Evaluation of Android Carrier DevicesPriyanka Aash
 
Automating Cloud Operations - Everything you wanted to know about cURL and RE...
Automating Cloud Operations - Everything you wanted to know about cURL and RE...Automating Cloud Operations - Everything you wanted to know about cURL and RE...
Automating Cloud Operations - Everything you wanted to know about cURL and RE...Revelation Technologies
 
Patterns to Bring Enterprise and Social Identity to the Cloud
Patterns to Bring Enterprise and Social Identity to the Cloud Patterns to Bring Enterprise and Social Identity to the Cloud
Patterns to Bring Enterprise and Social Identity to the Cloud CA API Management
 

Similar to JWTs - What PHP developers need to know - LonghornPHP.pdf (20)

How to get along with HATEOAS without letting the bad guys steal your lunch?
How to get along with HATEOAS without letting the bad guys steal your lunch?How to get along with HATEOAS without letting the bad guys steal your lunch?
How to get along with HATEOAS without letting the bad guys steal your lunch?
 
OpenStack Toronto Meetup - Keystone 101
OpenStack Toronto Meetup - Keystone 101OpenStack Toronto Meetup - Keystone 101
OpenStack Toronto Meetup - Keystone 101
 
Data Democratization at Nubank
 Data Democratization at Nubank Data Democratization at Nubank
Data Democratization at Nubank
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScript
 
Better Laziness Through Hypermedia -- Designing a Hypermedia Client
Better Laziness Through Hypermedia -- Designing a Hypermedia ClientBetter Laziness Through Hypermedia -- Designing a Hypermedia Client
Better Laziness Through Hypermedia -- Designing a Hypermedia Client
 
Implementing Authorization
Implementing AuthorizationImplementing Authorization
Implementing Authorization
 
Break up the Monolith: Testing Microservices
Break up the Monolith: Testing MicroservicesBreak up the Monolith: Testing Microservices
Break up the Monolith: Testing Microservices
 
ql.io at NodePDX
ql.io at NodePDXql.io at NodePDX
ql.io at NodePDX
 
State of the ATT&CK
State of the ATT&CKState of the ATT&CK
State of the ATT&CK
 
Secure Developer Access at Decisiv
Secure Developer Access at DecisivSecure Developer Access at Decisiv
Secure Developer Access at Decisiv
 
Developing apps using Perl
Developing apps using PerlDeveloping apps using Perl
Developing apps using Perl
 
JHipster Beyond CRUD - JHipster Conf' 2019
JHipster Beyond CRUD - JHipster Conf' 2019JHipster Beyond CRUD - JHipster Conf' 2019
JHipster Beyond CRUD - JHipster Conf' 2019
 
Docker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Docker and Your Path to a Better Staging Environment - webinar by Gil TayarDocker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Docker and Your Path to a Better Staging Environment - webinar by Gil Tayar
 
Extending OutSystems with Javascript
Extending OutSystems with JavascriptExtending OutSystems with Javascript
Extending OutSystems with Javascript
 
Open APIs - concepts. applications. visualizations.
Open APIs - concepts. applications. visualizations.Open APIs - concepts. applications. visualizations.
Open APIs - concepts. applications. visualizations.
 
Vulnerable Out of the Box: An Evaluation of Android Carrier Devices
Vulnerable Out of the Box: An Evaluation of Android Carrier DevicesVulnerable Out of the Box: An Evaluation of Android Carrier Devices
Vulnerable Out of the Box: An Evaluation of Android Carrier Devices
 
Tic tac toe
Tic tac toeTic tac toe
Tic tac toe
 
Tic tac toe game code
Tic tac toe game codeTic tac toe game code
Tic tac toe game code
 
Automating Cloud Operations - Everything you wanted to know about cURL and RE...
Automating Cloud Operations - Everything you wanted to know about cURL and RE...Automating Cloud Operations - Everything you wanted to know about cURL and RE...
Automating Cloud Operations - Everything you wanted to know about cURL and RE...
 
Patterns to Bring Enterprise and Social Identity to the Cloud
Patterns to Bring Enterprise and Social Identity to the Cloud Patterns to Bring Enterprise and Social Identity to the Cloud
Patterns to Bring Enterprise and Social Identity to the Cloud
 

More from Dan Moore

Building a slackbot
Building a slackbotBuilding a slackbot
Building a slackbotDan Moore
 
Three things that surprised me when I was a new developer
Three things that surprised me when I was a new developerThree things that surprised me when I was a new developer
Three things that surprised me when I was a new developerDan Moore
 
New developer talk culture foundry - 0519
New developer talk   culture foundry - 0519New developer talk   culture foundry - 0519
New developer talk culture foundry - 0519Dan Moore
 
Super Simple Supervised Learning - AML - Dan Moore
Super Simple Supervised Learning - AML - Dan MooreSuper Simple Supervised Learning - AML - Dan Moore
Super Simple Supervised Learning - AML - Dan MooreDan Moore
 
Life at an early stage SaaS company as a technical co-founder
Life at an early stage SaaS company as a technical co-founderLife at an early stage SaaS company as a technical co-founder
Life at an early stage SaaS company as a technical co-founderDan Moore
 
An Introduction to Pentaho Kettle
An Introduction to Pentaho KettleAn Introduction to Pentaho Kettle
An Introduction to Pentaho KettleDan Moore
 
Stripe - Do You Like Money
Stripe - Do You Like MoneyStripe - Do You Like Money
Stripe - Do You Like MoneyDan Moore
 

More from Dan Moore (8)

Building a slackbot
Building a slackbotBuilding a slackbot
Building a slackbot
 
AWS 101
AWS 101AWS 101
AWS 101
 
Three things that surprised me when I was a new developer
Three things that surprised me when I was a new developerThree things that surprised me when I was a new developer
Three things that surprised me when I was a new developer
 
New developer talk culture foundry - 0519
New developer talk   culture foundry - 0519New developer talk   culture foundry - 0519
New developer talk culture foundry - 0519
 
Super Simple Supervised Learning - AML - Dan Moore
Super Simple Supervised Learning - AML - Dan MooreSuper Simple Supervised Learning - AML - Dan Moore
Super Simple Supervised Learning - AML - Dan Moore
 
Life at an early stage SaaS company as a technical co-founder
Life at an early stage SaaS company as a technical co-founderLife at an early stage SaaS company as a technical co-founder
Life at an early stage SaaS company as a technical co-founder
 
An Introduction to Pentaho Kettle
An Introduction to Pentaho KettleAn Introduction to Pentaho Kettle
An Introduction to Pentaho Kettle
 
Stripe - Do You Like Money
Stripe - Do You Like MoneyStripe - Do You Like Money
Stripe - Do You Like Money
 

Recently uploaded

Transformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksTransformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksJinanKordab
 
Novo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMsNovo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMsNeo4j
 
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio, Inc.
 
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...Navigation in flutter – how to add stack, tab, and drawer navigators to your ...
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...Flutter Agency
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Eraconfluent
 
Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMarkus Moeller
 
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...Lisi Hocke
 
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaUNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaNeo4j
 
GraphSummit Milan - Neo4j: The Art of the Possible with Graph
GraphSummit Milan - Neo4j: The Art of the Possible with GraphGraphSummit Milan - Neo4j: The Art of the Possible with Graph
GraphSummit Milan - Neo4j: The Art of the Possible with GraphNeo4j
 
Your Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | EvmuxYour Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | Evmuxevmux96
 
Weeding your micro service landscape.pdf
Weeding your micro service landscape.pdfWeeding your micro service landscape.pdf
Weeding your micro service landscape.pdftimtebeek1
 
Rapidoform for Modern Form Building and Insights
Rapidoform for Modern Form Building and InsightsRapidoform for Modern Form Building and Insights
Rapidoform for Modern Form Building and Insightsrapidoform
 
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...naitiksharma1124
 
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...Neo4j
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIInflectra
 
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...drm1699
 
Effective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConEffective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConNatan Silnitsky
 
GraphSummit Milan - Visione e roadmap del prodotto Neo4j
GraphSummit Milan - Visione e roadmap del prodotto Neo4jGraphSummit Milan - Visione e roadmap del prodotto Neo4j
GraphSummit Milan - Visione e roadmap del prodotto Neo4jNeo4j
 
Jax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckJax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckMarc Lester
 

Recently uploaded (20)

Transformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksTransformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with Links
 
Novo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMsNovo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMs
 
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
 
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...Navigation in flutter – how to add stack, tab, and drawer navigators to your ...
Navigation in flutter – how to add stack, tab, and drawer navigators to your ...
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdf
 
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
 
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaUNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
 
GraphSummit Milan - Neo4j: The Art of the Possible with Graph
GraphSummit Milan - Neo4j: The Art of the Possible with GraphGraphSummit Milan - Neo4j: The Art of the Possible with Graph
GraphSummit Milan - Neo4j: The Art of the Possible with Graph
 
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
 
Your Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | EvmuxYour Ultimate Web Studio for Streaming Anywhere | Evmux
Your Ultimate Web Studio for Streaming Anywhere | Evmux
 
Weeding your micro service landscape.pdf
Weeding your micro service landscape.pdfWeeding your micro service landscape.pdf
Weeding your micro service landscape.pdf
 
Rapidoform for Modern Form Building and Insights
Rapidoform for Modern Form Building and InsightsRapidoform for Modern Form Building and Insights
Rapidoform for Modern Form Building and Insights
 
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...
COMPUTER AND ITS COMPONENTS PPT.by naitik sharma Class 9th A mittal internati...
 
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...
CERVED e Neo4j su una nuvola, migrazione ed evoluzione di un grafo mission cr...
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST API
 
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
 
Effective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConEffective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeCon
 
GraphSummit Milan - Visione e roadmap del prodotto Neo4j
GraphSummit Milan - Visione e roadmap del prodotto Neo4jGraphSummit Milan - Visione e roadmap del prodotto Neo4j
GraphSummit Milan - Visione e roadmap del prodotto Neo4j
 
Jax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckJax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined Deck
 

JWTs - What PHP developers need to know - LonghornPHP.pdf