Skip to content

Commit d608e39

Browse files
committed
Custom claim (with consumer) validation sample code
1 parent c3dd24a commit d608e39

File tree

2 files changed

+106
-33
lines changed

2 files changed

+106
-33
lines changed

Samples/CustomClaims/Demo.Form.Main.dfm

+28-26
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ object frmMain: TfrmMain
1010
Font.Height = -11
1111
Font.Name = 'Tahoma'
1212
Font.Style = []
13-
OldCreateOrder = False
1413
DesignSize = (
1514
685
1615
530)
17-
PixelsPerInch = 96
1816
TextHeight = 13
1917
object Label1: TLabel
2018
Left = 16
@@ -93,6 +91,8 @@ object frmMain: TfrmMain
9391
Font.Style = []
9492
ParentFont = False
9593
TabOrder = 2
94+
ExplicitWidth = 653
95+
ExplicitHeight = 225
9696
end
9797
object edtIssuer: TLabeledEdit
9898
Left = 400
@@ -103,14 +103,15 @@ object frmMain: TfrmMain
103103
EditLabel.Height = 13
104104
EditLabel.Caption = 'Issuer'
105105
TabOrder = 3
106+
Text = ''
106107
end
107108
object edtIssuedAtTime: TDateTimePicker
108109
Left = 512
109110
Top = 70
110111
Width = 74
111112
Height = 21
112-
Date = 42207.710233020840000000
113-
Time = 42207.710233020840000000
113+
Date = 42207.000000000000000000
114+
Time = 0.710233020843588700
114115
Kind = dtkTime
115116
TabOrder = 4
116117
end
@@ -119,17 +120,17 @@ object frmMain: TfrmMain
119120
Top = 156
120121
Width = 106
121122
Height = 21
122-
Date = 42207.710233020840000000
123-
Time = 42207.710233020840000000
123+
Date = 42207.000000000000000000
124+
Time = 0.710233020843588700
124125
TabOrder = 5
125126
end
126127
object edtExpiresDate: TDateTimePicker
127128
Left = 400
128129
Top = 113
129130
Width = 106
130131
Height = 21
131-
Date = 42207.710233020840000000
132-
Time = 42207.710233020840000000
132+
Date = 42207.000000000000000000
133+
Time = 0.710233020843588700
133134
TabOrder = 6
134135
end
135136
object chkIssuer: TCheckBox
@@ -172,42 +173,34 @@ object frmMain: TfrmMain
172173
State = cbChecked
173174
TabOrder = 10
174175
end
175-
object Button1: TButton
176-
Left = 400
177-
Top = 234
178-
Width = 113
179-
Height = 25
180-
Caption = 'Build Custom JWS'
181-
TabOrder = 11
182-
end
183176
object edtIssuedAtDate: TDateTimePicker
184177
Left = 400
185178
Top = 70
186179
Width = 106
187180
Height = 21
188-
Date = 42207.710233020840000000
189-
Time = 42207.710233020840000000
190-
TabOrder = 12
181+
Date = 42207.000000000000000000
182+
Time = 0.710233020843588700
183+
TabOrder = 11
191184
end
192185
object edtExpiresTime: TDateTimePicker
193186
Left = 512
194187
Top = 113
195188
Width = 74
196189
Height = 21
197-
Date = 42207.710233020840000000
198-
Time = 42207.710233020840000000
190+
Date = 42207.000000000000000000
191+
Time = 0.710233020843588700
199192
Kind = dtkTime
200-
TabOrder = 13
193+
TabOrder = 12
201194
end
202195
object edtNotBeforeTime: TDateTimePicker
203196
Left = 512
204197
Top = 156
205198
Width = 74
206199
Height = 21
207-
Date = 42207.710233020840000000
208-
Time = 42207.710233020840000000
200+
Date = 42207.000000000000000000
201+
Time = 0.710233020843588700
209202
Kind = dtkTime
210-
TabOrder = 14
203+
TabOrder = 13
211204
end
212205
object cbbAlgorithm: TComboBox
213206
Left = 400
@@ -216,11 +209,20 @@ object frmMain: TfrmMain
216209
Height = 21
217210
Style = csDropDownList
218211
ItemIndex = 0
219-
TabOrder = 15
212+
TabOrder = 14
220213
Text = 'HMAC SHA256'
221214
Items.Strings = (
222215
'HMAC SHA256'
223216
'HMAC SHA384'
224217
'HMAC SHA512')
225218
end
219+
object btnCheckCustom: TButton
220+
Left = 135
221+
Top = 234
222+
Width = 121
223+
Height = 25
224+
Caption = 'Check Custom Claim'
225+
TabOrder = 15
226+
OnClick = btnCheckCustomClick
227+
end
226228
end

Samples/CustomClaims/Demo.Form.Main.pas

+78-7
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,28 @@ interface
2727
uses
2828
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
2929
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdGlobal, System.Generics.Defaults,
30-
System.Generics.Collections, Vcl.ExtCtrls, Vcl.ComCtrls,
30+
System.Generics.Collections, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Mask,
3131

3232
JOSE.Core.JWT,
3333
JOSE.Core.JWS,
3434
JOSE.Core.JWK,
3535
JOSE.Core.JWA,
36-
JOSE.Types.JSON;
36+
JOSE.Types.JSON,
37+
JOSE.Types.Bytes,
38+
JOSE.Core.Builder,
39+
JOSE.Context,
40+
JOSE.Consumer,
41+
JOSE.Consumer.Validators;
3742

