Daniele Teti 2020-04-03 11:56:14 +02:00
parent f99590f50f
commit 36ca9d43dc
8 changed files with 114 additions and 22 deletions

1
.gitignore vendored
View File

@ -96,3 +96,4 @@ unittests/serializer/jsondataobjects/Win32/CI/dunitx-results.xml
unittests/serializer/jsondataobjects/Win32/Debug/dunitx-results.xml
unittests/general/Several/Win32/CI/sqlitetest.db
unittests/general/Several/Win32/CONSOLE/sqlitetest.db
unittests/general/Several/Win32/GUI/sqlitetest.db

View File

@ -305,12 +305,16 @@ end;
- Fixed! [issue336](https://github.com/danieleteti/delphimvcframework/issues/336)
- Fixed! [issue337](https://github.com/danieleteti/delphimvcframework/issues/337)
- Fixed! [issue338](https://github.com/danieleteti/delphimvcframework/issues/338)
- Fixed! [issue345](https://github.com/danieleteti/delphimvcframework/issues/345)
- Fixed! [issue349](https://github.com/danieleteti/delphimvcframework/issues/349)
- Fixed! [issue350](https://github.com/danieleteti/delphimvcframework/issues/350)
- **Breaking Change!** In `MVCActiveRecord` attribute `MVCPrimaryKey` has been removed and merged with `MVCTableField`, so now `TMVCActiveRecordFieldOption` is a set of `foPrimaryKey`, `foAutoGenerated`, `foTransient` (check `activerecord_showcase.dproj` sample).
- **Breaking Change!** Middleware `OnAfterControllerAction` are now invoked in the same order of `OnBeforeControllerAction` (previously were invoked in reversed order).

View File

@ -74,9 +74,9 @@ object Form5: TForm5
TabOrder = 0
object btnGet: TButton
AlignWithMargins = True
Left = 171
Left = 223
Top = 4
Width = 161
Width = 154
Height = 41
Align = alLeft
Caption = 'Get a protected resource'
@ -87,18 +87,18 @@ object Form5: TForm5
AlignWithMargins = True
Left = 4
Top = 4
Width = 161
Width = 101
Height = 41
Align = alLeft
Caption = 'Login'
Caption = 'Login (mode 1)'
TabOrder = 0
OnClick = btnLOGINClick
end
object btnLoginWithException: TButton
AlignWithMargins = True
Left = 464
Left = 512
Top = 4
Width = 179
Width = 131
Height = 41
Align = alRight
Caption = 'Custom Exception in OnAuthenticate'
@ -106,6 +106,17 @@ object Form5: TForm5
WordWrap = True
OnClick = btnLoginWithExceptionClick
end
object btnLoginJsonObject: TButton
AlignWithMargins = True
Left = 111
Top = 4
Width = 106
Height = 41
Align = alLeft
Caption = 'Login (mode 2)'
TabOrder = 3
OnClick = btnLoginJsonObjectClick
end
end
object Memo3: TMemo
Left = 0

View File

@ -27,9 +27,11 @@ type
Memo3: TMemo;
Splitter2: TSplitter;
btnLoginWithException: TButton;
btnLoginJsonObject: TButton;
procedure btnGetClick(Sender: TObject);
procedure btnLOGINClick(Sender: TObject);
procedure btnLoginWithExceptionClick(Sender: TObject);
procedure btnLoginJsonObjectClick(Sender: TObject);
private
FJWT: string;
procedure SetJWT(const Value: string);
@ -139,6 +141,37 @@ begin
end;
end;
procedure TForm5.btnLoginJsonObjectClick(Sender: TObject);
var
lClient: TRESTClient;
lRest: IRESTResponse;
lJSON: TJSONObject;
begin
lClient := TRESTClient.Create('localhost', 8080);
try
lClient.ReadTimeOut(0);
lRest := lClient.doPOST('/login', [], '{"jwtusername":"user1","jwtpassword":"user1"}');
if lRest.HasError then
begin
ShowMessage(
'HTTP ERROR: ' + lRest.Error.HTTPError.ToString + sLineBreak +
'APPLICATION ERROR CODE: ' + lRest.Error.ErrorNumber.ToString + sLineBreak +
'EXCEPTION MESSAGE: ' + lRest.Error.ExceptionMessage);
Exit;
end;
lJSON := TSystemJSON.StringAsJSONObject(lRest.BodyAsString);
try
JWT := lJSON.GetValue('token').Value;
finally
lJSON.Free;
end;
finally
lClient.Free;
end;
end;
procedure TForm5.btnLoginWithExceptionClick(Sender: TObject);
var
lClient: TRESTClient;

View File

@ -3,7 +3,7 @@ object MainForm: TMainForm
Top = 0
Caption = 'JWT with LiveValidityWindow feature'
ClientHeight = 379
ClientWidth = 721
ClientWidth = 908
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
@ -16,7 +16,7 @@ object MainForm: TMainForm
object Splitter1: TSplitter
Left = 0
Top = 179
Width = 721
Width = 908
Height = 3
Cursor = crVSplit
Align = alTop
@ -26,7 +26,7 @@ object MainForm: TMainForm
object Memo1: TMemo
Left = 0
Top = 81
Width = 721
Width = 908
Height = 98
Align = alTop
Font.Charset = ANSI_CHARSET
@ -37,11 +37,12 @@ object MainForm: TMainForm
ParentFont = False
ReadOnly = True
TabOrder = 0
ExplicitWidth = 721
end
object Memo2: TMemo
Left = 0
Top = 182
Width = 721
Width = 908
Height = 197
Align = alClient
Font.Charset = ANSI_CHARSET
@ -52,19 +53,21 @@ object MainForm: TMainForm
ParentFont = False
ReadOnly = True
TabOrder = 1
ExplicitWidth = 721
end
object Panel1: TPanel
Left = 0
Top = 0
Width = 721
Width = 908
Height = 81
Align = alTop
TabOrder = 2
ExplicitWidth = 721
object Label1: TLabel
AlignWithMargins = True
Left = 417
Left = 540
Top = 4
Width = 300
Width = 364
Height = 73
Align = alClient
Caption =
@ -74,13 +77,13 @@ object MainForm: TMainForm
'alidityWindowInSeconds seconds. It is useful to mimic the classi' +
'c session cookie with the semplicity of the JWT.'
WordWrap = True
ExplicitLeft = 338
ExplicitWidth = 368
ExplicitHeight = 65
ExplicitLeft = 417
ExplicitWidth = 298
ExplicitHeight = 78
end
object btnGet: TButton
AlignWithMargins = True
Left = 250
Left = 373
Top = 4
Width = 161
Height = 73
@ -89,7 +92,7 @@ object MainForm: TMainForm
TabOrder = 0
WordWrap = True
OnClick = btnGetClick
ExplicitLeft = 171
ExplicitLeft = 250
end
object btnLOGIN: TButton
AlignWithMargins = True
@ -115,5 +118,19 @@ object MainForm: TMainForm
WordWrap = True
OnClick = btnLoginWithHeaderBasicClick
end
object Button1: TButton
AlignWithMargins = True
Left = 250
Top = 4
Width = 117
Height = 73
Align = alLeft
Caption = 'Login (with JSON Object)'
TabOrder = 3
WordWrap = True
OnClick = Button1Click
ExplicitLeft = 311
ExplicitTop = 2
end
end
end

View File

@ -17,9 +17,11 @@ type
Splitter1: TSplitter;
Label1: TLabel;
btnLoginWithHeaderBasic: TButton;
Button1: TButton;
procedure btnGetClick(Sender: TObject);
procedure btnLOGINClick(Sender: TObject);
procedure btnLoginWithHeaderBasicClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FJWT: string;
procedure SetJWT(const Value: string);
@ -35,13 +37,14 @@ implementation
{$R *.dfm}
uses
MVCFramework.RESTClient,
MVCFramework.Middleware.JWT,
MVCFramework.Serializer.JSONDataObjects,
MVCFramework.SystemJSONUtils,
System.NetEncoding,
JsonDataObjects;
JSONDataObjects;
procedure TMainForm.btnGetClick(Sender: TObject);
var
@ -129,6 +132,28 @@ begin
end;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
lClient: TRESTClient;
lRest: IRESTResponse;
lJSON: TJSONObject;
begin
lClient := TRESTClient.Create('localhost', 8080);
try
lClient.ReadTimeOut(0);
lRest := lClient.doPOST('/login', [], '{"jwtusername":"user1","jwtpassword":"user1"}');
lJSON := StrToJSONObject(lRest.BodyAsString);
try
JWT := lJSON.S['token'];
finally
lJSON.Free;
end;
finally
lClient.Free;
end;
end;
procedure TMainForm.SetJWT(const Value: string);
begin
FJWT := Value;

View File

@ -285,8 +285,8 @@ begin
// read from content
if LUsername.IsEmpty then
begin
LUsername := AContext.Request.ContentFields[FUserNameHeaderName];
LPassword := AContext.Request.ContentFields[FPasswordHeaderName];
LUsername := AContext.Request.ContentParam(FUserNameHeaderName);
LPassword := AContext.Request.ContentParam(FPasswordHeaderName);
end;
// read from json content

View File

@ -1324,7 +1324,8 @@ begin
FContentFields := TDictionary<string, string>.Create;
for I := 0 to Pred(FWebRequest.ContentFields.Count) do
begin
FContentFields.Add(LowerCase(FWebRequest.ContentFields.Names[I]), FWebRequest.ContentFields.ValueFromIndex[I]);
FContentFields.AddOrSetValue(LowerCase(FWebRequest.ContentFields.Names[I]),
FWebRequest.ContentFields.ValueFromIndex[I]);
end;
end;
Result := FContentFields;