Aus Sicherheitsgründen würde ich bei einem Client der delegated auth nutzt die Verwendung eines Client Secretes vermeiden (dieses sollte nur serverseitig bekannt sein) und auch einen anderen response_mode verwenden.
Hier ist ein Ausschnitt aus einer Web-Anwendung für Entra ID, die PKCE und form_post verwendet.
Bei response_mode=form_post ist das access_token nicht im Browser-Speicher auslesbar. PKCE - "Proof of Key Code Exchange" - ist eine Erweiterung des OAuth 2.0 Protokolls die gegen code interception attacks hilft.
Delphi-Quellcode:
procedure TAuthFilter.DoFilter(Context: TdjServerContext; Request: TdjRequest;
Response: TdjResponse;
const Chain: IWebFilterChain);
var
CodeVerifier:
string;
CodeChallenge:
string;
AccessToken:
string;
State:
string;
begin
AccessToken := Request.Session.Content.Values['
access_token'];
if AccessToken = '
'
then
begin
CodeVerifier := Copy(CreateGUIDString, 2, 12);
Response.Session.Content.Values['
CodeVerifier'] := CodeVerifier;
CodeChallenge := BuildCodeChallenge(CodeVerifier);
State := CreateGUIDString;
Response.Session.Content.Values['
state'] := State;
Response.Redirect(AuthorizeEndpoint
+ '
?client_id=' + ClientID
// Your app registration's Application (client) ID
+ '
&response_type=code'
// Request an auth code
+ '
&redirect_uri=' + RedirectURI
+ '
&scope=openid offline_access'
// Request offline access
+ '
&response_mode=form_post'
+ '
&state=' + State
+ '
&code_challenge=' + CodeChallenge
+ '
&code_challenge_method=S256');
end else begin
Chain.DoFilter(Context, Request, Response);
// pass
end;
end;
Der gezeigte Code ist aus der
Unit
https://github.com/michaelJustin/dar...n/MainUnit.pas