3843
type
3944
TMyClaims = class(TJWTClaims)
4045
private
46+
function GetNonce: string;
47+
procedure SetNonce(const Value: string);
4148
function GetAppIssuer: string;
4249
procedure SetAppIssuer(const Value: string);
4350
public
51+
property Nonce: string read GetNonce write SetNonce;
4452
property AppIssuer: string read GetAppIssuer write SetAppIssuer;
4553
end;
4654

@@ -61,15 +69,17 @@ TfrmMain = class(TForm)
6169
chkIssuedAt: TCheckBox;
6270
chkExpires: TCheckBox;
6371
chkNotBefore: TCheckBox;
64-
Button1: TButton;
6572
edtIssuedAtDate: TDateTimePicker;
6673
edtExpiresTime: TDateTimePicker;
6774
edtNotBeforeTime: TDateTimePicker;
6875
cbbAlgorithm: TComboBox;
6976
Label6: TLabel;
77+
btnCheckCustom: TButton;
78+
procedure btnCheckCustomClick(Sender: TObject);
7079
procedure btnCustomClaimsClick(Sender: TObject);
80+
procedure Button1Click(Sender: TObject);
7181
private
72-
{ Private declarations }
82+
FCompact: TJOSEBytes;
7383
public
7484
{ Public declarations }
7585
end;
@@ -81,8 +91,7 @@ implementation
8191

8292
uses
8393
System.Rtti,
84-
JOSE.Types.Bytes,
85-
JOSE.Core.Builder;
94+
System.DateUtils;
8695

8796
{$R *.dfm}
8897

@@ -97,10 +106,13 @@ procedure TfrmMain.btnCustomClaimsClick(Sender: TObject);
97106

98107
LClaims.IssuedAt := Now;
99108
LClaims.Expiration := Now + 1;
109+
LClaims.Subject := 'paolo-rossi';
100110
LClaims.Issuer := 'WiRL REST Library';
101111
LClaims.AppIssuer :='CustomClaims';
112+
LClaims.Nonce := '9876543';
102113

103-
mmoCompact.Lines.Add(TJOSE.SHA256CompactToken('secret', LToken));
114+
FCompact := TJOSE.SHA256CompactToken('secret', LToken);
115+
mmoCompact.Lines.Add(FCompact);
104116

105117
mmoJSON.Lines.Add(TJSONUtils.ToJSON(LToken.Header.JSON));
106118
mmoJSON.Lines.Add(TJSONUtils.ToJSON(LToken.Claims.JSON));
@@ -109,16 +121,75 @@ procedure TfrmMain.btnCustomClaimsClick(Sender: TObject);
109121
end;
110122
end;
111123

124+
procedure TfrmMain.btnCheckCustomClick(Sender: TObject);
125+
var
126+
LConsumer: IJOSEConsumer;
127+
begin
128+
LConsumer := TJOSEConsumerBuilder.NewConsumer
129+
.SetClaimsClass(TMyClaims)
130+
131+
// JWS-related validation
132+
.SetVerificationKey('secret')
133+
.SetSkipVerificationKeyValidation
134+
.SetDisableRequireSignature
135+
136+
// string-based claims validation
137+
.SetExpectedSubject('paolo-rossi')
138+
139+
.RegisterValidator(
140+
function (AJOSEContext: TJOSEContext): string
141+
var
142+
LNonce: string;
143+
begin
144+
Result := '';
145+
LNonce := AJOSEContext.GetClaims<TMyClaims>.Nonce;
146+
147+
if not AJOSEContext.GetClaims.ClaimExists('nonce') then
148+
Exit('Nonce was not present');
149+
150+
if not (LNonce = '9876543') then
151+
Exit(Format('Nonce [nonce] claim value [%s] doesn''t match expected value of [%s]',
152+
[LNonce, '9876543']));
153+
end
154+
)
155+
// Build the consumer object
156+
.Build();
157+
158+
mmoCompact.Lines.Add('======================================');
159+
try
160+
LConsumer.Process(FCompact);
161+
mmoCompact.Lines.Add('Validation process passed');
162+
except
163+
on E: EInvalidJWTException do
164+
mmoCompact.Lines.Add(E.Message);
165+
end;
166+
end;
167+
168+
procedure TfrmMain.Button1Click(Sender: TObject);
169+
begin
170+
171+
end;
172+
112173
{ TMyClaims }
113174

114175
function TMyClaims.GetAppIssuer: string;
115176
begin
116177
Result := TJSONUtils.GetJSONValue('ais', FJSON).AsString;
117178
end;
118179

180+
function TMyClaims.GetNonce: string;
181+
begin
182+
Result := TJSONUtils.GetJSONValue('nonce', FJSON).AsString;
183+
end;
184+
119185
procedure TMyClaims.SetAppIssuer(const Value: string);
120186
begin
121187
TJSONUtils.SetJSONValueFrom<string>('ais', Value, FJSON);
122188
end;
123189

190+
procedure TMyClaims.SetNonce(const Value: string);
191+
begin
192+
TJSONUtils.SetJSONValueFrom<string>('nonce', Value, FJSON);
193+
end;
194+
124195
end.

0 commit comments

Comments
 (0)