From 731de8192d3c1fbd692242ac6a21478be5b16187 Mon Sep 17 00:00:00 2001 From: "Guilherme H. Discher" Date: Thu, 18 May 2023 10:49:47 -0300 Subject: [PATCH 1/5] =?UTF-8?q?Classe=20Base=20para=20Componentes=20de=20A?= =?UTF-8?q?utentica=C3=A7=C3=A3o=20Server=20e=20Separa=C3=A7=C3=A3o=20da?= =?UTF-8?q?=20Basic=20Auth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Mechanics/uRESTDWAuthenticators.pas | 56 +++++++++++++++++-- CORE/Source/Basic/uRESTDWBasic.pas | 43 +++++--------- 2 files changed, 65 insertions(+), 34 deletions(-) diff --git a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas index e8efad57..7497a193 100644 --- a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas +++ b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas @@ -56,15 +56,31 @@ TRESTDWAuthenticatorBase = class(TRESTDWComponent) property AuthDialog: Boolean read FAuthDialog write FAuthDialog; end; - TRESTDWAuthBasic = class(TRESTDWAuthenticatorBase) + // Classe Especifica para Autenticacao pelo Server + TRESTDWServerAuthBase = class(TRESTDWAuthenticatorBase) + private + + public + function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; + ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var AErrorCode: Integer; + var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; + end; + + TRESTDWAuthBasic = class(TRESTDWServerAuthBase) private FPassword: String; FUserName: String; FOnBasicAuth: TOnBasicAuth; + procedure PrepareBasicAuth(AAuthenticationString: String; var AAuthUsername, AAuthPassword: String); public - constructor Create(aOwner: TComponent); override; + constructor Create(AOwner: TComponent); override; destructor Destroy; override; - function ValidateAuth(aUserName, aPassword: string): boolean; + function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; + ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var AErrorCode: Integer; + var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + function ValidateAuth(AUserName, APassword: string): boolean; published property UserName: String read FUserName write FUserName; property Password: String read FPassword write FPassword; @@ -72,7 +88,7 @@ TRESTDWAuthBasic = class(TRESTDWAuthenticatorBase) property OnBasicAuth: TOnBasicAuth read FOnBasicAuth write FOnBasicAuth; end; - TRESTDWAuthToken = class(TRESTDWAuthenticatorBase) + TRESTDWAuthToken = class(TRESTDWServerAuthBase) private FBeginTime: TDateTime; FEndTime: TDateTime; @@ -127,7 +143,7 @@ TRESTDWAuthToken = class(TRESTDWAuthenticatorBase) Property OnRenewToken: TOnRenewToken Read FOnRenewToken Write FOnRenewToken; end; - TRESTDWAuthOAuth = class(TRESTDWAuthenticatorBase) + TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) private FTokenType: TRESTDWAuthOptionTypes; FAutoBuildHex: Boolean; @@ -158,6 +174,28 @@ implementation { TRESTDWAuthBasic } +function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; + var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, + AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; + var ADWParams: TRESTDWParams; var AErrorCode: Integer; + var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; +var + LAuthenticationString: String; +begin + LAuthenticationString := DecodeStrings(StringReplace(ARawHeaders.Values['Authorization'], 'Basic ', '', [rfReplaceAll]){$IFDEF RESTDWLAZARUS}, csUndefined{$ENDIF}); + + if (LAuthenticationString <> '') and ((AAuthUsername = '') and (AAuthPassword = '')) then + Self.PrepareBasicAuth(LAuthenticationString, AAuthUsername, AAuthPassword); + + if Assigned(Self.OnBasicAuth) then + Self.OnBasicAuth(AWelcomeMessage, AAccessTag, ADataRoute, AAuthUsername, + AAuthPassword, ADWParams, AErrorCode, AErrorMessage, AAcceptAuth) + else + AAcceptAuth := Self.ValidateAuth(AAuthUsername, AAuthPassword); + + Result := AAcceptAuth; +end; + constructor TRESTDWAuthBasic.Create(aOwner: TComponent); begin inherited; @@ -171,6 +209,14 @@ destructor TRESTDWAuthBasic.Destroy; inherited; end; +procedure TRESTDWAuthBasic.PrepareBasicAuth(AAuthenticationString: String; + var AAuthUsername, AAuthPassword: String); +begin + AAuthUsername := Copy(AAuthenticationString, InitStrPos, Pos(':', AAuthenticationString) -1); + Delete(AAuthenticationString, InitStrPos, Pos(':', AAuthenticationString)); + AAuthPassword := AAuthenticationString; +end; + function TRESTDWAuthBasic.ValidateAuth(aUserName, aPassword: string): boolean; begin Result := (aUserName = UserName) and (aPassword = Password) diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index 780b4320..77b7c407 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -382,7 +382,7 @@ TRESTDWServerIpVersionConfig = class(TPersistent) vForceWelcomeAccess, vCORS, vActive : Boolean; - vAuthenticator : TRESTDWAuthenticatorBase; + vAuthenticator : TRESTDWServerAuthBase; // vAuthMessages : TRESTDWAuthMessages; vProxyOptions : TProxyConnectionInfo; vServiceTimeout, @@ -553,7 +553,7 @@ TRESTDWServerIpVersionConfig = class(TPersistent) Var ErrorCode : Integer) : Boolean; Protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; - procedure SetAuthenticator(const Value: TRESTDWAuthenticatorBase); + procedure SetAuthenticator(const Value: TRESTDWServerAuthBase); Public Procedure EchoPooler (ServerMethodsClass : TComponent; AContext : TComponent; @@ -592,7 +592,7 @@ TRESTDWServerIpVersionConfig = class(TPersistent) Destructor Destroy; Override;//Destroy a Classe Published Property Active : Boolean Read vActive Write SetActive; - Property Authenticator : TRESTDWAuthenticatorBase Read vAuthenticator Write SetAuthenticator; + Property Authenticator : TRESTDWServerAuthBase Read vAuthenticator Write SetAuthenticator; // Property AuthMessages : TRESTDWAuthMessages Read vAuthMessages Write vAuthMessages; Property CORS : Boolean Read vCORS Write vCORS; Property CORS_CustomHeaders : TStringList Read vCORSCustomHeaders Write SetCORSCustomHeader; @@ -1813,13 +1813,6 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End; End; - Procedure PrepareBasicAuth(AuthenticationString : String; Var AuthUsername, AuthPassword : String); - Begin - AuthUsername := Copy(AuthenticationString, InitStrPos, Pos(':', AuthenticationString) -1); - Delete(AuthenticationString, InitStrPos, Pos(':', AuthenticationString)); - AuthPassword := AuthenticationString; - End; - Procedure WriteResponseText(aText: string; aStatusCode: integer; aContentType: string = 'application/json'); var aStreamResponse: TStream; @@ -2882,24 +2875,16 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); If vNeedAuthorization Then If vAuthenticator is TRESTDWAuthBasic Then Begin {$REGION AuthBasic} - vAuthenticationString := DecodeStrings(StringReplace(RawHeaders.Values['Authorization'], 'Basic ', '', [rfReplaceAll]){$IFDEF RESTDWLAZARUS}, vDatabaseCharSet{$ENDIF}); - If (vAuthenticationString <> '') And ((AuthUsername = '') And - (AuthPassword = '')) Then - PrepareBasicAuth(vAuthenticationString, AuthUsername, AuthPassword); - - if Assigned(TRESTDWAuthBasic(Authenticator).OnBasicAuth) then - TRESTDWAuthBasic(Authenticator).OnBasicAuth(vWelcomeMessage, - vAccessTag, - vDataRoute, - AuthUsername, - AuthPassword, - DWParams, - vErrorCode, - vErrorMessage, - vAcceptAuth) - else - vAcceptAuth := TRESTDWAuthBasic(vAuthenticator).ValidateAuth( - AuthUsername, AuthPassword); + vAuthenticator.AuthValidate(vTempServerMethods, + vNeedAuthorization, + vUrlToExec, + vWelcomeMessage, + vAccessTag, + AuthUsername, + AuthPassword, + vDataRoute, + RawHeaders, + DWParams, vErrorCode, vErrorMessage, vAcceptAuth); If Not vAcceptAuth Then Begin @@ -3384,7 +3369,7 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End; procedure TRESTServiceBase.SetAuthenticator( - const Value: TRESTDWAuthenticatorBase); + const Value: TRESTDWServerAuthBase); begin if Value <> vAuthenticator then vAuthenticator := Value; From 2863f5333a630b756a2e4617cdfe2c430c5c9842 Mon Sep 17 00:00:00 2001 From: "Guilherme H. Discher" Date: Thu, 18 May 2023 14:01:16 -0300 Subject: [PATCH 2/5] =?UTF-8?q?Valida=C3=A7=C3=A3o=20de=20Token=20direto?= =?UTF-8?q?=20pelo=20Componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Mechanics/uRESTDWAuthenticators.pas | 77 +++++++++++++++++-- CORE/Source/Basic/uRESTDWBasic.pas | 70 ++++++----------- 2 files changed, 96 insertions(+), 51 deletions(-) diff --git a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas index 7497a193..86e98af4 100644 --- a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas +++ b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas @@ -63,8 +63,8 @@ TRESTDWServerAuthBase = class(TRESTDWAuthenticatorBase) public function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var AErrorCode: Integer; - var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; + ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; end; TRESTDWAuthBasic = class(TRESTDWServerAuthBase) @@ -78,8 +78,8 @@ TRESTDWAuthBasic = class(TRESTDWServerAuthBase) destructor Destroy; override; function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var AErrorCode: Integer; - var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; function ValidateAuth(AUserName, APassword: string): boolean; published property UserName: String read FUserName write FUserName; @@ -119,6 +119,10 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) procedure FromToken(ATokenValue: String); function GetToken(ASecrets: String): String; function ValidateToken(AValue: String): Boolean; overload; + function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; + ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; published property BeginTime: TDateTime read FBeginTime write FBeginTime; property EndTime: TDateTime read FEndTime write FEndTime; @@ -172,13 +176,17 @@ TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) implementation +uses + uRESTDWDatamodule; + { TRESTDWAuthBasic } function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; - var ADWParams: TRESTDWParams; var AErrorCode: Integer; - var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; + var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; + var AAcceptAuth: Boolean): Boolean; var LAuthenticationString: String; begin @@ -242,6 +250,63 @@ procedure TRESTDWAuthToken.Assign(ASource: TPersistent); inherited Assign(ASource); end; +function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; + var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, + AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; + var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; + var AAcceptAuth: Boolean): Boolean; +var + LToken, LTokenOrig: String; + LAuthTokenParam: TRESTDWAuthToken; +begin + AErrorCode := 401; + AErrorMessage := cInvalidAuth; + ATokenValidate := True; + LTokenOrig := AToken; + + LAuthTokenParam := TRESTDWAuthToken.Create(self); + LAuthTokenParam.Assign(Self); + + if ADWParams.ItemsString[Self.Key] <> Nil then + AToken := ADWParams.ItemsString[Self.Key].AsString + else + begin + if Trim(AToken) = '' then + AToken := ARawHeaders.Values['Authorization']; + + if Trim(AToken) <> '' then + begin + LToken := GetTokenString(AToken); + + if LToken = '' then + LToken := GetBearerString(AToken); + + if LToken = '' then + LToken := LTokenOrig; + + AToken := LToken; + end; + end; + + if not LAuthTokenParam.ValidateToken(AToken) then + begin + AAcceptAuth := False; + Exit; + end + else + ATokenValidate := False; + + if Assigned(TServerMethodDatamodule(ADataModuleRESTDW).OnUserTokenAuth) then + begin + TServerMethodDatamodule(ADataModuleRESTDW).OnUserTokenAuth(AWelcomeMessage, AAccessTag, ADWParams, + TRESTDWAuthToken(LAuthTokenParam), + AErrorCode, AErrorMessage, AToken, AAcceptAuth); + + ATokenValidate := Not(AAcceptAuth); + end; +end; + procedure TRESTDWAuthToken.ClearToken; begin FSecrets := ''; diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index 77b7c407..70e3d2b6 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -1915,7 +1915,7 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); vErrorCode := 200; vIsQueryParam := False; vUrlToExec := ''; - vToken := ''; + vToken := Token; vDataBuff := ''; vRequestHeader := TStringList.Create; vCompareContext := False; @@ -2884,7 +2884,10 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); AuthPassword, vDataRoute, RawHeaders, - DWParams, vErrorCode, vErrorMessage, vAcceptAuth); + DWParams, + vTokenValidate, + vToken, + vErrorCode, vErrorMessage, vAcceptAuth); If Not vAcceptAuth Then Begin @@ -2940,7 +2943,7 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); FreeAndNil(DWParamsD); End Else - TRESTDWAuthToken(vAuthenticator).OnGetToken(vWelcomeMessage, vAccessTag, DWParamsD, + TRESTDWAuthToken(vAuthenticator).OnGetToken(vWelcomeMessage, vAccessTag, DWParams, vErrorCode, vErrorMessage, vToken, vAcceptAuth); If Not vAcceptAuth Then Begin @@ -2965,51 +2968,28 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End Else Begin - vErrorCode := 401; - vErrorMessage := cInvalidAuth; - vTokenValidate := True; - vAuthTokenParam := TRESTDWAuthToken.Create(self); - vAuthTokenParam.Assign(TRESTDWAuthToken(vAuthenticator)); - If DWParams.ItemsString[TRESTDWAuthToken(vAuthenticator).Key] <> Nil Then - vToken := DWParams.ItemsString[TRESTDWAuthToken(vAuthenticator).Key].AsString - Else - Begin - If Trim(Token) <> '' Then - vToken := Token - Else - vToken := RawHeaders.Values['Authorization']; - If Trim(vToken) <> '' Then - Begin - aToken := GetTokenString(vToken); - If aToken = '' Then - aToken := GetBearerString(vToken); - If aToken = '' Then - aToken := Token; - vToken := aToken; - End; - End; - If Not vAuthTokenParam.ValidateToken(vToken) Then - Begin + vAuthenticator.AuthValidate(vTempServerMethods, + vNeedAuthorization, + vUrlToExec, + vWelcomeMessage, + vAccessTag, + AuthUsername, + AuthPassword, + vDataRoute, + RawHeaders, + DWParams, + vTokenValidate, + vToken, + vErrorCode, vErrorMessage, vAcceptAuth); + + If Not vAcceptAuth Then + Begin + AuthRealm := cAuthRealm; WriteError; DestroyComponents; Exit; - End - Else - vTokenValidate := False; - If Assigned(TServerMethodDatamodule(vTempServerMethods).OnUserTokenAuth) Then - Begin - TServerMethodDatamodule(vTempServerMethods).OnUserTokenAuth(vWelcomeMessage, vAccessTag, DWParams, - TRESTDWAuthToken(vAuthTokenParam), - vErrorCode, vErrorMessage, vToken, vAcceptAuth); - vTokenValidate := Not(vAcceptAuth); - If Not vAcceptAuth Then - Begin - WriteError; - DestroyComponents; - Exit; - End; - End; - End; + End; + End End{$ENDREGION} Else If vAuthenticator is TRESTDWAuthOAuth Then raise Exception.Create(cErrorOAuthNotImplenented); From 67f68f4d6c6e7fa269d7a746b377651b2927a7d3 Mon Sep 17 00:00:00 2001 From: "Guilherme H. Discher" Date: Thu, 18 May 2023 15:48:20 -0300 Subject: [PATCH 3/5] =?UTF-8?q?Codigo=20da=20Autentica=C3=A7=C3=A3o=20toke?= =?UTF-8?q?n=20100%=20portado=20para=20o=20componente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Mechanics/uRESTDWAuthenticators.pas | 89 +++++++++-- CORE/Source/Basic/uRESTDWBasic.pas | 146 ++++++------------ 2 files changed, 120 insertions(+), 115 deletions(-) diff --git a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas index 86e98af4..086644ba 100644 --- a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas +++ b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas @@ -63,8 +63,8 @@ TRESTDWServerAuthBase = class(TRESTDWAuthenticatorBase) public function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; - var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; end; TRESTDWAuthBasic = class(TRESTDWServerAuthBase) @@ -78,8 +78,8 @@ TRESTDWAuthBasic = class(TRESTDWServerAuthBase) destructor Destroy; override; function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; - var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; function ValidateAuth(AUserName, APassword: string): boolean; published property UserName: String read FUserName write FUserName; @@ -112,6 +112,11 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) procedure SetToken(AValue: String); function GetTokenType(AValue: String): TRESTDWTokenType; function GetCryptType(AValue: String): TRESTDWCryptType; + procedure GenerateToken(ARequestType: TRequestType; AParams: TRESTDWParams; ARawHeaders: TStrings; + AWelcomeMessage, AAccessTag: String; + var ATokenValidate: Boolean; var AToken: String; + var AGetToken: Boolean; var AErrorCode: Integer; + var AErrorMessage: String; var AAcceptAuth: Boolean); public constructor Create(aOwner: TComponent); override; destructor Destroy; override; @@ -121,8 +126,8 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) function ValidateToken(AValue: String): Boolean; overload; function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; - var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; published property BeginTime: TDateTime read FBeginTime write FBeginTime; property EndTime: TDateTime read FEndTime write FEndTime; @@ -183,8 +188,8 @@ implementation function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, - AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; - var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; ARequestType: TRequestType; + var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; var @@ -252,14 +257,29 @@ procedure TRESTDWAuthToken.Assign(ASource: TPersistent); function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, - AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; - var ADWParams: TRESTDWParams; var ATokenValidate: Boolean; var AToken: String; + AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; ARequestType: TRequestType; + var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; var - LToken, LTokenOrig: String; + LUrlToken, LToken, LTokenOrig: String; LAuthTokenParam: TRESTDWAuthToken; begin + // Se for o Evento Get Token + LUrlToken := LowerCase(AUrlToExec); + + if Copy(LUrlToken, InitStrPos, 1) = '/' then + Delete(LUrlToken, InitStrPos, 1); + + if LUrlToken = LowerCase(Self.GetTokenEvent) then + begin + Self.GenerateToken(ARequestType, ADWParams, ARawHeaders, + AWelcomeMessage, AAccessTag, ATokenValidate, + AToken, AGetToken, AErrorCode, AErrorMessage, AAcceptAuth); + Exit; + end; + + // Se for Validar o Token AErrorCode := 401; AErrorMessage := cInvalidAuth; ATokenValidate := True; @@ -305,6 +325,8 @@ function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; ATokenValidate := Not(AAcceptAuth); end; + + Result := AAcceptAuth; end; procedure TRESTDWAuthToken.ClearToken; @@ -410,6 +432,49 @@ procedure TRESTDWAuthToken.FromToken(ATokenValue: String); end; end; +procedure TRESTDWAuthToken.GenerateToken(ARequestType: TRequestType; + AParams: TRESTDWParams; ARawHeaders: TStrings; AWelcomeMessage, AAccessTag: String; + var ATokenValidate: Boolean; var AToken: String; var AGetToken: Boolean; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean); +var + LAuthTokenParam: TRESTDWAuthToken; + LParams: TRESTDWParams; +begin + AGetToken := True; + AErrorCode := 404; + AErrorMessage := cEventNotFound; + + if (RequestTypeToRoute(ARequestType) in Self.GetTokenRoutes) or + (crAll in Self.GetTokenRoutes) then + begin + if Assigned(Self.OnGetToken) then + begin + ATokenValidate := True; + LAuthTokenParam := TRESTDWAuthToken.Create(Self); + LAuthTokenParam.Assign(Self); + + {$IFNDEF FPC} + if Trim(AToken) = '' Then + AToken := ARawHeaders.Values['Authorization']; + {$ENDIF} + + if AParams.ItemsString['RDWParams'] <> Nil then + begin + LParams := TRESTDWParams.Create; + LParams.FromJSON(AParams.ItemsString['RDWParams'].Value); + + Self.OnGetToken(AWelcomeMessage, AAccessTag, LParams, + AErrorCode, AErrorMessage, AToken, AAcceptAuth); + + FreeAndNil(LParams); + end + else + Self.OnGetToken(AWelcomeMessage, AAccessTag, AParams, + AErrorCode, AErrorMessage, AToken, AAcceptAuth); + end; + end; +end; + function TRESTDWAuthToken.GetCryptType(AValue: String): TRESTDWCryptType; begin Result := rdwAES256; @@ -443,7 +508,7 @@ function TRESTDWAuthToken.GetToken(ASecrets: String): String; finally FreeAndNil(LTokenValue); end; -End; +end; function TRESTDWAuthToken.GetTokenType(AValue: String): TRESTDWTokenType; begin diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index 70e3d2b6..6f01d968 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -2876,18 +2876,20 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); If vAuthenticator is TRESTDWAuthBasic Then Begin {$REGION AuthBasic} vAuthenticator.AuthValidate(vTempServerMethods, - vNeedAuthorization, - vUrlToExec, - vWelcomeMessage, - vAccessTag, - AuthUsername, - AuthPassword, - vDataRoute, - RawHeaders, - DWParams, - vTokenValidate, - vToken, - vErrorCode, vErrorMessage, vAcceptAuth); + vNeedAuthorization, + vUrlToExec, + vWelcomeMessage, + vAccessTag, + AuthUsername, + AuthPassword, + vDataRoute, + RawHeaders, + RequestType, + DWParams, + vGettoken, + vTokenValidate, + vToken, + vErrorCode, vErrorMessage, vAcceptAuth); If Not vAcceptAuth Then Begin @@ -2899,102 +2901,40 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); End {$ENDREGION} Else If vAuthenticator is TRESTDWAuthToken Then Begin {$REGION AuthToken} - vUrlToken := Lowercase(vUrlToExec); - If Copy(vUrlToken, InitStrPos, 1) = '/' then - Delete(vUrlToken, InitStrPos, 1); - If vUrlToken = - Lowercase(TRESTDWAuthToken(vAuthenticator).GetTokenEvent) Then - Begin - vGettoken := True; - vErrorCode := 404; - vErrorMessage := cEventNotFound; - If (RequestTypeToRoute(RequestType) In TRESTDWAuthToken(vAuthenticator).GetTokenRoutes) Or - (crAll in TRESTDWAuthToken(vAuthenticator).GetTokenRoutes) Then - Begin - If CORS Then - Begin - PCustomHeaders := @ResponseHeaders; - BuildCORS(TRESTDWAuthToken(vAuthenticator).GetTokenRoutes, TStrings(PCustomHeaders^)); - End; - if Assigned(TRESTDWAuthToken(vAuthenticator).OnGetToken) then -// If Assigned(TServerMethodDatamodule(vTempServerMethods).OnGetToken) Then - Begin - vTokenValidate := True; - vAuthTokenParam := TRESTDWAuthToken.Create(self); - vAuthTokenParam.Assign(TRESTDWAuthToken(vAuthenticator)); - {$IFNDEF FPC} - If Trim(Token) <> '' Then - vToken := Token - Else - vToken := RawHeaders.Values['Authorization']; - {$ENDIF} - If DWParams.ItemsString['RDWParams'] <> Nil Then - Begin - DWParamsD := TRESTDWParams.Create; - if vCripto.Use then - DWParamsD.FromJSON(vCripto.Decrypt(DWParams.ItemsString['RDWParams'].Value)) - else - DWParamsD.FromJSON(DWParams.ItemsString['RDWParams'].Value); - TRESTDWAuthToken(vAuthenticator).OnGetToken(vWelcomeMessage, vAccessTag, DWParamsD, - vErrorCode, vErrorMessage, vToken, vAcceptAuth); -// TServerMethodDatamodule(vTempServerMethods).OnGetToken(vWelcomeMessage, vAccessTag, DWParamsD, -// TRESTDWAuthToken(vAuthTokenParam), -// vErrorCode, vErrorMessage, vToken, vAcceptAuth); - FreeAndNil(DWParamsD); - End - Else - TRESTDWAuthToken(vAuthenticator).OnGetToken(vWelcomeMessage, vAccessTag, DWParams, - vErrorCode, vErrorMessage, vToken, vAcceptAuth); - If Not vAcceptAuth Then - Begin - WriteError; - DestroyComponents; - Exit; - End; - End - Else - Begin - WriteError; - DestroyComponents; - Exit; - End; - End - Else - Begin - WriteError; - DestroyComponents; - Exit; - End; - End - Else - Begin - vAuthenticator.AuthValidate(vTempServerMethods, - vNeedAuthorization, - vUrlToExec, - vWelcomeMessage, - vAccessTag, - AuthUsername, - AuthPassword, - vDataRoute, - RawHeaders, - DWParams, - vTokenValidate, - vToken, - vErrorCode, vErrorMessage, vAcceptAuth); - - If Not vAcceptAuth Then - Begin - AuthRealm := cAuthRealm; - WriteError; - DestroyComponents; - Exit; - End; - End + vAuthenticator.AuthValidate(vTempServerMethods, + vNeedAuthorization, + vUrlToExec, + vWelcomeMessage, + vAccessTag, + AuthUsername, + AuthPassword, + vDataRoute, + RawHeaders, + RequestType, + DWParams, + vGettoken, + vTokenValidate, + vToken, + vErrorCode, vErrorMessage, vAcceptAuth); + + If Not vAcceptAuth Then + Begin + AuthRealm := cAuthRealm; + WriteError; + DestroyComponents; + Exit; + End; End{$ENDREGION} Else If vAuthenticator is TRESTDWAuthOAuth Then raise Exception.Create(cErrorOAuthNotImplenented); vErrorCode := 200; vErrorMessage := ''; + + If vGettoken and CORS Then + Begin + PCustomHeaders := @ResponseHeaders; + BuildCORS(TRESTDWAuthToken(vAuthenticator).GetTokenRoutes, TStrings(PCustomHeaders^)); + End; End Else If Assigned(TServerMethodDatamodule(vTempServerMethods).OnWelcomeMessage) then From da4cc69d166c84f713259da41287256f74ea0d12 Mon Sep 17 00:00:00 2001 From: "Guilherme H. Discher" Date: Thu, 18 May 2023 15:56:19 -0300 Subject: [PATCH 4/5] =?UTF-8?q?OAuth=20portado=20para=20o=20Componente(Aut?= =?UTF-8?q?entica=C3=A7=C3=A3o=20n=C3=A3o=20funcional)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Mechanics/uRESTDWAuthenticators.pas | 14 ++++++ CORE/Source/Basic/uRESTDWBasic.pas | 49 +++++-------------- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas index 086644ba..52205fae 100644 --- a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas +++ b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas @@ -166,6 +166,10 @@ TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) FExpiresIn: TDateTime; public constructor Create(aOwner: TComponent); override; + function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; published property TokenType: TRESTDWAuthOptionTypes read FTokenType write FTokenType; property AutoBuildHex: Boolean read FAutoBuildHex write FAutoBuildHex; @@ -695,6 +699,16 @@ function TRESTDWAuthToken.ValidateToken(AValue: String): Boolean; { TRESTDWAuthOAuth } +function TRESTDWAuthOAuth.AuthValidate(ADataModuleRESTDW: TObject; + var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, + AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; + ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken, + ATokenValidate: Boolean; var AToken: String; var AErrorCode: Integer; + var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; +begin + raise Exception.Create(cErrorOAuthNotImplenented); +end; + constructor TRESTDWAuthOAuth.Create(aOwner: TComponent); begin inherited; diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index 6f01d968..d20ba256 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -2873,34 +2873,8 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); vNeedAuthorization := vTempEvent.NeedAuthorization; If vNeedAuthorization Then - If vAuthenticator is TRESTDWAuthBasic Then - Begin {$REGION AuthBasic} - vAuthenticator.AuthValidate(vTempServerMethods, - vNeedAuthorization, - vUrlToExec, - vWelcomeMessage, - vAccessTag, - AuthUsername, - AuthPassword, - vDataRoute, - RawHeaders, - RequestType, - DWParams, - vGettoken, - vTokenValidate, - vToken, - vErrorCode, vErrorMessage, vAcceptAuth); - - If Not vAcceptAuth Then - Begin - AuthRealm := cAuthRealm; - WriteError; - DestroyComponents; - Exit; - End; - End {$ENDREGION} - Else If vAuthenticator is TRESTDWAuthToken Then - Begin {$REGION AuthToken} + Begin + // Aqui que Valida a Autenticação vAuthenticator.AuthValidate(vTempServerMethods, vNeedAuthorization, vUrlToExec, @@ -2924,17 +2898,16 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); DestroyComponents; Exit; End; - End{$ENDREGION} - Else If vAuthenticator is TRESTDWAuthOAuth Then - raise Exception.Create(cErrorOAuthNotImplenented); - vErrorCode := 200; - vErrorMessage := ''; + End; - If vGettoken and CORS Then - Begin - PCustomHeaders := @ResponseHeaders; - BuildCORS(TRESTDWAuthToken(vAuthenticator).GetTokenRoutes, TStrings(PCustomHeaders^)); - End; + vErrorCode := 200; + vErrorMessage := ''; + + If vGettoken and CORS Then + Begin + PCustomHeaders := @ResponseHeaders; + BuildCORS(TRESTDWAuthToken(vAuthenticator).GetTokenRoutes, TStrings(PCustomHeaders^)); + End; End Else If Assigned(TServerMethodDatamodule(vTempServerMethods).OnWelcomeMessage) then From 44aea1697b285438f9314e3b32ff862096d92d10 Mon Sep 17 00:00:00 2001 From: "Guilherme H. Discher" Date: Thu, 18 May 2023 17:33:43 -0300 Subject: [PATCH 5/5] =?UTF-8?q?Remo=C3=A7=C3=A3o=20de=20Paremetros=20desne?= =?UTF-8?q?cessarios=20e=20voltar=20eventos=20ao=20DataModule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Basic/Mechanics/uRESTDWAuthenticators.pas | 155 ++++++++++-------- CORE/Source/Basic/uRESTDWBasic.pas | 2 - .../Plugins/DMDados/uRESTDWDatamodule.pas | 29 +--- 3 files changed, 91 insertions(+), 95 deletions(-) diff --git a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas index 52205fae..228e4d6f 100644 --- a/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas +++ b/CORE/Source/Basic/Mechanics/uRESTDWAuthenticators.pas @@ -29,23 +29,6 @@ interface uRESTDWTools, uRESTDWParams; type - TOnBasicAuth = Procedure(Welcomemsg, AccessTag, DataRoute, - Username, Password : String; - Var Params : TRESTDWParams; - Var ErrorCode : Integer; - Var ErrorMessage : String; - Var Accept : Boolean) Of Object; - TOnGetToken = Procedure(Welcomemsg, - AccessTag : String; - Params : TRESTDWParams; -// AuthOptions : TRESTDWAuthToken; - Var ErrorCode : Integer; - Var ErrorMessage : String; - Var TokenID : String; - Var Accept : Boolean) Of Object; - TOnRenewToken = Procedure() of Object; - - TRESTDWAuthenticatorBase = class(TRESTDWComponent) private FAuthDialog: Boolean; @@ -61,31 +44,30 @@ TRESTDWServerAuthBase = class(TRESTDWAuthenticatorBase) private public - function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; - AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; - var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; + function AuthValidate(ADataModuleRESTDW: TObject; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; + var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; virtual; abstract; end; TRESTDWAuthBasic = class(TRESTDWServerAuthBase) private FPassword: String; FUserName: String; - FOnBasicAuth: TOnBasicAuth; procedure PrepareBasicAuth(AAuthenticationString: String; var AAuthUsername, AAuthPassword: String); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; - function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; - AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; - var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + function AuthValidate(ADataModuleRESTDW: TObject; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; + var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; function ValidateAuth(AUserName, APassword: string): boolean; published property UserName: String read FUserName write FUserName; property Password: String read FPassword write FPassword; - //eventos - property OnBasicAuth: TOnBasicAuth read FOnBasicAuth write FOnBasicAuth; end; TRESTDWAuthToken = class(TRESTDWServerAuthBase) @@ -105,14 +87,13 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) FToken: String; FAutoGetToken: Boolean; FAutoRenewToken: Boolean; - FOnGetToken: TOnGetToken; - FOnRenewToken: TOnRenewToken; procedure ClearToken; procedure SetGetTokenEvent(AValue: String); procedure SetToken(AValue: String); function GetTokenType(AValue: String): TRESTDWTokenType; function GetCryptType(AValue: String): TRESTDWCryptType; - procedure GenerateToken(ARequestType: TRequestType; AParams: TRESTDWParams; ARawHeaders: TStrings; + procedure GenerateToken(ADataModuleRESTDW: TObject; ARequestType: TRequestType; + AParams: TRESTDWParams; ARawHeaders: TStrings; AWelcomeMessage, AAccessTag: String; var ATokenValidate: Boolean; var AToken: String; var AGetToken: Boolean; var AErrorCode: Integer; @@ -124,10 +105,11 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) procedure FromToken(ATokenValue: String); function GetToken(ASecrets: String): String; function ValidateToken(AValue: String): Boolean; overload; - function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; - AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; - var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + function AuthValidate(ADataModuleRESTDW: TObject; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; + var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; published property BeginTime: TDateTime read FBeginTime write FBeginTime; property EndTime: TDateTime read FEndTime write FEndTime; @@ -147,9 +129,6 @@ TRESTDWAuthToken = class(TRESTDWServerAuthBase) property Token: String read FToken write SetToken; property AutoGetToken: Boolean read FAutoGetToken write FAutoGetToken; property AutoRenewToken: Boolean read FAutoRenewToken write FAutoRenewToken; - // eventos - Property OnGetToken: TOnGetToken Read FOnGetToken Write FOnGetToken; - Property OnRenewToken: TOnRenewToken Read FOnRenewToken Write FOnRenewToken; end; TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) @@ -166,10 +145,11 @@ TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) FExpiresIn: TDateTime; public constructor Create(aOwner: TComponent); override; - function AuthValidate(ADataModuleRESTDW: TObject; var ANeedAuthorization: Boolean; - AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword, ADataRoute: String; - ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; - var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; + function AuthValidate(ADataModuleRESTDW: TObject; + AUrlToExec, AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; var ADWParams: TRESTDWParams; + var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; + var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; override; published property TokenType: TRESTDWAuthOptionTypes read FTokenType write FTokenType; property AutoBuildHex: Boolean read FAutoBuildHex write FAutoBuildHex; @@ -183,6 +163,36 @@ TRESTDWAuthOAuth = class(TRESTDWServerAuthBase) property ExpiresIn: TDateTime read FExpiresIn; end; + TOnUserBasicAuth = Procedure(Welcomemsg, AccessTag, + Username, Password : String; + Var Params : TRESTDWParams; + Var ErrorCode : Integer; + Var ErrorMessage : String; + Var Accept : Boolean) Of Object; + + TOnGetToken = Procedure(Welcomemsg, + AccessTag : String; + Params : TRESTDWParams; + AuthOptions : TRESTDWAuthToken; + Var ErrorCode : Integer; + Var ErrorMessage : String; + Var TokenID : String; + Var Accept : Boolean) Of Object; + + TOnUserTokenAuth = Procedure(Welcomemsg, + AccessTag : String; + Params : TRESTDWParams; + AuthOptions : TRESTDWAuthToken; + Var ErrorCode : Integer; + Var ErrorMessage : String; + Var TokenID : String; + Var Accept : Boolean) Of Object; + + + + TOnRenewToken = Procedure() of Object; + + implementation uses @@ -190,11 +200,11 @@ implementation { TRESTDWAuthBasic } -function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; - var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, - AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; ARequestType: TRequestType; - var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; - var AErrorCode: Integer; var AErrorMessage: String; +function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; AUrlToExec, + AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; + var ADWParams: TRESTDWParams; var AGetToken, ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; var LAuthenticationString: String; @@ -204,9 +214,9 @@ function TRESTDWAuthBasic.AuthValidate(ADataModuleRESTDW: TObject; if (LAuthenticationString <> '') and ((AAuthUsername = '') and (AAuthPassword = '')) then Self.PrepareBasicAuth(LAuthenticationString, AAuthUsername, AAuthPassword); - if Assigned(Self.OnBasicAuth) then - Self.OnBasicAuth(AWelcomeMessage, AAccessTag, ADataRoute, AAuthUsername, - AAuthPassword, ADWParams, AErrorCode, AErrorMessage, AAcceptAuth) + if Assigned(TServerMethodDataModule(ADataModuleRESTDW).OnUserBasicAuth) then + TServerMethodDataModule(ADataModuleRESTDW).OnUserBasicAuth(AWelcomeMessage, AAccessTag, AAuthUsername, + AAuthPassword, ADWParams, AErrorCode, AErrorMessage, AAcceptAuth) else AAcceptAuth := Self.ValidateAuth(AAuthUsername, AAuthPassword); @@ -259,11 +269,11 @@ procedure TRESTDWAuthToken.Assign(ASource: TPersistent); inherited Assign(ASource); end; -function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; - var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, - AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; ARequestType: TRequestType; - var ADWParams: TRESTDWParams; var AGetToken: Boolean; var ATokenValidate: Boolean; var AToken: String; - var AErrorCode: Integer; var AErrorMessage: String; +function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; AUrlToExec, + AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; + var ADWParams: TRESTDWParams; var AGetToken, ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; var LUrlToken, LToken, LTokenOrig: String; @@ -277,7 +287,7 @@ function TRESTDWAuthToken.AuthValidate(ADataModuleRESTDW: TObject; if LUrlToken = LowerCase(Self.GetTokenEvent) then begin - Self.GenerateToken(ARequestType, ADWParams, ARawHeaders, + Self.GenerateToken(ADataModuleRESTDW, ARequestType, ADWParams, ARawHeaders, AWelcomeMessage, AAccessTag, ATokenValidate, AToken, AGetToken, AErrorCode, AErrorMessage, AAcceptAuth); Exit; @@ -436,10 +446,11 @@ procedure TRESTDWAuthToken.FromToken(ATokenValue: String); end; end; -procedure TRESTDWAuthToken.GenerateToken(ARequestType: TRequestType; - AParams: TRESTDWParams; ARawHeaders: TStrings; AWelcomeMessage, AAccessTag: String; - var ATokenValidate: Boolean; var AToken: String; var AGetToken: Boolean; - var AErrorCode: Integer; var AErrorMessage: String; var AAcceptAuth: Boolean); +procedure TRESTDWAuthToken.GenerateToken(ADataModuleRESTDW: TObject; + ARequestType: TRequestType; AParams: TRESTDWParams; ARawHeaders: TStrings; + AWelcomeMessage, AAccessTag: String; var ATokenValidate: Boolean; var AToken: String; + var AGetToken: Boolean; var AErrorCode: Integer; var AErrorMessage: String; + var AAcceptAuth: Boolean); var LAuthTokenParam: TRESTDWAuthToken; LParams: TRESTDWParams; @@ -451,7 +462,7 @@ procedure TRESTDWAuthToken.GenerateToken(ARequestType: TRequestType; if (RequestTypeToRoute(ARequestType) in Self.GetTokenRoutes) or (crAll in Self.GetTokenRoutes) then begin - if Assigned(Self.OnGetToken) then + if Assigned(TServerMethodDataModule(ADataModuleRESTDW).OnGetToken) then begin ATokenValidate := True; LAuthTokenParam := TRESTDWAuthToken.Create(Self); @@ -467,14 +478,14 @@ procedure TRESTDWAuthToken.GenerateToken(ARequestType: TRequestType; LParams := TRESTDWParams.Create; LParams.FromJSON(AParams.ItemsString['RDWParams'].Value); - Self.OnGetToken(AWelcomeMessage, AAccessTag, LParams, - AErrorCode, AErrorMessage, AToken, AAcceptAuth); + TServerMethodDataModule(ADataModuleRESTDW).OnGetToken(AWelcomeMessage, AAccessTag, LParams, LAuthTokenParam, + AErrorCode, AErrorMessage, AToken, AAcceptAuth); FreeAndNil(LParams); end else - Self.OnGetToken(AWelcomeMessage, AAccessTag, AParams, - AErrorCode, AErrorMessage, AToken, AAcceptAuth); + TServerMethodDataModule(ADataModuleRESTDW).OnGetToken(AWelcomeMessage, AAccessTag, AParams, LAuthTokenParam, + AErrorCode, AErrorMessage, AToken, AAcceptAuth); end; end; end; @@ -699,13 +710,15 @@ function TRESTDWAuthToken.ValidateToken(AValue: String): Boolean; { TRESTDWAuthOAuth } -function TRESTDWAuthOAuth.AuthValidate(ADataModuleRESTDW: TObject; - var ANeedAuthorization: Boolean; AUrlToExec, AWelcomeMessage, AAccessTag, - AAuthUsername, AAuthPassword, ADataRoute: String; ARawHeaders: TStrings; - ARequestType: TRequestType; var ADWParams: TRESTDWParams; var AGetToken, - ATokenValidate: Boolean; var AToken: String; var AErrorCode: Integer; - var AErrorMessage: String; var AAcceptAuth: Boolean): Boolean; +function TRESTDWAuthOAuth.AuthValidate(ADataModuleRESTDW: TObject; AUrlToExec, + AWelcomeMessage, AAccessTag, AAuthUsername, AAuthPassword: String; + ARawHeaders: TStrings; ARequestType: TRequestType; + var ADWParams: TRESTDWParams; var AGetToken, ATokenValidate: Boolean; + var AToken: String; var AErrorCode: Integer; var AErrorMessage: String; + var AAcceptAuth: Boolean): Boolean; begin + AAcceptAuth := False; + Result := False; raise Exception.Create(cErrorOAuthNotImplenented); end; diff --git a/CORE/Source/Basic/uRESTDWBasic.pas b/CORE/Source/Basic/uRESTDWBasic.pas index d20ba256..ab7feae3 100644 --- a/CORE/Source/Basic/uRESTDWBasic.pas +++ b/CORE/Source/Basic/uRESTDWBasic.pas @@ -2876,13 +2876,11 @@ procedure TRESTClientPoolerBase.SetIpVersion(IpV: TRESTDWClientIpVersions); Begin // Aqui que Valida a Autenticação vAuthenticator.AuthValidate(vTempServerMethods, - vNeedAuthorization, vUrlToExec, vWelcomeMessage, vAccessTag, AuthUsername, AuthPassword, - vDataRoute, RawHeaders, RequestType, DWParams, diff --git a/CORE/Source/Plugins/DMDados/uRESTDWDatamodule.pas b/CORE/Source/Plugins/DMDados/uRESTDWDatamodule.pas index 1949aa1a..e14b8b6b 100644 --- a/CORE/Source/Plugins/DMDados/uRESTDWDatamodule.pas +++ b/CORE/Source/Plugins/DMDados/uRESTDWDatamodule.pas @@ -8,23 +8,8 @@ interface SysUtils, Classes, uRESTDWDataUtils, uRESTDWComponentEvents, uRESTDWBasicTypes, uRESTDWConsts, uRESTDWJSONObject, uRESTDWParams, uRESTDWAuthenticators; -Type -// TUserBasicAuth = Procedure(Welcomemsg, AccessTag, -// Username, Password : String; -// Var Params : TRESTDWParams; -// Var ErrorCode : Integer; -// Var ErrorMessage : String; -// Var Accept : Boolean) Of Object; - TUserTokenAuth = Procedure(Welcomemsg, - AccessTag : String; - Params : TRESTDWParams; - AuthOptions : TRESTDWAuthToken; - Var ErrorCode : Integer; - Var ErrorMessage : String; - Var TokenID : String; - Var Accept : Boolean) Of Object; - Type +Type TRESTDWClientInfo = Class(TObject) Private vip, @@ -56,9 +41,9 @@ interface vReplyEvent : TRESTDWReplyEvent; vWelcomeMessage : TWelcomeMessage; vMassiveProcess : TMassiveProcess; -// vUserBasicAuth : TUserBasicAuth; - vUserTokenAuth : TUserTokenAuth; -// vOnGetToken : TOnGetToken; + vUserBasicAuth : TOnUserBasicAuth; + vUserTokenAuth : TOnUserTokenAuth; + vOnGetToken : TOnGetToken; vOnMassiveBegin, vOnMassiveAfterStartTransaction, vOnMassiveAfterBeforeCommit, @@ -94,9 +79,9 @@ interface Property OnMassiveAfterBeforeCommit : TMassiveEvent Read vOnMassiveAfterBeforeCommit Write vOnMassiveAfterBeforeCommit; Property OnMassiveAfterAfterCommit : TMassiveEvent Read vOnMassiveAfterAfterCommit Write vOnMassiveAfterAfterCommit; Property OnMassiveEnd : TMassiveEvent Read vOnMassiveEnd Write vOnMassiveEnd; -// Property OnUserBasicAuth : TUserBasicAuth Read vUserBasicAuth Write vUserBasicAuth; - Property OnUserTokenAuth : TUserTokenAuth Read vUserTokenAuth Write vUserTokenAuth; -// Property OnGetToken : TOnGetToken Read vOnGetToken Write vOnGetToken; + Property OnUserBasicAuth : TOnUserBasicAuth Read vUserBasicAuth Write vUserBasicAuth; + Property OnUserTokenAuth : TOnUserTokenAuth Read vUserTokenAuth Write vUserTokenAuth; + Property OnGetToken : TOnGetToken Read vOnGetToken Write vOnGetToken; Property QueuedRequest : Boolean Read vQueuedRequest Write vQueuedRequest; End;